本文共 3064 字,大约阅读时间需要 10 分钟。
思维
void solve(){ cin>>n>>q; int cnt=0; for(int i=1;i<=n;i++) { cin>>a[i]; if(a[i]) cnt++; } int ob,x,k; while(q--) { cin>>ob; if(ob==1) { cin>>x; if(a[x]) cnt--; else cnt++; a[x]=1-a[x]; } else { cin>>k; if(k<=cnt) cout<<1<
思维
void solve(){ cin>>n>>X>>Y; bool nl=0,fl=0; for(int i=1;i<=n;i++) { cin>>a[i]; if(i>1) { if(a[i]!=a[i-1]) nl=1;//不是一竖排 if(abs(a[i]-a[i-1])>=2) fl=1;//已存在路径 } } if(fl) cout<<0<
暴力 差分
void solve(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i],b[i]=0;//bi表示i点被跳过的次数 ll ans=0; for(int i=1;i<=n;i++) { ans += max(a[i]-1-b[i],1LL*0); for(int j=i+2;j<=min(i+a[i],n);j++)// b[j]++; b[i+1] += max(b[i]-a[i]+1,1LL*0);//当前点多跳的次数往后传递 } cout<<<'\n';}
数论 规律
void solve(){ cin>>a>>b; if(a>b) Cno if(a==b) Cyes mem(A,0),mem(B,0); int ca=0,cb=0; while(a) { A[ca++] = a&1; a>>=1; } while(b) { B[cb++] = b&1; b>>=1; } for(int i=0;i<=30;i++) { A[i]+=A[i-1]; B[i]+=B[i-1]; if(A[i]
二分 搜索 递归
#includeusing namespace std;const int N=200005;int n,fb[N];int sz[N],fa[N],m;set e[N];void sol(int u,int f,int l)//当前节点-父节点-斐波那契序号 { //递归给每个节点赋值父节点,并将子节点权值向上传递 sz[u]=1,fa[u]=f; for(auto v:e[u]) { if(v==f) continue; sol(v,u,l); sz[u]+=sz[v]; } // if(sz[u]==fb[l]) m=u;}int dfs(int u,int l)//当前节点-斐波那契序号 { if(l<=2) return 1; // m=0; sol(u,0,l-1); if(m) { int x=fa[m]; e[m].erase(x); e[x].erase(m); int a1=dfs(m,l-1),a2=dfs(x,l-2); return a1&&a2; } // m=0; sol(u,0,l-2); if(m) { int x=fa[m]; e[m].erase(x); e[x].erase(m); int a1=dfs(m,l-2),a2=dfs(x,l-1); return a1&&a2; } return 0;}int main(){ //打表 fb[1]=fb[2]=1; for(int i=3;i<=27;i++) fb[i]=fb[i-1]+fb[i-2]; //set存图 scanf("%d",&n); for(int i=1;i
转载地址:http://dkwzz.baihongyu.com/