summary:57

bzoj1741:裸二分图最大匹配

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. #define qwq(x) for(edge *o=head[x];o;o=o->next)
  10. int read(){
  11. int x=0;char c=getchar();
  12. while(!isdigit(c)) c=getchar();
  13. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  14. return x;
  15. }
  16. const int nmax=1005;
  17. const int maxn=10005;
  18. struct edge{
  19. int to;edge *next;
  20. };
  21. edge es[maxn],*pt=es,*head[nmax];
  22. bool vis[nmax];int match[nmax];
  23. void add(int u,int v){
  24. pt->to=v;pt->next=head[u];head[u]=pt++;
  25. }
  26. bool dfs(int x){
  27. qwq(x) if(!vis[o->to]){
  28. vis[o->to]=1;
  29. if(!match[o->to]||dfs(match[o->to])){
  30. match[o->to]=x;return true;
  31. }
  32. }
  33. return false;
  34. }
  35. int main(){
  36. int n=read(),m=read(),u,v;
  37. rep(i,1,m) u=read(),v=read(),add(u,v+n);
  38. int ans=0;
  39. rep(i,1,n){
  40. clr(vis,0);
  41. if(dfs(i)) ans++;
  42. }
  43. printf("%d\n",ans);
  44. return 0;
  45. }

bzoj1742:dp题。我想的总是点的情况,比如到当前是那一步用步数来转移还是不行的。需要考虑的转换情况的这段区间的情况,不要局限于死思维!!! 其实跟以前做过的差不多,枚举区间的长短。为什么想不出来!!!

dp[j][0]改变了居然样例能过。。。然后就WA了。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. int read(){
  10. int x=0;char c=getchar();
  11. while(!isdigit(c)) c=getchar();
  12. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  13. return x;
  14. }
  15. const int nmax=1005;
  16. int dp[nmax][2],a[nmax];
  17. int main(){
  18. int n=read(),s=read();
  19. rep(i,1,n) a[i]=read();
  20. sort(a+1,a+n+1);
  21. rep(i,1,n) dp[i][0]=dp[i][1]=abs(s-a[i])*n;
  22. rep(i,2,n){
  23. for(int j=1;j+i-1<=n;j++){
  24. int k=j+i-1,tmp=dp[j][0];
  25. dp[j][0]=min(dp[j+1][0]+(a[j+1]-a[j])*(n-i+1),dp[j+1][1]+(a[k]-a[j])*(n-i+1));
  26. dp[j][1]=min(dp[j][1]+(a[k]-a[k-1])*(n-i+1),tmp+(a[k]-a[j])*(n-i+1));
  27. }
  28. }
  29. printf("%d\n",min(dp[1][0],dp[1][1]));
  30. return 0;
  31. }

bzoj1750:dp。。。每个点都可以转或者不转。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. const int nmax=1005;
  10. const int maxn=35;
  11. int dp[nmax][maxn],a[nmax];
  12. void maxs(int &a,int b){
  13. if(a<b) a=b;
  14. }
  15. int main(){
  16. int n,m;scanf("%d%d",&n,&m);
  17. rep(i,1,n) scanf("%d",&a[i]);
  18. rep(i,1,n){
  19. rep(j,0,i){
  20. if(j>m) break;
  21. if(j) dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+(j%2+1==a[i]);
  22. else dp[i][j]=dp[i-1][j]+(j%2+1==a[i]);
  23. }
  24. }
  25. rep(i,1,m) maxs(dp[n][i],dp[n][i-1]);
  26. printf("%d\n",dp[n][m]);
  27. return 0;
  28. }

bzoj1752:最短路。。。我。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<queue>
  6. using namespace std;
  7. #define rep(i,s,t) for(int i=s;i<=t;i++)
  8. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  9. #define clr(x,c) memset(x,c,sizeof(x))
  10. #define qwq(x) for(edge *o=head[x];o;o=o->next)
  11. int read(){
  12. int x=0;char c=getchar();
  13. while(!isdigit(c)) c=getchar();
  14. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  15. return x;
  16. }
  17. const int nmax=1005;
  18. const int maxn=100005;
  19. const int inf=0x7f7f7f7f;
  20. struct edge{
  21. int to,dist;edge *next;
  22. };
  23. edge es[maxn],*pt=es,*head[nmax];
  24. void add(int u,int v,int d){
  25. pt->to=v;pt->dist=d;pt->next=head[u];head[u]=pt++;
  26. pt->to=u;pt->dist=d;pt->next=head[v];head[v]=pt++;
  27. }
  28. int dist[nmax];
  29. struct node{
  30. int x,dist;
  31. node(int x,int dist):x(x),dist(dist){};
  32. bool operator<(const node&rhs)const{
  33. return dist>rhs.dist;}
  34. };
  35. priority_queue<node>q;
  36. void dijkstra(){
  37. clr(dist,0x7f);dist[1]=0;q.push(node(1,0));
  38. while(!q.empty()){
  39. node o=q.top();q.pop();
  40. int tx=o.x,td=o.dist;
  41. if(dist[tx]!=td) continue;
  42. qwq(tx) if(dist[o->to]>td+o->dist){
  43. dist[o->to]=td+o->dist;q.push(node(o->to,dist[o->to]));
  44. }
  45. }
  46. }
  47. int main(){
  48. int m=read(),n=read(),u,v,d;
  49. rep(i,1,m) u=read(),v=read(),d=read(),add(u,v,d);
  50. dijkstra();
  51. printf("%d\n",dist[n]);
  52. return 0;
  53. }

bzoj1753:我、、、

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. int read(){
  9. int x=0;char c=getchar();
  10. while(!isdigit(c)) c=getchar();
  11. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  12. return x;
  13. }
  14. int a[1000005];
  15. int main(){
  16. int n=read();
  17. rep(i,1,n) a[i]=read();
  18. sort(a+1,a+n+1);
  19. printf("%d\n",a[(n+1)>>1]);
  20. return 0;
  21. }

bzoj1754:高精度乘法。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. int a[45],b[45],ans[100];
  9. char s[45],t[45];
  10. int main(){
  11. scanf("%s%s",s+1,t+1);
  12. int lena=strlen(s+1),lenb=strlen(t+1),len=lena+lenb;
  13. rep(i,1,lena) a[i]=s[lena-i+1]-'0';
  14. rep(i,1,lenb) b[i]=t[lenb-i+1]-'0';
  15. rep(i,1,lena) rep(j,1,lenb){
  16. ans[i+j-1]+=a[i]*b[j];
  17. if(ans[i+j-1]>9) {
  18. ans[i+j]+=ans[i+j-1]/10;
  19. ans[i+j-1]%=10;
  20. }
  21. }
  22. if(ans[lenb+lena-1]>9) {
  23. ans[lena+lenb]=ans[lena+lenb-1]/10;
  24. ans[lena+lenb-1]%=10;
  25. len++;
  26. }
  27. while(ans[len]==0) len--;
  28. dwn(i,len,1) printf("%d",ans[i]);printf("\n");
  29. return 0;
  30. }

bzoj1755:我。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. int main(){
  8. double a,b;int n;
  9. scanf("%lf%lf%d",&a,&b,&n);
  10. a/=100;a+=1;
  11. rep(i,1,n) b*=a;
  12. int ans=(int)b;
  13. printf("%d\n",ans);
  14. return 0;
  15. }

bzoj1770:高斯消元然后爆搜自由元以前写过。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<bitset>
  6. using namespace std;
  7. #define rep(i,s,t) for(int i=s;i<=t;i++)
  8. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  9. #define clr(x,c) memset(x,c,sizeof(x))
  10. int read(){
  11. int x=0;char c=getchar();
  12. while(!isdigit(c)) c=getchar();
  13. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  14. return x;
  15. }
  16. const int nmax=40;
  17. const int inf=0x7f7f7f7f;
  18. bitset<nmax>a[nmax];
  19. void gauss(int n,int m){
  20. rep(i,1,n){
  21. int j;for(j=i;j<=n&&!a[j][i];j++)
  22. if(j<n) continue;
  23. if(j!=i) swap(a[i],a[j]);
  24. rep(j,i+1,n) if(a[j][i]) a[j]^=a[i];
  25. }
  26. }
  27. int res=inf,ans[nmax],tot=0;
  28. int n,m;
  29. void mins(int &a,int b){
  30. if(a>b) a=b;
  31. }
  32. void dfs(int x){
  33. if(tot>=res) return ;
  34. if(!x) {
  35. mins(res,tot);return ;
  36. }
  37. if(a[x][x]){
  38. int t=a[x][n+1];
  39. rep(i,x+1,n) if(a[x][i]) t^=ans[i];
  40. ans[x]=t;
  41. if(t) tot++;
  42. dfs(x-1);
  43. if(t) tot--;
  44. }else{
  45. ans[x]=0;dfs(x-1);
  46. ans[x]=1;tot++;dfs(x-1);tot--;
  47. }
  48. }
  49. int main(){
  50. n=read(),m=read();int u,v;
  51. rep(i,1,n) a[i][i]=a[i][n+1]=1;
  52. rep(i,1,m) u=read(),v=read(),a[u][v]=a[v][u]=1;
  53. gauss(n,n+1);dfs(n);
  54. printf("%d\n",res);
  55. return 0;
  56. }

洛谷3793:输出第n组勾股数。不会。。。在网上找勾股数的规律被我找到了。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(ll i=s;i<=t;i++)
  7. #define ll long long
  8. int main(){
  9. ll n;
  10. while(scanf("%lld",&n)==1){
  11. n+=2;
  12. if(n%2){
  13. printf("%lld %lld %lld\n",n,(n*n-1)/2,(n*n+1)/2);
  14. }else printf("%lld %lld %lld\n",n,(n/2)*(n/2)-1,(n/2)*(n/2)+1);
  15. }
  16. return 0;
  17. }

洛谷3832:田忌赛马。不会。。。神贪心!

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. int read(){
  10. int x=0,f=1;char c=getchar();
  11. while(!isdigit(c)) {
  12. if(c=='-') f=false;c=getchar();
  13. }
  14. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  15. return x*f;
  16. }
  17. const int nmax=5005;
  18. int a[nmax],b[nmax];
  19. int main(){
  20. int n=read();
  21. rep(i,1,n) a[i]=read();
  22. rep(i,1,n) b[i]=read();
  23. sort(a+1,a+n+1);sort(b+1,b+n+1);
  24. int l=1,s=1,r=n,t=n,ans=0;
  25. while(l<=r){
  26. if(a[l]>b[s]) ans+=200,l++,s++;
  27. else if(a[r]>b[t]) ans+=200,r--,t--;
  28. else ans+=(a[l]!=b[t])*(-200),++l,--t;
  29. }
  30. printf("%d\n",ans);
  31. return 0;
  32. }

bzoj1774:将点权排序后用floyed就好了。没有考虑重边的情况wa了一次。看清楚题!!!

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. int read(){
  10. int x=0;char c=getchar();
  11. while(!isdigit(c)) c=getchar();
  12. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  13. return x;
  14. }
  15. const int nmax=255;
  16. int dist[nmax][nmax],ans[nmax][nmax],w[nmax];
  17. struct node{
  18. int w,id;
  19. bool operator<(const node&rhs)const{
  20. return w<rhs.w;}
  21. };
  22. node ns[nmax];
  23. int main(){
  24. int n=read(),m=read(),q=read(),u,v,d;
  25. rep(i,1,n) w[i]=ns[i].w=read(),ns[i].id=i;
  26. sort(ns+1,ns+n+1);
  27. clr(dist,0x3f);clr(ans,0x3f);
  28. rep(i,1,n) dist[i][i]=ans[i][i]=0;
  29. rep(i,1,m) u=read(),v=read(),d=read(),dist[u][v]=dist[v][u]=min(dist[u][v],d);
  30. rep(tk,1,n){
  31. int k=ns[tk].id;
  32. rep(i,1,n) rep(j,1,n) {
  33. dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
  34. ans[i][j]=min(ans[i][j],dist[i][j]+max(ns[tk].w,max(w[i],w[j])));
  35. }
  36. }
  37. rep(i,1,q) u=read(),v=read(),printf("%d\n",ans[u][v]);
  38. return 0;
  39. }

bzoj1782:树链剖分O(nlogn)还是可以写的。看了一下题解可以用类似dfs序+bit解决。子树消掉+bit的经典应用。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. #define qwq(x) for(edge *o=head[x];o;o=o->next)
  10. int read(){
  11. int x=0;char c=getchar();
  12. while(!isdigit(c)) c=getchar();
  13. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  14. return x;
  15. }
  16. const int nmax=100005;
  17. const int inf=0x7fffffff;
  18. int sum[nmax<<2],n,id[nmax],ans[nmax];
  19. struct edge{
  20. int to;edge *next;
  21. };
  22. edge es[nmax<<1],*pt=es,*head[nmax];
  23. void add(int u,int v){
  24. pt->to=v;pt->next=head[u];head[u]=pt++;
  25. pt->to=u;pt->next=head[v];head[v]=pt++;
  26. }
  27. void update(int x,int w){
  28. for(int i=x;i<=n;i+=(i&-i)) sum[i]+=w;
  29. }
  30. int query(int x){
  31. int ans=0;
  32. for(int i=x;i;i-=(i&-i)) ans+=sum[i];
  33. return ans;
  34. }
  35. void dfs(int x,int fa){
  36. int t=id[x];
  37. ans[t]=query(id[x]);update(id[x],1);
  38. qwq(x) if(o->to!=fa) dfs(o->to,x);
  39. update(id[x],-1);
  40. }
  41. int main(){
  42. n=read();int u,v;
  43. rep(i,1,n-1) u=read(),v=read(),add(u,v);
  44. rep(i,1,n) u=read(),id[u]=i;
  45. dfs(1,0);
  46. rep(i,1,n) printf("%d\n",ans[i]);
  47. return 0;
  48. }

bzoj1827:树形dp。想处理子树的情况,再利用父结点处理非子树的情况就可以了。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. #define qwq(x) for(edge *o=head[x];o;o=o->next)
  10. #define ll long long
  11. int read(){
  12. int x=0;char c=getchar();
  13. while(!isdigit(c)) c=getchar();
  14. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  15. return x;
  16. }
  17. const int nmax=100005;
  18. const ll inf=1e18;
  19. ll w[nmax],size[nmax];
  20. ll f[nmax],g[nmax],n,sum=0;
  21. struct edge{
  22. int to;ll dist;edge *next;
  23. };
  24. edge es[nmax<<1],*pt=es,*head[nmax];
  25. void add(int u,int v,ll d){
  26. pt->to=v;pt->dist=d;pt->next=head[u];head[u]=pt++;
  27. pt->to=u;pt->dist=d;pt->next=head[v];head[v]=pt++;
  28. }
  29. void dfs(int x,int fa){
  30. size[x]=w[x];
  31. qwq(x) if(o->to!=fa){
  32. dfs(o->to,x);size[x]+=size[o->to];
  33. f[x]+=f[o->to]+size[o->to]*o->dist;
  34. }
  35. }
  36. void DFS(int x,int fa){
  37. qwq(x) if(o->to!=fa){
  38. g[o->to]=f[o->to]+g[x]-f[o->to]-size[o->to]*o->dist+(sum-size[o->to])*o->dist;
  39. DFS(o->to,x);
  40. }
  41. }
  42. int mins(ll &a,ll b){
  43. if(a>b) a=b;
  44. }
  45. int main(){
  46. n=read();int u,v;ll d;
  47. rep(i,1,n) w[i]=read(),sum+=w[i];
  48. rep(i,1,n-1) u=read(),v=read(),d=read(),add(u,v,d);
  49. dfs(1,0);
  50. g[1]=f[1];
  51. DFS(1,0);
  52. ll ans=inf;
  53. rep(i,1,n) mins(ans,g[i]);
  54. printf("%lld\n",ans);
  55. return 0;
  56.  
  57. }

bzoj3196:看题目肯定是二分答案。那么二分答案后贪心判断!

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. int read(){
  10. int x=0;char c=getchar();
  11. while(!isdigit(c)) c=getchar();
  12. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  13. return x;
  14. }
  15. const int nmax=505;
  16. const int inf=0x7fffffff;
  17. int map[nmax][nmax],n,m,A,B;
  18. int check(int s,int t,int x){
  19. int cur=1,sum,ans=0;bool flag;
  20. while(1){
  21. sum=0;flag=false;
  22. rep(i,cur,m){
  23. sum+=map[t][i]-map[s][i];
  24. if(sum>=x) {
  25. flag=true;ans++;cur=i+1;break;
  26. }
  27. }
  28. if(cur>m||!flag) break;
  29. }
  30. return ans;
  31. }
  32. bool pd(int x){
  33. int cur=1,ans=0;bool flag;
  34. while(1){
  35. flag=false;
  36. rep(i,cur,n) {
  37. if(check(cur-1,i,x)>=B){
  38. flag=true;ans++;cur=i+1;break;
  39. }
  40. }
  41. if(cur>n||!flag) break;
  42. }
  43. return ans>=A;
  44. }
  45. int main(){
  46. n=read(),m=read(),A=read(),B=read();
  47. rep(i,1,n) rep(j,1,m) map[i][j]=map[i-1][j]+read();
  48. int l=0,r=inf,mid,ans=0;
  49. while(l<=r){
  50. mid=(l+r)>>1;
  51. if(pd(mid)) ans=mid,l=mid+1;
  52. else r=mid-1;
  53. }
  54. printf("%d\n",ans);
  55. return 0;
  56. }

bzoj2060:树形dp

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. #define qwq(x) for(edge *o=head[x];o;o=o->next)
  10. int read(){
  11. int x=0;char c=getchar();
  12. while(!isdigit(c)) c=getchar();
  13. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  14. return x;
  15. }
  16. const int nmax=50005;
  17. const int inf=0x7f7f7f7f;
  18. int dp[nmax][2];
  19. struct edge{
  20. int to;edge *next;
  21. };
  22. edge es[nmax<<1],*pt=es,*head[nmax];
  23. void add(int u,int v){
  24. pt->to=v;pt->next=head[u];head[u]=pt++;
  25. pt->to=u;pt->next=head[v];head[v]=pt++;
  26. }
  27. void dfs(int x,int fa){
  28. dp[x][1]=1;
  29. qwq(x) if(o->to!=fa){
  30. int to=o->to;dfs(to,x);
  31. dp[x][0]+=max(dp[to][0],dp[to][1]);
  32. dp[x][1]+=dp[to][0];
  33. }
  34. }
  35. int main(){
  36. int n=read(),u,v;
  37. rep(i,1,n-1) u=read(),v=read(),add(u,v);
  38. dfs(1,0);
  39. printf("%d\n",max(dp[1][1],dp[1][0]));
  40. return 0;
  41. }

bzoj2274:dp.f[i]+=f[j],sum[i]-sum[j]>=0;O(n2) orz又跪了 =>加树状数组搞一下就行了!!!(对bit有点了解了。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. int read(){
  10. int x=0,f=1;char c=getchar();
  11. while(!isdigit(c)) {
  12. if(c=='-') f=-1;c=getchar();
  13. }
  14. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  15. return x*f;
  16. }
  17. const int nmax=100005;
  18. const int mod=1000000009;
  19. int a[nmax],b[nmax],sum[nmax<<2],dp[nmax],n,N;
  20. int query(int x){
  21. int ans=0;
  22. for(int i=x;i;i-=(i&-i)) {
  23. ans=(ans+sum[i])%mod;
  24. }
  25. return ans;
  26. }
  27. void insert(int x,int w){
  28. for(int i=x;i<=N;i+=(i&-i)) sum[i]=(sum[i]+w)%mod;
  29. }
  30. int main(){
  31. n=read();int u;
  32. rep(i,1,n) u=read(),b[i]=b[i-1]+u,a[i]=b[i];
  33. b[0]=0;sort(b,b+n+1);
  34. N=unique(b,b+n+1)-b;
  35.  
  36. u=lower_bound(b,b+N,0)-b;
  37. insert(++u,1);
  38. rep(i,1,n) {
  39. u=lower_bound(b,b+N,a[i])-b;
  40. dp[i]=query(++u);
  41. insert(u,dp[i]);
  42. }
  43. printf("%d\n",dp[n]);
  44. return 0;
  45. }
  46. /*
  47. 5 -1 -1 -1 -1 -1*/

bzoj2442:开始的时候想了贪心无解。。然后dp!。嘛o(nk)的还是很容易的。。。学到了单调队列优化dp。。而且连dp[i][0],dp[i][1]都可以省略了。用了fread果然快了挺多的。。。好神啊啊啊 ps:滑块不就用单调队列么2333

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;++i)
  7. #define dwn(i,s,t) for(int i=s;i>=t;--i)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. #define ll long long
  10. char buf[1000005],*ptr=buf-1;
  11. ll read(){
  12. ll x=0;char c=*++ptr;
  13. while(!isdigit(c)) c=*++ptr;
  14. while(isdigit(c)) x=x*10+c-'0',c=*++ptr;
  15. return x;
  16. }
  17. const int nmax=100005;
  18. ll dp[nmax],sum[nmax],q[nmax];
  19. int main(){
  20. fread(buf,1,1000000,stdin);
  21. ll n=read(),k=read();
  22. rep(i,1,n) sum[i]=sum[i-1]+read();
  23. int l=1,r=1;
  24. rep(i,1,n){
  25. while(l<=r&&q[l]<i-k) ++l;
  26. if(i<=k) dp[i]=sum[i];
  27. else dp[i]=dp[q[l]-1]+sum[i]-sum[q[l]];
  28. while(l<=r&&dp[q[r]-1]-sum[q[r]]<dp[i-1]-sum[i]) --r;
  29. q[++r]=i;
  30. }
  31. printf("%lld\n",dp[n]);
  32. return 0;
  33. }

bzoj2591:嘛是树形dp嘛。。。不过居然写了很久!!!没有将细节考虑清楚前不要写!写到一半发现有误停下来全部想清楚再写!!!不要这个改一下那个改一下!!! 哦树形dp还是先处理子树的情况然后再有父结点弄出非子树的情况。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. #define qwq(x) for(edge *o=head[x];o;o=o->next)
  10. int read(){
  11. int x=0;char c=getchar();
  12. while(!isdigit(c)) c=getchar();
  13. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  14. return x;
  15. }
  16. const int nmax=100005;
  17. const int inf=0x7f7f7f7f;
  18. int f[nmax][25],g[nmax][25],w[nmax],n,K;
  19. struct edge{
  20. int to;edge *next;
  21. };
  22. edge es[nmax<<1],*pt=es,*head[nmax];
  23. void add(int u,int v){
  24. pt->to=v;pt->next=head[u];head[u]=pt++;
  25. pt->to=u;pt->next=head[v];head[v]=pt++;
  26. }
  27. void dfs(int x,int fa){
  28. f[x][0]=w[x];
  29. qwq(x) if(o->to!=fa){
  30. dfs(o->to,x);
  31. rep(i,1,K) f[x][i]+=f[o->to][i-1];
  32. }
  33. }
  34. void DFS(int x,int fa){
  35. g[x][0]=w[x];g[x][1]=f[x][1]+w[fa];
  36. rep(i,2,K) g[x][i]=f[x][i]+g[fa][i-1]-f[x][i-2];
  37. qwq(x) if(o->to!=fa) DFS(o->to,x);
  38. }
  39. int main(){
  40. n=read(),K=read();int u,v;
  41. rep(i,1,n-1) u=read(),v=read(),add(u,v);
  42. rep(i,1,n) w[i]=read();
  43. dfs(1,0);
  44. rep(i,0,K) g[1][i]=f[1][i];
  45. qwq(1) DFS(o->to,1);
  46. rep(i,1,n) {
  47. rep(j,0,K) g[i][j]+=g[i][j-1];
  48. printf("%d\n",g[i][K]);
  49. }
  50. return 0;
  51. }

bzoj3050:测了自己手造数据就直接交了。output limited error。。。注意注意注意中间输出要删掉中间输出要删掉中间输出要删掉!而且最好肉眼看一下有没有写错QAQ。 还有还有还有!有时候编译器会出现诡异错误按f9的时候直接整个程序就没了!所以我们要先保存好文件再开始写!

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. #define lson l,mid,x<<1
  10. #define rson mid+1,r,x<<1|1
  11. int read(){
  12. int x=0;char c=getchar();
  13. while(!isdigit(c)) c=getchar();
  14. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  15. return x;
  16. }
  17. const int nmax=2000005;
  18. const int inf=0x7f7f7f7f;
  19. int lmax[nmax],omax[nmax],rmax[nmax],col[nmax];
  20. char s[5];
  21. int n;
  22. void build(int l,int r,int x){
  23. lmax[x]=rmax[x]=omax[x]=r-l+1;col[x]=-1;
  24. if(l==r) return ;
  25. int mid=(l+r)>>1;build(lson);build(rson);
  26. }
  27. void pushdown(int x,int cnt){
  28. if(col[x]!=-1){
  29. col[x<<1]=col[x<<1|1]=col[x];
  30. lmax[x<<1]=rmax[x<<1]=omax[x<<1]=col[x]?0:cnt-(cnt>>1);
  31. lmax[x<<1|1]=rmax[x<<1|1]=omax[x<<1|1]=col[x]?0:cnt>>1;
  32. col[x]=-1;
  33. }
  34. }
  35. void pushup(int x,int cnt){
  36. lmax[x]=lmax[x<<1]==cnt-(cnt>>1)?lmax[x<<1]+lmax[x<<1|1]:lmax[x<<1];
  37. rmax[x]=rmax[x<<1|1]==(cnt>>1)?rmax[x<<1|1]+rmax[x<<1]:rmax[x<<1|1];
  38. omax[x]=max(rmax[x<<1]+lmax[x<<1|1],max(omax[x<<1],omax[x<<1|1]));
  39. }
  40. int query(int p,int l,int r,int x){
  41. if(r-l+1==p) return l;
  42. pushdown(x,r-l+1);
  43. int mid=(l+r)>>1;
  44. if(omax[x<<1]>=p) return query(p,lson);
  45. if(rmax[x<<1]+lmax[x<<1|1]>=p) return mid-rmax[x<<1]+1;
  46. return query(p,rson);
  47. }
  48. void update(int tl,int tr,int p,int l,int r,int x){
  49. if(tl<=l&&tr>=r){
  50. col[x]=p;
  51. lmax[x]=rmax[x]=omax[x]=p?0:r-l+1;
  52. return ;
  53. }
  54. pushdown(x,r-l+1);
  55. int mid=(l+r)>>1;
  56. if(tl<=mid) update(tl,tr,p,lson);
  57. if(tr>mid) update(tl,tr,p,rson);
  58. pushup(x,r-l+1);
  59. }
  60. int main(){
  61. n=read();int m=read(),u,v,ans=0;
  62. build(1,n,1);
  63. rep(i,1,m) {
  64. scanf("%s",s);
  65. if(s[0]=='A'){
  66. u=read();
  67. if(omax[1]<u) ans++;
  68. else {
  69. v=query(u,1,n,1);
  70. update(v,v+u-1,1,1,n,1);
  71. }
  72. }else{
  73. u=read(),v=read();
  74. update(u,v,0,1,n,1);
  75. }
  76. }
  77. printf("%d\n",ans);
  78. return 0;
  79. }

bzoj3407:背包dp。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. int read(){
  10. int x=0;char c=getchar();
  11. while(!isdigit(c)) c=getchar();
  12. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  13. return x;
  14. }
  15. int a[505],f[45005];
  16. int main(){
  17. int m=read(),n=read();
  18. rep(i,1,n) a[i]=read();
  19. f[0]=1;
  20. rep(i,1,n) dwn(j,m,a[i]) f[j]|=f[j-a[i]];
  21. dwn(i,m,0) if(f[i]){
  22. printf("%d\n",i);return 0;
  23. }
  24. return 0;
  25. }

bzoj3445:删掉的肯定是最短路中的边。。。枚举一下就好了。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<queue>
  6. using namespace std;
  7. #define rep(i,s,t) for(int i=s;i<=t;i++)
  8. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  9. #define clr(x,c) memset(x,c,sizeof(x))
  10. #define qwq(x) for(edge *o=head[x];o;o=o->next)
  11. int read(){
  12. int x=0;char c=getchar();
  13. while(!isdigit(c)) c=getchar();
  14. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  15. return x;
  16. }
  17. const int nmax=255;
  18. const int maxn=250005;
  19. struct edge{
  20. int to,dist,id;edge *next;
  21. };
  22. edge es[maxn<<1],*pt=es,*head[nmax];
  23. int n,m,dist[nmax],pre[nmax],fa[nmax];
  24. void add(int u,int v,int d,int id){
  25. pt->to=v;pt->dist=d;pt->id=id;pt->next=head[u];head[u]=pt++;
  26. pt->to=u;pt->dist=d;pt->id=id;pt->next=head[v];head[v]=pt++;
  27. }
  28. struct node{
  29. int x,dist;
  30. node(int x,int dist):x(x),dist(dist){};
  31. node(){};
  32. bool operator<(const node&rhs)const{
  33. return dist>rhs.dist;}
  34. };
  35. priority_queue<node>q;
  36. void maxs(int &a,int b){
  37. if(a<b) a=b;
  38. }
  39. void dijkstra(){
  40. clr(dist,0x7f);dist[1]=0;q.push(node(1,0));
  41. node o;int tx,td;
  42. while(!q.empty()){
  43. o=q.top();q.pop();
  44. tx=o.x;td=o.dist;
  45. if(dist[tx]!=td) continue;
  46. qwq(tx) if(dist[o->to]>td+o->dist){
  47. dist[o->to]=td+o->dist;pre[o->to]=tx;fa[o->to]=o->id;
  48. q.push(node(o->to,dist[o->to]));
  49. }
  50. }
  51. }
  52. void DIJKSTRA(){
  53. clr(dist,0x7f);dist[1]=0;q.push(node(1,0));
  54. node o;int tx,td;
  55. while(!q.empty()){
  56. o=q.top();q.pop();
  57. tx=o.x;td=o.dist;
  58. if(dist[tx]!=td) continue;
  59. qwq(tx) if(dist[o->to]>td+o->dist){
  60. dist[o->to]=td+o->dist;
  61. q.push(node(o->to,dist[o->to]));
  62. }
  63. }
  64. }
  65. int main(){
  66. n=read(),m=read();
  67. int u,v,d,tmp,temp;
  68. rep(i,1,m) u=read(),v=read(),d=read(),add(u,v,d,i);
  69. dijkstra();tmp=dist[n];
  70. for(int i=n;i!=1;i=pre[i]) {
  71. u=pre[i];
  72. qwq(u) if(o->id==fa[i]) o->dist<<=1;
  73. qwq(i) if(o->id==fa[i]) o->dist<<=1;
  74. DIJKSTRA();maxs(temp,dist[n]);
  75. qwq(u) if(o->id==fa[i]) o->dist>>=1;
  76. qwq(i) if(o->id==fa[i]) o->dist>>=1;
  77. }
  78. printf("%d\n",temp-tmp);
  79. return 0;
  80. }

bzoj3048:二分答案然后判断?k(n-k)最坏的情况下50000*50000. 嗯还是有暴力分的。sad又跪了=> 用类似单调队列的方法扫一遍就好了。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. int read(){
  10. int x=0;char c=getchar();
  11. while(!isdigit(c)) c=getchar();
  12. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  13. return x;
  14. }
  15. const int nmax=100005;
  16. int a[nmax],b[nmax],cnt[nmax];
  17. bool vis[nmax];
  18. void maxs(int &a,int b){
  19. if(a<b) a=b;
  20. }
  21. int main(){
  22. int n=read(),k=read();
  23. rep(i,1,n) a[i]=b[i]=read();
  24. sort(b+1,b+n+1);
  25. int m=unique(b+1,b+n+1)-b;
  26. rep(i,1,n) a[i]=lower_bound(b+1,b+m+1,a[i])-b;
  27. int l=1,r=1,sum=0,ans=1;clr(vis,0);
  28. while(r<=n){
  29. while(vis[a[r]]||(!vis[a[r]])&&sum<k+1){
  30. if(vis[a[r]]) maxs(ans,++cnt[a[r]]);
  31. else vis[a[r]]=1,++cnt[a[r]],sum++;
  32. if(++r>n) break;
  33. }
  34. if(!(--cnt[a[l]])) sum--,vis[a[l]]=0;
  35. l++;
  36. }
  37. printf("%d\n",ans);
  38. return 0;
  39. }

❤bzoj1685:不懂系列!

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. int read(){
  10. int x=0;char c=getchar();
  11. while(!isdigit(c)) c=getchar();
  12. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  13. return x;
  14. }
  15. const int nmax=25;
  16. struct node{
  17. int w,b;
  18. bool operator<(const node&rhs)const{
  19. return w<rhs.w;}
  20. };
  21. node ns[nmax];
  22. int main(){
  23. int n=read(),m=read();
  24. rep(i,1,n) ns[i].w=read(),ns[i].b=read();
  25. sort(ns+1,ns+n+1);
  26. int ans=0,t,temp;
  27. while(1){
  28. temp=m;
  29. dwn(i,n,1) {
  30. t=min(temp/ns[i].w,ns[i].b);
  31. temp-=t*ns[i].w;
  32. ns[i].b-=t;
  33. }
  34. rep(i,1,n) if(ns[i].b>0&&temp>0){
  35. ns[i].b--;
  36. temp-=ns[i].w;
  37. }//没办法了就扔多一个硬币给他,注意一个硬币就好了。
  38. if(temp<=0) ans++;
  39. else break;
  40. }
  41. printf("%d\n",ans);
  42. return 0;
  43. }

bzoj1680:。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. #define ll long long
  10. int read(){
  11. int x=0;char c=getchar();
  12. while(!isdigit(c)) c=getchar();
  13. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  14. return x;
  15. }
  16. const int nmax=10005;
  17. const int inf=0x7f7f7f7f;
  18. struct node{
  19. int w,nd;
  20. };
  21. node ns[nmax];
  22. void mins(int &a,int b){
  23. if(a>b) a=b;
  24. }
  25. int main(){
  26. int n=read(),s=read();
  27. rep(i,1,n) ns[i].w=read(),ns[i].nd=read();
  28. ll ans=0;int nmin=inf;
  29. rep(i,1,n){
  30. mins(nmin,ns[i].w);
  31. ans+=ns[i].nd*nmin;
  32. nmin+=s;
  33. }
  34. printf("%lld\n",ans);
  35. return 0;
  36. }

bzoj1676:差分序列就好了。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define clr(x,c) memset(x,c,sizeof(x))
  8. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  9. int read(){
  10. int x=0;char c=getchar();
  11. while(!isdigit(c)) c=getchar();
  12. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  13. return x;
  14. }
  15. const int nmax=2005;
  16. int a[nmax];
  17. void maxs(int &a,int b){
  18. if(a<b) a=b;
  19. }
  20. int main(){
  21. int n=read(),fa=read(),fb=read(),D=read(),lft=fa-fb,u,v,d,tmp=0,temp=0;
  22. rep(i,1,n) {
  23. u=read(),v=read();
  24. a[v]++,a[u-1]--,maxs(tmp,v);
  25. }
  26. dwn(i,tmp,1){
  27. temp+=a[i];
  28. if(i<=D) lft-=temp;
  29. if(!lft) {
  30. printf("%d\n",i);break;
  31. }
  32. }
  33. return 0;
  34. }

bzoj1675:搜索+hash判重!

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. const int nmax=100005;
  10. const int mod=100007;
  11. int head[mod],next[nmax],a[nmax],ans=0;
  12. char map[6][6];bool vis[6][6];
  13. int xx[5]={0,0,0,1,-1};
  14. int yy[5]={0,1,-1,0,0};
  15. void print(int x){
  16. rep(i,1,5){
  17. rep(j,1,5) printf("%d",x&1),x>>=1;printf("\n");
  18. }
  19. }
  20. void dfs(int x,int y,int hn,int jn,int pre){
  21. if(map[x][y]=='H') hn++;else jn++;
  22. if(hn>3) return ;
  23. pre+=(1<<((x-1)*5+y-1));
  24. int tmp=pre%mod;bool f=true;
  25. for(int i=head[tmp];i;i=next[i]) if(a[i]==pre) f=false;
  26. if(f) {
  27. a[++a[0]]=pre;next[a[0]]=head[tmp];head[tmp]=a[0];
  28. }
  29. else return ;
  30. if(hn+jn==7) ans++;
  31. else{
  32. vis[x][y]=1;
  33. int tx,ty;
  34. rep(i,1,5) rep(j,1,5) if(vis[i][j])
  35. rep(k,1,4) {
  36. tx=i+xx[k];ty=j+yy[k];
  37. if(tx<1||ty<1||tx>5||ty>5||vis[tx][ty]) continue;
  38. dfs(tx,ty,hn,jn,pre);
  39. }
  40. vis[x][y]=0;
  41. }
  42. }
  43. int main(){
  44. rep(i,1,5) scanf("%s",map[i]+1);
  45. rep(i,1,5) rep(j,1,5) dfs(i,j,0,0,0);
  46. printf("%d\n",ans);
  47. return 0;
  48. }

bzoj1674:bfs。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. #define qwq(x) for(edge *o=head[x];o;o=o->next)
  10. int read(){
  11. int x=0;char c=getchar();
  12. while(!isdigit(c)) c=getchar();
  13. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  14. return x;
  15. }
  16. const int nmax=1005;
  17. const int maxn=50005;
  18. const int inf=0x7f7f7f7f;
  19.  
  20. struct edge{
  21. int to;edge *next;
  22. };
  23. edge edges[maxn],*pt=edges,*head[nmax];
  24. void add(int u,int v){
  25. pt->to=v;pt->next=head[u];head[u]=pt++;
  26. }
  27.  
  28. int q[nmax],dist[nmax];
  29. int main(){
  30. int N=read(),T=read(),u,v;
  31. rep(i,1,N) {
  32. u=read(),v=read();
  33. add(u,v);
  34. }
  35. int l=1,r=1;q[1]=1;
  36. while(l<=r){
  37. u=q[l];l++;
  38. qwq(u) if(!dist[o->to]){
  39. dist[o->to]=dist[u]+1;
  40. q[++r]=o->to;
  41. if(o->to==T) {
  42. printf("%d\n",dist[o->to]+1);
  43. return 0;
  44. }
  45. }
  46. }
  47. printf("-1\n");
  48. return 0;
  49. }

洛谷3936:挖坑。。。这道题我只写了三十分,mle了而且不mle的话也应该是50分的啊。。。我用hash判重+dp。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. #define ll unsigned long long
  10. const int nmax=1001;
  11. ll pre[nmax][nmax],suf[nmax][nmax],a[nmax];
  12. bool dp[nmax][nmax];
  13. char s[nmax];
  14. int main(){
  15. scanf("%s",s+1);
  16. int len=strlen(s+1);
  17. rep(i,1,len) a[i]=s[i]-'a'+1;
  18. rep(i,1,len) {
  19. pre[i][i]=a[i];
  20. rep(j,i+1,len) pre[i][j]=pre[i][j-1]*26+a[j];
  21. }
  22. dwn(i,len,1){
  23. suf[i][i]=a[i];
  24. dwn(j,i-1,1) suf[j][i]=suf[j+1][i]*26+a[j];
  25. }
  26. rep(i,1,len) dp[i][i]=1,dp[i][i+1]=a[i]==a[i+1]?1:0;
  27. rep(i,2,len-1) rep(j,1,len-i) {
  28. int tmp=i/2;
  29. if(i%2==0) tmp--;
  30. if(pre[j][j+tmp]==suf[j+i-tmp][j+i]) dp[j][j+i]=1;
  31. }
  32. int cur=1,ans=0;
  33. while(cur<=len){
  34. dwn(i,len,cur) if(dp[cur][i]) {
  35. ans++;cur=i+1;
  36. break;
  37. }
  38. if(cur>len) break;
  39. }
  40. printf("%d\n",ans);
  41. return 0;
  42. }

洛谷3868:康托展开就好了

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(ll i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(ll i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. #define ll long long
  10. ll read(){
  11. ll x=0;char c=getchar();
  12. while(!isdigit(c)) c=getchar();
  13. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  14. return x;
  15. }
  16. const int nmax=105;
  17. const ll mod=1000000007;
  18. ll a[nmax];
  19. bool vis[nmax];
  20. int main(){
  21. ll n=read(),u,v,d,tmp,temp;
  22. a[0]=1;
  23. rep(i,1,n) a[i]=(a[i-1]*i)%mod;
  24. ll ans=1;
  25. rep(i,1,n) {
  26. u=read();v=0;
  27. rep(j,1,u-1) if(!vis[j]) v++;
  28. vis[u]=1;
  29. ans=(ans+(v*a[n-i])%mod)%mod;
  30. }
  31. printf("%lld\n",ans);
  32. return 0;
  33. }

bzoj2018:这

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(ll i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(ll i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. #define ll long long
  10. ll read(){
  11. ll x=0;char c=getchar();
  12. while(!isdigit(c)) c=getchar();
  13. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  14. return x;
  15. }
  16. const int nmax=1500005;
  17. struct node{
  18. ll w,u;
  19. bool operator<(const node&rhs)const{
  20. return u>rhs.u||u==rhs.u&&w<rhs.w;}
  21. };
  22. node ns[nmax];
  23. int main(){
  24. ll n=read(),a=read(),b=read(),c=read(),d=read(),e=read(),f=read(),g=read(),h=read(),m=read(),tmp,temp;
  25. rep(i,0,n*3-1) {
  26. tmp=(i*i)%d;
  27. ns[i].w=((a*i%d)*(tmp*tmp%d)%d+b*tmp%d+c)%d;
  28. tmp=(i*i)%h;
  29. ns[i].u=((e*i%h)*(tmp*tmp%h)%h+(f*tmp%h)*i%h+g)%h;
  30. }
  31. sort(ns,ns+n*3);
  32. ll ans=0;
  33. rep(i,0,n-1) ans=(ans+ns[i].w)%m;
  34. printf("%lld\n",ans);
  35. return 0;
  36. }

❤bzoj3890:拓扑图上的dp。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<bitset>
  6. using namespace std;
  7. #define rep(i,s,t) for(int i=s;i<=t;i++)
  8. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  9. #define clr(x,c) memset(x,c,sizeof(x))
  10. #define qwq(x) for(edge *o=head[x];o;o=o->next)
  11. int read(){
  12. int x=0;char c=getchar();
  13. while(!isdigit(c)) c=getchar();
  14. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  15. return x;
  16. }
  17. const int nmax=105;
  18. const int maxn=10005;
  19. bitset<maxn>f[nmax],g[nmax];
  20. struct edge{
  21. int to,da,db;edge *next;
  22. };
  23. edge es[maxn],*pt=es,*head[nmax];
  24. int in[nmax],q[nmax];
  25. void add(int u,int v,int d,int w){
  26. pt->to=v;pt->da=d;pt->db=w;pt->next=head[u];head[u]=pt++;
  27. }
  28. int main(){
  29. int n=read(),m=read(),u,v,d,w,tmp,temp;
  30. rep(i,1,m) u=read(),v=read(),d=read(),w=read(),add(u,v,d,w),in[v]++;
  31. int l=1,r=0;
  32. rep(i,1,n) if(!in[i]) q[++r]=i;
  33. f[1][0]=g[1][0]=1;
  34. while(l<=r){
  35. u=q[l++];
  36. qwq(u) {
  37. f[o->to]|=f[u]<<o->da;
  38. g[o->to]|=g[u]<<o->db;
  39. if(!--in[o->to]) q[++r]=o->to;
  40. }
  41. }
  42. rep(i,0,10000) if(f[n][i]&&g[n][i]){
  43. printf("%d\n",i);return 0;
  44. }
  45. printf("IMPOSSIBLE\n");
  46. return 0;
  47. }

bzoj3480:先背包dp预处理后递推就好了

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. int read(){
  10. int x=0;char c=getchar();
  11. while(!isdigit(c)) c=getchar();
  12. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  13. return x;
  14. }
  15. const int nmax=105;
  16. const int maxn=100005;
  17. const int inf=0x7f7f7f7f;
  18. int a[nmax],dp[maxn];
  19. void mins(int &a,int b){
  20. if(a>b) a=b;
  21. }
  22. int main(){
  23. int n=read(),m=read();
  24. rep(i,1,m) a[i]=read();
  25. clr(dp,0x7f);dp[0]=0;
  26. rep(i,1,n) rep(j,a[i],100000) mins(dp[j],dp[j-a[i]]+1);
  27.  
  28. rep(i,1,n) a[i]=read();
  29. int cur=1;
  30. while(!a[cur]&&cur<=n) cur++;
  31. int ans=dp[a[cur]];
  32. rep(i,cur+1,n) ans+=dp[a[i]+1-a[i-1]];
  33. printf("%d\n",ans);
  34. return 0;
  35. }

bzoj3394:floyed一下就好了。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. int read(){
  10. int x=0;char c=getchar();
  11. while(!isdigit(c)) c=getchar();
  12. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  13. return x;
  14. }
  15. const int nmax=505;
  16. const int inf=0x7f7f7f7f;
  17. int dist[nmax][nmax],a[nmax];
  18. void mins(int &a,int b){
  19. if(a>b) a=b;
  20. }
  21. int main(){
  22. int n=read(),p=read(),m=read(),u,v,d;
  23. rep(i,1,p) a[i]=read();
  24. clr(dist,0x7f);
  25. rep(i,1,n) dist[i][i]=0;
  26. rep(i,1,m) u=read(),v=read(),dist[u][v]=dist[v][u]=read();
  27. rep(k,1,n) rep(i,1,n) rep(j,1,n)
  28. if(dist[i][k]!=inf&&dist[k][j]!=inf) mins(dist[i][j],dist[i][k]+dist[k][j]);
  29. int ans=inf,res,tmp;
  30. rep(i,1,n){
  31. tmp=0;
  32. rep(j,1,p) tmp+=dist[i][a[j]];
  33. if(tmp<ans) ans=tmp,res=i;
  34. }
  35. printf("%d\n",res);
  36. return 0;
  37. }

bzoj3389:最少多少个区间就能够覆盖整个区间。贪心。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. int read(){
  10. int x=0;char c=getchar();
  11. while(!isdigit(c)) c=getchar();
  12. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  13. return x;
  14. }
  15. const int nmax=25005;
  16. struct node{
  17. int l,r;
  18. bool operator<(const node&rhs)const{
  19. return l<rhs.l||l==rhs.l&&r>rhs.r;}
  20. };
  21. node ns[nmax];
  22. int main(){
  23. int n=read(),T=read();
  24. rep(i,1,n) ns[i].l=read(),ns[i].r=read();
  25. sort(ns+1,ns+n+1);
  26. if(ns[1].l!=1){
  27. printf("-1\n");return 0;
  28. }
  29. if(ns[1].r==T){
  30. printf("1\n");return 0;
  31. }//没有特判这个然后就WA了。。。
  32. int cur=1,t=ns[1].r,u,v,d,tmp,temp,ans=1;
  33. while(cur<=n){
  34. u=-1;v=t;
  35. rep(i,cur+1,n) {
  36. if(ns[i].l>t+1) break;
  37. if(ns[i].r>v){
  38. v=ns[i].r;u=i;
  39. }
  40. }
  41. if(u!=-1) ans++,cur=u,t=v;
  42. else break;
  43. if(t==T) {
  44. printf("%d\n",ans);return 0;
  45. }
  46. }
  47. printf("-1\n");
  48. return 0;
  49. }

bzoj3399:贪心。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. int read(){
  8. int x=0;char c=getchar();
  9. while(!isdigit(c)) c=getchar();
  10. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  11. return x;
  12. }
  13. const int nmax=25005;
  14. struct node{
  15. int a[nmax],b[nmax];
  16. };
  17. node ns;
  18. int main(){
  19. int n=read(),X=read(),Y=read();
  20. rep(i,1,n) ns.a[i]=read(),ns.b[i]=read();
  21. sort(ns.a+1,ns.a+n+1);sort(ns.b+1,ns.b+n+1);
  22. int ans=0;
  23. rep(i,1,n){
  24. if(ns.a[i]>ns.b[i]) ans+=Y*(ns.a[i]-ns.b[i]);
  25. else ans+=X*(ns.b[i]-ns.a[i]);
  26. }
  27. printf("%d\n",ans);
  28. return 0;
  29. }

bzoj3398:递推!不要想复杂了。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. int read(){
  8. int x=0;char c=getchar();
  9. while(!isdigit(c)) c=getchar();
  10. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  11. return x;
  12. }
  13. int dp[100001];
  14. int main(){
  15. int n=read(),m=read();
  16. dp[0]=1;
  17. rep(i,1,n) {
  18. if(i>m+1) dp[i]=dp[i-1]+dp[i-m-1];else dp[i]=dp[i-1]+1;
  19. if(dp[i]>=5000011) dp[i]-=5000011;
  20. }
  21. printf("%d\n",dp[n]);
  22. return 0;
  23. }

bzoj3396:直接最大流。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<queue>
  4. #include<iostream>
  5. #include<algorithm>
  6. using namespace std;
  7. #define rep(i,s,t) for(int i=s;i<=t;i++)
  8. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  9. #define clr(x,c) memset(x,c,sizeof(x))
  10. #define qwq(x) for(edge *o=head[x];o;o=o->next)
  11. int read(){
  12. int x=0;char c=getchar();
  13. while(!isdigit(c)) c=getchar();
  14. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  15. return x;
  16. }
  17. const int nmax=60;
  18. const int maxn=1605;
  19. const int inf=0x7f7f7f7f;
  20. struct edge{
  21. int to,cap;edge *next,*rev;
  22. };
  23. edge es[maxn],*pt=es,*head[nmax],*cur[nmax],*p[nmax];
  24. int cnt[nmax],h[nmax],id[nmax];
  25. void add(int u,int v,int d){
  26. pt->to=v;pt->cap=d;pt->next=head[u];head[u]=pt++;
  27. pt->to=u;pt->cap=0;pt->next=head[v];head[v]=pt++;
  28. head[u]->rev=head[v];head[v]->rev=head[u];
  29. }
  30. int maxflow(int s,int t,int n){
  31. clr(cnt,0);cnt[0]=n;clr(h,0);
  32. int flow=0,a=inf,x=s;edge *e;
  33. while(h[s]<n){
  34. for(e=cur[x];e;e=e->next) if(e->cap>0&&h[e->to]+1==h[x]) break;
  35. if(e){
  36. a=min(a,e->cap);p[e->to]=cur[x]=e;x=e->to;
  37. if(x==t){
  38. while(x!=s) p[x]->cap-=a,p[x]->rev->cap+=a,x=p[x]->rev->to;
  39. flow+=a,a=inf;
  40. }
  41. }else{
  42. if(!--cnt[h[x]]) break;
  43. h[x]=n;
  44. for(e=head[x];e;e=e->next) if(e->cap>0&&h[x]>h[e->to]+1) cur[x]=e,h[x]=h[e->to]+1;
  45. cnt[h[x]]++;
  46. if(x!=s) x=p[x]->rev->to;
  47. }
  48. }
  49. return flow;
  50. }
  51. int main(){
  52. int n=0,m=read(),u,v,d,tmp,temp,t,s;
  53. char S[5],T[5];
  54. rep(i,1,m){
  55. scanf("%s%s",S,T);d=read();
  56. if(S[0]<='Z'&&S[0]>='A') {
  57. tmp=S[0]-'A'+26+1;u=id[tmp];
  58. if(!u) id[tmp]=u=++n;
  59. if(S[0]=='A') s=u;
  60. if(S[0]=='Z') t=u;
  61. }else {
  62. tmp=S[0]-'a'+1;u=id[tmp];
  63. if(!u) id[tmp]=u=++n;
  64. }
  65. if(T[0]<='Z'&&T[0]>='A') {
  66. tmp=T[0]-'A'+26+1;v=id[tmp];
  67. if(!v) id[tmp]=v=++n;
  68. if(T[0]=='A') s=v;
  69. if(T[0]=='Z') t=v;
  70. }else {
  71. tmp=T[0]-'a'+1;v=id[tmp];
  72. if(!v) id[tmp]=v=++n;
  73. }
  74. add(u,v,d);
  75. }
  76. printf("%d\n",maxflow(s,t,n));
  77. return 0;
  78. }

bzoj3391:树形dp。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define clr(x,c) memset(x,c,sizeof(x))
  8. #define qwq(x) for(edge *o=head[x];o;o=o->next)
  9. int read(){
  10. int x=0;char c=getchar();
  11. while(!isdigit(c)) c=getchar();
  12. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  13. return x;
  14. }
  15. const int nmax=10005;
  16. int size[nmax],son[nmax],n;
  17. struct edge{
  18. int to;edge *next;
  19. };
  20. edge es[nmax<<1],*pt=es,*head[nmax];
  21. void add(int u,int v){
  22. pt->to=v;pt->next=head[u];head[u]=pt++;
  23. pt->to=u;pt->next=head[v];head[v]=pt++;
  24. }
  25. void maxs(int &x,int y){
  26. if(x<y) x=y;
  27. }
  28. void dfs(int x,int fa){
  29. son[x]=1;
  30. qwq(x) if(o->to!=fa){
  31. dfs(o->to,x);
  32. son[x]+=son[o->to];
  33. maxs(size[x],son[o->to]);
  34. }
  35. maxs(size[x],n-son[x]);
  36. }
  37. int main(){
  38. n=read();int u,v;
  39. rep(i,1,n-1) u=read(),v=read(),add(u,v);
  40. dfs(1,0);
  41. int tmp=n/2,flag=1;
  42. rep(i,1,n) if(size[i]<=tmp) flag=true,printf("%d\n",i);
  43. if(!flag) printf("NONE\n");
  44. return 0;
  45. }

bzoj3390:最大生成树QAQ

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. int read(){
  10. int x=0;char c=getchar();
  11. while(!isdigit(c)) c=getchar();
  12. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  13. return x;
  14. }
  15. const int nmax=1005;
  16. const int maxn=20005;
  17. struct edge{
  18. int s,t,d;
  19. bool operator<(const edge &rhs) const{
  20. return d>rhs.d;}
  21. };
  22. edge es[maxn];
  23. int fa[nmax];
  24. int find(int x){
  25. return fa[x]==x?x:fa[x]=find(fa[x]);
  26. }
  27. int main(){
  28. int n=read(),m=read(),u,v,d;
  29. rep(i,1,m) {
  30. edge &o=es[i];
  31. o.s=read(),o.t=read(),o.d=read();
  32. }
  33. sort(es+1,es+m+1);
  34. rep(i,1,n) fa[i]=i;
  35. int ta,tb,cnt=0,ans=0;
  36. rep(i,1,m){
  37. edge &o=es[i];
  38. ta=find(o.s);tb=find(o.t);
  39. if(ta!=tb) {
  40. fa[ta]=tb;
  41. ans+=o.d;
  42. if(++cnt==n-1) break;
  43. }
  44. }
  45. if(cnt!=n-1) printf("-1\n");
  46. else printf("%d\n",ans);
  47. return 0;
  48. }

❤bzoj3315:dp+优化。利用特点减少掉一维!

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. int read(){
  10. int x=0;char c=getchar();
  11. while(!isdigit(c)) c=getchar();
  12. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  13. return x;
  14. }
  15. const int nmax=1005;
  16. struct node{
  17. int x,w;
  18. bool operator<(const node&rhs)const{
  19. return x<rhs.x;}
  20. };
  21. node ns[nmax];
  22. int dp[nmax][nmax],pre[nmax][nmax];
  23. int as(int x){
  24. return x<0?-x:x;
  25. }
  26. int main(){
  27. int n=read();
  28. rep(i,1,n) ns[i].x=read(),ns[i].w=read();
  29. sort(ns+1,ns+n+1);
  30. /*dp[1][1]=ns[1].w;
  31. int ans=0;
  32. rep(i,2,n) {
  33. dp[i][i]=ns[i].w;
  34. rep(j,1,i-1) {
  35. rep(k,1,j) if(ns[i].x-ns[j].x>=ns[j].x-ns[k].x)
  36. dp[i][j]=max(dp[i][j],dp[j][k]);
  37. ans=max(ans,dp[i][j]+=ns[i].w);
  38. }
  39. }
  40. reverse(ns+1,ns+n+1);
  41. clr(dp,0);dp[1][1]=ns[1].w;
  42. rep(i,2,n) {
  43. dp[i][i]=ns[i].w;
  44. rep(j,1,i-1) {
  45. rep(k,1,j) if(as(ns[i].x-ns[j].x)>=as(ns[j].x-ns[k].x))
  46. dp[i][j]=max(dp[i][j],dp[j][k]);
  47. ans=max(ans,dp[i][j]+=ns[i].w);
  48. }
  49. }
  50. printf("%d\n",ans);
  51. return 0;*/
  52. dp[1][1]=pre[1][1]=ns[1].w;
  53. int ans=0,p;
  54. rep(i,2,n){
  55. pre[i][i]=dp[i][i]=ns[i].w;p=i-1;
  56. dwn(j,i-1,1){
  57. while(p&&as(ns[i].x-ns[j].x)>=as(ns[j].x-ns[p].x)||p>j) p--;p++;
  58. dp[i][j]=pre[p][j]+ns[i].w;
  59. ans=max(ans,dp[i][j]);
  60. pre[j][i]=max(dp[i][j],pre[j+1][i]);
  61. }
  62. }
  63. reverse(ns+1,ns+n+1);
  64. clr(dp,0);clr(pre,0);
  65. dp[1][1]=pre[1][1]=ns[1].w;
  66. rep(i,2,n){
  67. pre[i][i]=dp[i][i]=ns[i].w;p=i-1;
  68. dwn(j,i-1,1){
  69. while(p&&as(ns[i].x-ns[j].x)>=as(ns[j].x-ns[p].x)||p>j) p--;p++;
  70. dp[i][j]=pre[p][j]+ns[i].w;
  71. ans=max(ans,dp[i][j]);
  72. pre[j][i]=max(dp[i][j],pre[j+1][i]);
  73. }
  74. }
  75. printf("%d\n",ans);
  76. return 0;
  77. }

❤bzoj3314:单调队列就可以了。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. int read(){
  10. int x=0;char c=getchar();
  11. while(!isdigit(c)) c=getchar();
  12. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  13. return x;
  14. }
  15. const int nmax=50005;
  16. struct node{
  17. int x,h;
  18. bool operator<(const node&rhs)const{
  19. return x<rhs.x;}
  20. };
  21. node ns[nmax];
  22. bool fa[nmax],fb[nmax];
  23. int q[nmax];
  24. int main(){
  25. int n=read(),D=read();
  26. rep(i,1,n) ns[i].x=read(),ns[i].h=read();
  27. sort(ns+1,ns+n+1);
  28. //rep(i,1,n) printf("%d %d\n",ns[i].x,ns[i].h);
  29. int l=1,r=0;
  30. rep(i,1,n){
  31. while(l<=r&&ns[q[r]].h<ns[i].h) r--;
  32. q[++r]=i;
  33. while(l<=r&&ns[q[l]].x<ns[i].x-D) l++;
  34. if(ns[q[l]].h>=ns[i].h*2) fa[i]=1;
  35. //rep(j,l,r) printf("%d ",q[j]);printf("\n");
  36. }
  37. l=1,r=0;
  38. int ans=0;
  39. dwn(i,n,1){
  40. while(l<=r&&ns[q[r]].h<ns[i].h) r--;
  41. q[++r]=i;
  42. while(l<=r&&ns[q[l]].x>ns[i].x+D) l++;
  43. if(ns[q[l]].h>=ns[i].h*2) fb[i]=1;
  44. if(fa[i]&&fb[i]) ans++;
  45. //rep(j,l,r) printf("%d ",q[j]);printf("\n");
  46. }
  47. printf("%d\n",ans);
  48. return 0;
  49. }

bzoj3301:康托展开两种情况。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. #define ll long long
  10. ll read(){
  11. ll x=0;char c=getchar();
  12. while(!isdigit(c)) c=getchar();
  13. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  14. return x;
  15. }
  16. const int nmax=25;
  17. ll a[nmax],ans[nmax];bool vis[nmax];
  18. char s[5];
  19. int main(){
  20. ll n=read(),m=read(),u,v,d,tmp,temp;
  21. a[0]=1;
  22. rep(i,1,n) a[i]=a[i-1]*i;
  23. while(m--){
  24. scanf("%s",s);
  25. if(s[0]=='P'){
  26. clr(vis,0);
  27. u=read()-1;
  28. rep(i,1,n){
  29. v=u/a[n-i]+1;d=0;
  30. rep(j,1,n){
  31. if(!vis[j]) d++;
  32. if(d==v) {
  33. ans[i]=j;vis[j]=1;
  34. break;
  35. }
  36. }
  37. u%=a[n-i];
  38. }
  39. rep(i,1,n-1) printf("%lld ",ans[i]);printf("%lld\n",ans[n]);
  40. }else{
  41. clr(vis,0);
  42. rep(i,1,n) ans[i]=read();
  43. u=1;
  44. rep(i,1,n){
  45. vis[ans[i]]=1;v=0;
  46. rep(j,1,ans[i]-1) if(!vis[j]) v++;
  47. u+=v*a[n-i];
  48. }
  49. printf("%lld\n",u);
  50. }
  51. }
  52. return 0;
  53. }

bzoj3300:可以先预处理出每个括号各自的配对然后递归就可以了。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define clr(x,c) memset(x,c,sizeof(x))
  8. #define ll long long
  9. int read(){
  10. int x=0;char c=getchar();
  11. while(!isdigit(c)) c=getchar();
  12. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  13. return x;
  14. }
  15. const int nmax=100005;
  16. const ll mod=12345678910;
  17. int match[nmax],s[nmax];
  18. ll dfs(int l,int r){
  19. if(r==l+1) return 1;
  20. if(match[l]==r) return (dfs(l+1,r-1)*2)%mod;
  21. return (dfs(l,match[l])+dfs(match[l]+1,r))%mod;
  22. }
  23. int main(){
  24. int n=read(),u,v,d,tmp=0,temp=0;
  25. rep(i,1,n){
  26. u=read();
  27. if(!u) s[++tmp]=i;
  28. else match[s[tmp--]]=i;
  29. }
  30. printf("%lld\n",dfs(1,n));
  31. return 0;
  32. }

❤bzoj3297:string+dp。。。stl神器。。。

  1. #include<cstdio>
  2. #include<string>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. const int nmax=1005;
  9. int len[nmax];
  10. char s[nmax];
  11. string ch[nmax],dp[nmax];
  12. bool pd(int u,int x){
  13. rep(i,0,len[x]-1)
  14. if(s[u+i]!='?'&&s[u+i]!=ch[x][i]) return 0;
  15. return 1;
  16. }
  17. int main(){
  18. int n,m,u,v,d,tmp,temp;
  19. scanf("%d%d",&n,&m);
  20. scanf("%s",s+1);
  21. rep(i,1,m) cin>>ch[i],len[i]=ch[i].size();
  22. rep(i,1,n) rep(j,1,m){
  23. u=i-len[j];
  24. if(u<0) continue;
  25. if(u&&dp[u]=="") continue;
  26. if(pd(u+1,j))
  27. if(dp[i]==""||dp[i]>dp[u]+ch[j]) dp[i]=dp[u]+ch[j];
  28. }
  29. cout<<dp[n]<<endl;
  30. return 0;
  31. }

bzoj3296:并查集。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. int read(){
  10. int x=0;char c=getchar();
  11. while(!isdigit(c)) c=getchar();
  12. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  13. return x;
  14. }
  15. const int nmax=10005;
  16. const int maxn=30005;
  17. int fa[nmax+maxn];
  18. int find(int x){
  19. return fa[x]==x?x:fa[x]=find(fa[x]);
  20. }
  21. int main(){
  22. int n=read(),m=read(),u,v,ta,tb;
  23. rep(i,1,n+m) fa[i]=i;
  24. rep(i,1,n){
  25. u=read();
  26. rep(j,1,u) {
  27. v=read();
  28. ta=find(i);tb=find(n+v);
  29. if(ta!=tb) fa[ta]=tb;
  30. }
  31. }
  32. int ans=0;
  33. rep(i,1,n) find(i);
  34. sort(fa+1,fa+n+1);
  35. rep(i,1,n) if(fa[i]!=fa[i-1]) ans++;
  36. printf("%d\n",ans-1);
  37. return 0;
  38. }

bzoj1681:最短路。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<queue>
  6. using namespace std;
  7. #define rep(i,s,t) for(int i=s;i<=t;i++)
  8. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  9. #define clr(x,c) memset(x,c,sizeof(x))
  10. #define qwq(x) for(edge *o=head[x];o;o=o->next)
  11. int read(){
  12. int x=0;char c=getchar();
  13. while(!isdigit(c)) c=getchar();
  14. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  15. return x;
  16. }
  17. const int nmax=505;
  18. const int maxn=2005;
  19. const int inf=0x7f7f7f7f;
  20. struct edge{
  21. int to,dist;edge *next;
  22. };
  23. edge edges[maxn],*pt=edges,*head[nmax];
  24. void add(int u,int v,int d){
  25. pt->to=v;pt->dist=d;pt->next=head[u];head[u]=pt++;
  26. pt->to=u;pt->dist=d;pt->next=head[v];head[v]=pt++;
  27. }
  28. struct node{
  29. int x,dist;
  30. node(int to,int dist):x(to),dist(dist){};
  31. bool operator<(const node&rhs)const{
  32. return dist>rhs.dist;}
  33. };
  34. priority_queue<node>q;
  35. int dist[nmax],N,M,C,nd,tmp[nmax];
  36. void dijkstra(){
  37. clr(dist,0x7f);dist[1]=0;
  38. q.push(node(1,0));
  39. int tx,td;
  40. while(!q.empty()){
  41. node o=q.top();q.pop();
  42. tx=o.x,td=o.dist;
  43. if(dist[tx]!=td) continue;
  44. qwq(tx) if(dist[o->to]>td+o->dist)
  45. dist[o->to]=td+o->dist,q.push(node(o->to,dist[o->to]));
  46. }
  47. }
  48. int main(){
  49. N=read(),M=read(),C=read(),nd=read();
  50. int u,v,d;
  51. rep(i,1,M) u=read(),v=read(),d=read(),add(u,v,d);
  52. dijkstra();
  53. int ans=0;
  54. rep(i,1,C){
  55. u=read();
  56. if(dist[u]<=nd) ans++,tmp[ans]=i;
  57. }
  58. printf("%d\n",ans);
  59. rep(i,1,ans) printf("%d\n",tmp[i]);
  60. return 0;
  61. }

bzoj1668:递推。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. const int nmax=105;
  8. int map[nmax][nmax],dp[nmax][nmax];
  9. int main(){
  10. int n,m;scanf("%d%d",&n,&m);
  11. rep(i,1,n) rep(j,1,m)
  12. scanf("%d",&map[i][j]);
  13. dp[1][1]=map[1][1];
  14. rep(i,2,m) rep(j,1,i)
  15. dp[j][i]=map[j][i]+max(dp[j][i-1],max(dp[j-1][i-1],dp[j+1][i-1]));
  16. printf("%d\n",dp[n][m]);
  17. return 0;
  18. }

bzoj1590:trie然后顺便维护一下子树末节点的个数就好了

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. int read(){
  10. int x=0;char c=getchar();
  11. while(!isdigit(c)) c=getchar();
  12. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  13. return x;
  14. }
  15. const int nmax=500005;
  16. int ch[nmax][2],size[nmax],F[nmax];
  17. int main(){
  18. int N=read(),M=read(),u,v,pt=0,t;
  19. rep(i,1,N){
  20. t=0;u=read();
  21. rep(j,1,u) {
  22. v=read();
  23. if(!ch[t][v]) ch[t][v]=++pt;
  24. t=ch[t][v];size[t]++;
  25. }
  26. F[t]++;//没有考虑重串WA了。
  27. }
  28. //rep(i,1,pt) printf("%d ",size[i]);
  29. rep(i,1,M){
  30. t=0;u=read();int ans=0;
  31. bool f=true;
  32. rep(j,1,u){
  33. v=read();
  34. if(!f) continue;
  35. if(ch[t][v]) ans+=F[ch[t][v]],t=ch[t][v];
  36. else f=false;
  37. }
  38. if(f) ans+=size[ch[t][0]]+size[ch[t][1]];
  39. printf("%d\n",ans);
  40. }
  41. return 0;
  42. }

❤bzoj1597:dp+斜率优化。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. #define ll long long
  10. ll read(){
  11. ll x=0;char c=getchar();
  12. while(!isdigit(c)) c=getchar();
  13. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  14. return x;
  15. }
  16. const int nmax=50005;
  17. const ll inf=1e18;
  18. ll dp[nmax];
  19. struct node{
  20. ll x,y;
  21. bool operator<(const node&rhs)const {
  22. return x>rhs.x||x==rhs.x&&y>rhs.y;}
  23. };
  24. node nodes[nmax];
  25. ll x[nmax],y[nmax],q[nmax];
  26. int main(){
  27. int N=read(),u,v;
  28. rep(i,1,N) nodes[i].x=read(),nodes[i].y=read();
  29. sort(nodes+1,nodes+N+1);
  30. int cnt=0;
  31. rep(i,1,N) if(nodes[i].y>y[cnt]) {
  32. x[++cnt]=nodes[i].x;y[cnt]=nodes[i].y;
  33. }
  34.  
  35. int l=1,r=1;
  36. rep(i,1,cnt){
  37. while(l<r&&y[i]*(x[q[l]+1]-x[q[l+1]+1])>dp[q[l+1]]-dp[q[l]]) l++;
  38. dp[i]=dp[q[l]]+x[q[l]+1]*y[i];
  39. while(l<r&&(dp[q[r]]-dp[q[r-1]])*(x[q[r]+1]-x[i+1])>(dp[i]-dp[q[r]])*(x[q[r-1]+1]-x[q[r]+1])) r--;
  40. q[++r]=i;
  41. }
  42. printf("%lld\n",dp[cnt]);
  43. return 0;
  44. }
  45. /*
  46. 5
  47. 100 1
  48. 15 15
  49. 15 13
  50. 20 5
  51. 1 100
  52. */

❤bzoj1690:分数规划!!!

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<queue>
  6. using namespace std;
  7. #define rep(i,s,t) for(int i=s;i<=t;i++)
  8. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  9. #define clr(x,c) memset(x,c,sizeof(x))
  10. #define qwq(x) for(edge *o=head[x];o;o=o->next)
  11. int read(){
  12. int x=0;char c=getchar();
  13. while(!isdigit(c)) c=getchar();
  14. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  15. return x;
  16. }
  17. const int nmax=1005;
  18. const int maxn=5005;
  19. const int inf=0x7f7f7f7f;
  20.  
  21. struct edge{
  22. int to,dist;
  23. double w;edge *next;
  24. };
  25. edge edges[maxn],*pt=edges,*head[nmax];
  26. int a[nmax],tot[nmax],N,M;
  27. double d[nmax];
  28. bool inq[nmax];
  29. void add(int u,int v,int d){
  30. pt->to=v;pt->dist=d;pt->next=head[u];head[u]=pt++;
  31. }
  32. queue<int>q;
  33. bool spfa(){
  34. rep(i,1,N) d[i]=0,inq[i]=1,q.push(i),tot[i]=1;
  35. while(!q.empty()){
  36. int x=q.front();q.pop();inq[x]=0;
  37. qwq(x) if(d[o->to]>d[x]+o->w){
  38. d[o->to]=d[x]+o->w;
  39. if(++tot[o->to]>=N) return 1;
  40. if(!inq[o->to]) q.push(o->to),inq[o->to]=1;
  41. }
  42. }
  43. return 0;
  44. }
  45. bool check(double L){
  46. rep(i,1,N) qwq(i) o->w=L*o->dist-a[o->to];
  47. return spfa();
  48. }
  49. int main(){
  50. N=read(),M=read();int u,v,d;
  51. rep(i,1,N) a[i]=read();
  52. rep(i,1,M) u=read(),v=read(),d=read(),add(u,v,d);
  53. double l=0,r=10000,mid;
  54. while(r-l>0.001){
  55. mid=(l+r)/2;
  56. if(check(mid)) l=mid;
  57. else r=mid;
  58. }
  59. printf("%.2lf\n",l);
  60. return 0;
  61. }

bzoj1666:模拟。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. int main(){
  7. int n,ans=0;scanf("%d",&n);
  8. while(n!=1){
  9. ans++;
  10. if(n%2==0) n>>=1;
  11. else n=n*3+1;
  12. }
  13. printf("%d\n",ans);
  14. return 0;
  15. }

bzoj1593:线段树经典

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define clr(x,c) memset(x,c,sizeof(x))
  8. #define lson l,mid,x<<1
  9. #define rson mid+1,r,x<<1|1
  10. int read(){
  11. int x=0;char c=getchar();
  12. while(!isdigit(c)) c=getchar();
  13. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  14. return x;
  15. }
  16. const int nmax=50005;
  17. int lmax[nmax<<2],rmax[nmax<<2],omax[nmax<<2],col[nmax<<2];
  18. void pushup(int x,int cnt){
  19. lmax[x]=((lmax[x<<1]==(cnt-(cnt>>1)))?lmax[x<<1]+lmax[x<<1|1]:lmax[x<<1]);
  20. rmax[x]=((rmax[x<<1|1]==(cnt>>1)?rmax[x<<1|1]+rmax[x<<1]:rmax[x<<1|1]));
  21. omax[x]=max(rmax[x<<1]+lmax[x<<1|1],max(omax[x<<1],omax[x<<1|1]));
  22. }
  23. void build(int l,int r,int x){
  24. col[x]=-1;lmax[x]=rmax[x]=omax[x]=r-l+1;
  25. if(l==r) return ;
  26. int mid=(l+r)>>1;
  27. build(lson);build(rson);
  28. }
  29. void pushdown(int x,int cnt){
  30. if(col[x]!=-1) {
  31. col[x<<1]=col[x<<1|1]=col[x];
  32. lmax[x<<1]=rmax[x<<1]=omax[x<<1]=col[x]?0:cnt-(cnt>>1);
  33. lmax[x<<1|1]=rmax[x<<1|1]=omax[x<<1|1]=col[x]?0:(cnt>>1);
  34. col[x]=-1;}
  35. }
  36. void update(int tl,int tr,int p,int l,int r,int x){
  37. if(tl<=l&&tr>=r){
  38. if(p) col[x]=p,lmax[x]=rmax[x]=omax[x]=0;
  39. else col[x]=p,lmax[x]=rmax[x]=omax[x]=r-l+1;
  40. }else{
  41. pushdown(x,r-l+1);
  42. int mid=(l+r)>>1;
  43. if(tl<=mid) update(tl,tr,p,lson);
  44. if(tr>mid) update(tl,tr,p,rson);
  45. pushup(x,r-l+1);
  46. }
  47. }
  48. int query(int cnt,int l,int r,int x){
  49. if(l==r) return l;
  50. pushdown(x,r-l+1);
  51. int mid=(l+r)>>1;
  52. if(omax[x<<1]>=cnt) return query(cnt,lson);
  53. if(rmax[x<<1]+lmax[x<<1|1]>=cnt) return mid-rmax[x<<1]+1;
  54. return query(cnt,rson);
  55. }
  56. int main(){
  57. int N=read(),M=read(),u,v,d;
  58. build(1,N,1);
  59. rep(i,1,M){
  60. u=read(),v=read();
  61. if(u==1){
  62. if(omax[1]<v) printf("0\n");
  63. else{
  64. d=query(v,1,N,1);printf("%d\n",d);
  65. update(d,d+v-1,1,1,N,1);
  66. }
  67. }else{
  68. d=read();
  69. update(v,v+d-1,0,1,N,1);
  70. }
  71. }
  72. return 0;
  73. }

bzoj1592:花最少的代价把序列转换成不下降或不上升队列。dp+优化还是利用特点减掉了一维。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. int read(){
  10. int x=0;char c=getchar();
  11. while(!isdigit(c)) c=getchar();
  12. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  13. return x;
  14. }
  15. const int nmax=2005;
  16. const int inf=0x7f7f7f7f;
  17. int a[nmax],b[nmax];
  18. int as(int x){
  19. return x<0?-x:x;
  20. }
  21. int f[nmax][nmax],g[nmax][nmax];
  22. int main(){
  23. int n=read(),u,v;
  24. rep(i,1,n) b[i]=a[i]=read();
  25. sort(a+1,a+n+1);
  26. rep(i,1,n) rep(j,1,n){
  27. f[i][j]=g[i-1][j]+as(b[i]-a[j]);
  28. if(j==1) g[i][j]=f[i][j];
  29. else g[i][j]=min(f[i][j],g[i][j-1]);
  30. }
  31. int ans=g[n][n];
  32. clr(g,0);clr(f,0);
  33. reverse(b+1,b+n+1);
  34. rep(i,1,n) rep(j,1,n){
  35. f[i][j]=g[i-1][j]+as(b[i]-a[j]);
  36. if(j==1) g[i][j]=f[i][j];
  37. else g[i][j]=min(f[i][j],g[i][j-1]);
  38. }
  39. printf("%d\n",min(g[n][n],ans));
  40. return 0;
  41. }

bzoj1596:树形dp/贪心的做法。。。辛辛苦苦写了那么长的dp结果那么短的贪心同样A了。。。

  1. /*#include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<queue>
  6. using namespace std;
  7. #define rep(i,s,t) for(int i=s;i<=t;i++)
  8. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  9. #define clr(x,c) memset(x,c,sizeof(x))
  10. #define qwq(x) for(edge *o=head[x];o;o=o->next)
  11. int read(){
  12. int x=0;char c=getchar();
  13. while(!isdigit(c)) c=getchar();
  14. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  15. return x;
  16. }
  17. const int nmax=10005;
  18. const int maxn=20005;
  19. const int inf=0x7f7f7f7f;
  20. struct edge{
  21. int to;edge *next;
  22. };
  23. edge edges[maxn],*pt=edges,*head[nmax];
  24. int dp[nmax][3];
  25. void add(int u,int v){
  26. pt->to=v;pt->next=head[u];head[u]=pt++;
  27. pt->to=u;pt->next=head[v];head[v]=pt++;
  28. }
  29. void dfs(int x,int fa){
  30. dp[x][1]=1;dp[x][0]=inf;dp[x][2]=0;
  31. int sum=0,flag=false,tmp=inf;
  32. qwq(x) if(o->to!=fa){
  33. int to=o->to;dfs(to,x);
  34. dp[x][1]+=min(dp[to][0],min(dp[to][1],dp[to][2]));
  35. dp[x][2]+=min(dp[to][0],dp[to][1]);
  36. sum+=min(dp[to][1],dp[to][0]);
  37. if(dp[to][1]<dp[to][0]) flag=true;
  38. else tmp=min(tmp,dp[to][1]-dp[to][0]);
  39. }
  40. if(sum){
  41. if(!flag) sum+=tmp;
  42. dp[x][0]=sum;
  43. }
  44. }
  45. int main(){
  46. int N=read(),u,v;
  47. rep(i,1,N-1) u=read(),v=read(),add(u,v);
  48. dfs(1,0);
  49. printf("%d\n",min(dp[1][1],dp[1][0]));
  50. return 0;
  51. }*/
  52. #include<cstdio>
  53. #include<cstring>
  54. #include<iostream>
  55. #include<algorithm>
  56. #include<queue>
  57. using namespace std;
  58. #define rep(i,s,t) for(int i=s;i<=t;i++)
  59. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  60. #define clr(x,c) memset(x,c,sizeof(x))
  61. #define qwq(x) for(edge *o=head[x];o;o=o->next)
  62. int read(){
  63. int x=0;char c=getchar();
  64. while(!isdigit(c)) c=getchar();
  65. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  66. return x;
  67. }
  68. const int nmax=10005;
  69. const int maxn=20005;
  70. const int inf=0x7f7f7f7f;
  71. struct edge{
  72. int to;edge *next;
  73. };
  74. edge edges[maxn],*pt=edges,*head[nmax];
  75. bool vis[nmax];
  76. void add(int u,int v){
  77. pt->to=v;pt->next=head[u];head[u]=pt++;
  78. pt->to=u;pt->next=head[v];head[v]=pt++;
  79. }
  80. int ans=0;
  81. void dfs(int x,int fa){
  82. bool flag=false;
  83. qwq(x) if(o->to!=fa){
  84. dfs(o->to,x);
  85. if(vis[o->to]) flag=true;
  86. }
  87. if(!flag&&!vis[x]&&!vis[fa]) vis[fa]=1,ans++;
  88. }
  89. int main(){
  90. int N=read(),u,v;
  91. rep(i,1,N-1) u=read(),v=read(),add(u,v);
  92. dfs(1,0);
  93. printf("%d\n",ans);
  94. return 0;
  95. }

bzoj1652:跟1742相似,,都是套路啊

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. const int nmax=2005;
  10. int a[nmax],f[nmax][nmax];
  11. int main(){
  12. int n;scanf("%d",&n);
  13. rep(i,1,n) scanf("%d",&a[i]);
  14. rep(i,1,n) {
  15. for(int j=1;j+i-1<=n;j++){
  16. f[j][j+i-1]=max(f[j+1][j+i-1]+(n-i+1)*a[j],f[j][j+i-2]+(n-i+1)*a[j+i-1]);
  17. }
  18. }
  19. printf("%d\n",f[1][n]);
  20. return 0;
  21. }

bzoj1684:模拟这

  1. #include<cstdio>
  2. double as(double x){
  3. return x<0?-x:x;
  4. }
  5. int main(){
  6. int N,D;
  7. scanf("%d%d",&N,&D);
  8. double ans=2.0,tmp=N*1.0/D;
  9. int ta,tb,temp;
  10. for(int i=1;i<=32767;i++){
  11. temp=tmp*i;
  12. if(as(tmp-temp*1.0/i)<ans&&i*N!=D*temp) ans=as(tmp-temp*1.0/i),ta=temp,tb=i;
  13. if(as(tmp-(temp+1)*1.0/i)<ans&&i*N!=D*(temp+1)) ans=as(tmp-(temp+1)*1.0/i),ta=temp+1,tb=i;
  14. }
  15. printf("%d %d\n",ta,tb);
  16. return 0;
  17. }

❤bzoj3892:dp。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. int read(){
  10. int x=0,f=1;char c=getchar();
  11. while(!isdigit(c)){
  12. if(c=='-') f=-1;c=getchar();
  13. }
  14. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  15. return x*f;
  16. }
  17. const int nmax=505;
  18. const int inf=0x7f7f7f7f;
  19. int dp[nmax][nmax],x[nmax],y[nmax];
  20. int as(int x){
  21. return x<0?-x:x;
  22. }
  23. int main(){
  24. int N=read(),K=read();
  25. rep(i,1,N) x[i]=read(),y[i]=read();
  26. clr(dp,0x7f);dp[1][0]=0;
  27. rep(i,2,N) {
  28. for(int j=0;j<=i-2&&j<=K;j++){
  29. rep(k,0,j)
  30. dp[i][j]=min(dp[i][j],dp[i-k-1][j-k]+as(x[i]-x[i-k-1])+as(y[i]-y[i-k-1]));
  31. }
  32. }
  33. printf("%d\n",dp[N][min(K,N-2)]);
  34. }

8.11-8.16:usaco的更多相关文章

  1. 《TCP/IP详解卷1:协议》第11章 UDP:用户数据报协议-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  2. 11月16日《奥威Power-BI基于SQL的存储过程及自定义SQL脚本制作报表》腾讯课堂开课啦

           上周的课程<奥威Power-BI vs微软Power BI>带同学们全面认识了两个Power-BI的使用情况,同学们已经迫不及待想知道这周的学习内容了吧!这周的课程关键词—— ...

  3. 在OS X 10.10系统上安装Navicat Premium中文破解版11.0.16教程

    此链接是Navicat Premium中文破解版11.0.16安装包里面并带有中文汉化包 http://pan.baidu.com/s/1ntjz6HF#path=%252F 一.Navicat Pr ...

  4. 11.翻译系列:在EF 6中配置一对零或者一对一的关系【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-fi ...

  5. 9.11 翻译系列:数据注解特性之--Timestamp【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/TimeStamp-dataannotations-attribute-in-code- ...

  6. 北京Uber优步司机奖励政策(11月16日~11月22日)

    用户组:人民优步“关羽组”(适用于11月16日-11月22日)奖励政策: 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/ ...

  7. 背包九讲 附:USACO中的背包问题

    附:USACO中的背包问题 USACO是USA Computing Olympiad的简称,它组织了很多面向全球的计算机竞赛活动. USACO Trainng是一个很适合初学者的题库,我认为它的特色是 ...

  8. 2016年11月16日 星期三 --出埃及记 Exodus 20:7

    2016年11月16日 星期三 --出埃及记 Exodus 20:7 "You shall not misuse the name of the LORD your God, for the ...

  9. Ext.Net学习笔记16:Ext.Net GridPanel 折叠/展开行

    Ext.Net学习笔记16:Ext.Net GridPanel 折叠/展开行 Ext.Net GridPanel的行支持折叠/展开功能,这个功能个人觉得还说很有用处的,尤其是数据中包含图片等内容的时候 ...

随机推荐

  1. discuz x3插件开发傻瓜图文教程,用demo说话

    此demo功能是在模板footer部位插入一段javascript代码,这段代码可以是alert提示,也可以是加载广告等等. 第一步: 在config\config_global.php 文件里设置$ ...

  2. 生产场景NFS共享存储优化及实战

    生产场景NFS共享存储优化: 1.硬件:sas/ssd磁盘,买多块,raid0/raid10,网卡好 2.NFS服务器端优化加all_squash,async /backup/NFS 192.168. ...

  3. Python调用C模块以及性能分析

    一.c,ctypes和python的数据类型的对应关系 ctypes type ctype Python type c_char char 1-character string c_wchar wch ...

  4. Unity3d本地存储

    原文地址:http://blog.csdn.net/dingkun520wy/article/details/49386507 (一)简单数据存储PlayerPrefs 这种存储方法比较简单直接上代码 ...

  5. 【BZOJ 3172】 [Tjoi2013]单词

    Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input 第一个一个整数N,表示有多少个单词,接下来N ...

  6. 【BZOJ2049】 [Sdoi2008]Cave 洞穴勘测

    Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好 ...

  7. java se doc

    J2SE 5.0 Performance White Paper http://www.oracle.com/technetwork/java/5-136747.html Java Tuning Wh ...

  8. 基于SuperSocket实现的WebSocket(前端)

    本文内容是搭配后端使用的,没看过WebSocket后端实现的童鞋们戳这里 咳咳,其实前端实现相对就容易很多了,因为我们有JavaScript WebSocket Api,它看上来大致是这样的: var ...

  9. [scalability] Find all documents that contain a list of words

    Given a list of millions of documents, how would you find all documents that contain a list of words ...

  10. SQL Server 2008 设计与实现笔记(一)

    Chart5 create database MovieRental; select name, SUSER_SNAME(sid) as [login] from sys.database_princ ...