复健存档
怎么会有人图都不会存了
8.6
字符串(基础)√
埃氏筛/线性筛 √
void work(){ for(int i=2;i<=MX;i++){ if(!vis[i]){ pri[++cnt]=i; } for(int j=1;j<=cnt&&i*pri[j]<=MX;j++){ vis[i*pri[j]]=1; if(i%pri[j]==0)break; } } }
单向链表 √
8.7
指针
存图 √(vector咕)
最短路 √
高精 √
#include<bits/stdc++.h> using namespace std; const long long M=6227020800; char a[1000010],b[1000010]; int aa[1000010],bb[1000010]; long long mid,ans,c[1000010],d[1000010]; int lena,lenb,tag,lend; int check(long long x){ for(int i=1;i<=lenb;i++){ d[i]=(bb[i]*x+c[i-1])%10; c[i]=(bb[i]*x+c[i-1])/10; } lend=lenb; while(c[lend]){ lend++; d[lend]=c[lend-1]%10; c[lend]=c[lend-1]/10; } if(lend<lena)return 0; else if(lend>lena)return 1; else{ for(int i=lend;i>=1;i--){ if(aa[i]>d[i])return 0; else if(aa[i]<d[i])return 1; } return 2; } } void work(long long l,long long r){ if(l>r)return; if(l==r){ tag=check(l); if(tag==2||tag==0){ ans=r; } return; } mid=(l+r)/2; tag=check(mid); if(tag==2){ ans=mid; return; } else if(tag)work(l,mid-1); else ans=mid,work(mid+1,r); } int main() { scanf("%s%s",a+1,b+1); lena=strlen(a+1); lenb=strlen(b+1); // printf("%s\n%s",a+1,b+1); for(int i=1;i<=lena;i++)aa[i]=a[lena-i+1]-'0'; for(int i=1;i<=lenb;i++)bb[i]=b[lenb-i+1]-'0'; work(1,M); printf("%lld\n",ans); return 0; }
并查集(一时间居然想不起它的名字)√
8.8
贪心(这玩意不可能打勾的,永远不可能)
8.9
线段树(哼哼啊啊啊啊连线段树都忘了!)
#include<bits/stdc++.h> using namespace std; const int N=200010; int n,m; char s[N]; struct tree{ int l,r; int sum,tag; }a[N<<3]; void spread(int p){ a[p<<1].tag^=a[p].tag; a[p<<1|1].tag^=a[p].tag; if(a[p].tag)a[p<<1].sum=a[p<<1].r-a[p<<1].l+1-a[p<<1].sum; if(a[p].tag)a[p<<1|1].sum=a[p<<1|1].r-a[p<<1|1].l+1-a[p<<1|1].sum; a[p].tag=0; } void build(int p,int l,int r){ a[p].l=l,a[p].r=r; if(l==r){ a[p].sum=s[l]-'0'; return; } int mid=(l+r)>>1; build(p<<1,l,mid); build(p<<1|1,mid+1,r); a[p].sum=a[p<<1].sum+a[p<<1|1].sum; } void change(int p,int l,int r){ if(a[p].l>=l&&a[p].r<=r){ a[p].tag^=1; a[p].sum=a[p].r-a[p].l+1-a[p].sum; return; } spread(p); int mid=(a[p].l+a[p].r)>>1; if(r<=mid)change(p<<1,l,r); else if(l>mid)change(p<<1|1,l,r); else change(p<<1,l,r),change(p<<1|1,l,r); a[p].sum=a[p<<1].sum+a[p<<1|1].sum; } int ask(int p,int l,int r){ if(a[p].l>=l&&a[p].r<=r)return a[p].sum; spread(p); int mid=(a[p].l+a[p].r)>>1,ans; if(r<=mid)ans=ask(p<<1,l,r); else if(l>mid)ans=ask(p<<1|1,l,r); else ans=ask(p<<1,l,r)+ask(p<<1|1,l,r); a[p].sum=a[p<<1].sum+a[p<<1|1].sum; return ans; } int main() { scanf("%d%d",&n,&m); scanf("%s",s+1); build(1,1,n); for(int i=1,t,l,r;i<=m;i++){ scanf("%d%d%d",&t,&l,&r); if(!t){ change(1,l,r); } else{ printf("%d\n",ask(1,l,r)); } } return 0; }
背包
#include<bits/stdc++.h> using namespace std; int n,m,ans,ii,jj; int a[25][25]; struct node{ int sum,i,j,k; }d[15][20]; void work(int x,int y){ if(x==n+1)return; printf("%d %d\n",x,d[x][y].k); work(d[x][y].i,d[x][y].j); } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ scanf("%d",&a[i][j]); } } for(int i=n;i>=1;i--){ d[i][0].i=i+1; for(int j=1;j<=m;j++){ for(int k=0;k<=j;k++){ if(d[i][j].sum<d[i+1][j-k].sum+a[i][k]){ d[i][j].sum=d[i+1][j-k].sum+a[i][k]; d[i][j].i=i+1; d[i][j].j=j-k; d[i][j].k=k; } } } } // for(int i=1;i<=m;i++){ // if(ans<d[n][i].sum){ // ans=d[n][i].sum; // ii=d[n][i].i; // jj=d[n][i].j; // } // } // printf("%d\n",ans); // work(ii,jj); // printf("%d %d\n",n,d[n][m].k); printf("%d\n",d[1][m].sum); printf("%d %d\n",1,d[1][m].k); work(d[1][m].i,d[1][m].j); // printf("%d %d\n",1,d[1][m].k); return 0; } /* 3 3 30 40 50 20 30 80 20 25 30 */
8.10
组合数(n^2)
[本日运势:开门大吉,请吃汽车尾气~]