发布时间:2025-12-09 11:58:38 浏览次数:1
CF333
题意:用一种面额为 \(3^k\) 且不能整除 \(n\) 的硬币,交付超过 \(n\) 元,要求超过最少且硬币用得最多。
直接模拟即可,后面两个要求是等价的。
#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef double db;#define x first#define y second#define bg begin()#define ed end()#define pb push_back#define mp make_pair#define sz(a) int((a).size())#define R(i,n) for(int i(0);i<(n);++i)#define L(i,n) for(int i((n)-1);~i;--i)const int iinf=0x3f3f3f3f;const ll linf=0x3f3f3f3f3f3f3f3f;//Data//Mainint main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); ll n,now=1; cin>>n; while(true){ now*=3; if(n%now!=0){ cout<<(n/now)+1<<'\n'; break; } } return 0;}每行每列最多选一个,任意行列行径不可相交。
用以下方案:对于 \(\frac{n}{2}\) 前后反向。
v | |||
|---|---|---|---|
< | |||
> | |||
^ |
如果 \(n\in \rm{even}\),直接把空行空列都选上即可。
如果 \(n\in \rm{odd}\) 且中间行、列都空,答案 \(-1\)。
#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef double db;#define x first#define y second#define bg begin()#define ed end()#define pb push_back#define mp make_pair#define sz(a) int((a).size())#define R(i,n) for(int i(0);i<(n);++i)#define L(i,n) for(int i((n)-1);~i;--i)const int iinf=0x3f3f3f3f;const ll linf=0x3f3f3f3f3f3f3f3f;//Dataconst int N=1000;int n,m;bool ban[N<<1];//Mainint main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cin>>n>>m; R(i,m){ int u,v; cin>>u>>v,--u,--v; ban[u]=ban[v+n]=true; } int ns=0; R(i,n-1)if(i){ if(!ban[i]) ns++; if(!ban[i+n]) ns++; } if((n&1)&&!ban[n>>1]&&!ban[(n>>1)+n]) ns--; cout<<ns<<'\n'; return 0;}好像是什么烦人的毒瘤题,不做了。
很明显是要在二分以后判断有没有四柱。
设 \(vis_{p,q}\) 表示是否有一行 \(i\) 满足 \(a_{i,p}=a_{i,q}=1\)。
可以枚举每行,把 \(1\) 的下标丢进 vector,然后枚举 \(p,q\in\) vector:
如果 \(vis_{p,q}\) 直接 return true,否则 \(vis_{p,q}=1\)。
因为算法复杂度和 \(vis\) 数组大小线性相关,所以时间复杂度 \(\Theta(n^2\log(a))\)。
还有个 \(\Theta(n^2\log(n))\) 的:sort 完同上操作一次。
#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef double db;#define x first#define y second#define bg begin()#define ed end()#define pb push_back#define mp make_pair#define sz(a) int((a).size())#define R(i,n) for(int i(0);i<(n);++i)#define L(i,n) for(int i((n)-1);~i;--i)const int iinf=0x3f3f3f3f;const ll linf=0x3f3f3f3f3f3f3f3f;//Dataconst int N=1000;int n,m,a[N][N];//Functionsbool vis[N][N];bool check(int mid){ R(j,m)R(i,j) vis[i][j]=false; R(i,n){ vector<int> one; R(j,m)if(a[i][j]>=mid) one.pb(j); R(j,sz(one))R(i,j){ if(vis[one[i]][one[j]]) return true; vis[one[i]][one[j]]=true; } } return false;}//Mainint main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cin>>n>>m; R(i,n)R(j,m) cin>>a[i][j]; int l=-1,r=1e9+1,mid; while(r-l>1) mid=(l+r)>>1,(check(mid)?l:r)=mid; cout<<l<<'\n'; return 0;}其实是水题,脑子不好使了。
要求最小边最大的三角形。
把 \(\frac {n(n-1)}{2}\) 条边从长到短排序,直到连出三角形。
用 bitset 优化,如果当前边连的两点的 bitset 或起来以后有 \(1\) 就可以了。
有 \(1\):bitset::any()。
#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef double db;#define x first#define y second#define bg begin()#define ed end()#define pb push_back#define mp make_pair#define sz(a) int((a).size())#define R(i,n) for(int i(0);i<(n);++i)#define L(i,n) for(int i((n)-1);~i;--i)const int iinf=0x3f3f3f3f;const ll linf=0x3f3f3f3f3f3f3f3f;//Dataconst int N=3000;int n;//Geometryusing P=pair<db,db>; P p[N];db dis(const P &a,const P &b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}//Graphusing edge=pair<db,pair<int,int>>;vector<edge> et;bitset<N> ec[N];//Mainint main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cout.precision(12); cin>>n; R(i,n) cin>>p[i].x>>p[i].y; R(j,n)R(i,j) et.pb(mp(dis(p[i],p[j]),mp(i,j))); sort(et.bg,et.ed,greater<edge>()); db ans=-iinf; for(const edge &e:et){ if((ec[e.y.x]&ec[e.y.y]).any()) {ans=e.x*.5;break;} ec[e.y.x].set(e.y.y),ec[e.y.y].set(e.y.x); } assert(ans>-100); cout<<fixed<<ans<<'\n'; return 0;}