summary:38

vijos1002:青蛙跳河。

dp+压缩。距离大于100可以直接%100.然后数据范围小了很多可以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. int f[100000];
  9. int a[105];
  10. bool vis[100000];
  11. int main(){
  12. int l,s,t,m;
  13. scanf("%d%d%d%d",&l,&s,&t,&m);
  14. rep(i,1,m) scanf("%d",&a[i]);
  15. sort(a+1,a+m+1);
  16. if(s==t){
  17. int ans=0;
  18. rep(i,1,m) if(!(a[i]%s)) ans++;
  19. printf("%d\n",ans);return 0;
  20. }
  21. int tmp,cnt=0;
  22. rep(i,1,m){
  23. if((tmp=a[i]-a[i-1])>100) vis[cnt+=100]=1;
  24. else vis[cnt+=tmp]=1;
  25. }
  26. rep(i,0,cnt+t) f[i]=100;f[0]=0;
  27. rep(i,0,cnt+t) rep(j,s,t) if(i>=j) f[i]=min(f[i],f[i-j]+vis[i]);
  28. int ans=105;
  29. rep(i,cnt,cnt+t) ans=min(ans,f[i]);
  30. printf("%d\n",ans);
  31. return 0;
  32. }

vijos1843:货车运输

最大生成树+lca。然而链剖太久没打WA了很久。id和idx容易混淆注意。是最大生成树森林处理一下,将边的权值弄到点的权值上。

  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 lson x<<1,l,m
  11. #define rson x<<1|1,m+1,r
  12. int read(){
  13. int x=0;char c=getchar();
  14. while(!isdigit(c)) c=getchar();
  15. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  16. return x;
  17. }
  18. const int nmax=20005;
  19. const int maxn=100005;
  20. const int inf=0x7f7f7f7f;
  21. struct edge{
  22. int dist,from,to;edge *next;
  23. bool operator<(const edge &rhs)const{
  24. return dist>rhs.dist;}
  25. };
  26. edge e[maxn],edges[maxn<<1],*pt=edges,*head[nmax];
  27. int fa[nmax],n,m,pre[nmax],son[nmax],size[nmax],dep[nmax],tp[nmax],id[nmax],idx[nmax],w[nmax],sum[nmax<<2];
  28. void add(int u,int v,int d){
  29. pt->to=v;pt->dist=d;pt->next=head[u];head[u]=pt++;
  30. pt->to=u;pt->dist=d;pt->next=head[v];head[v]=pt++;
  31. }
  32. int find(int x){
  33. return fa[x]==x?x:fa[x]=find(fa[x]);
  34. }
  35. void dfs(int x){
  36. size[x]=1;
  37. qwq(x) if(o->to!=pre[x]){
  38. int to=o->to;pre[to]=x;dep[to]=dep[x]+1;w[to]=o->dist;
  39. dfs(to);size[x]+=size[to];
  40. if(!son[x]||size[to]>size[son[x]]) son[x]=to;
  41. }
  42. }
  43. void DFS(int x,int top){
  44. id[++id[0]]=x;idx[x]=id[0];tp[x]=top;
  45. if(son[x]) DFS(son[x],top);
  46. qwq(x) if(!idx[o->to]) DFS(o->to,o->to);
  47. }
  48. void build(int x,int l,int r){
  49. if(l==r) {
  50. sum[x]=w[id[l]];return ;
  51. }
  52. int m=(l+r)>>1;build(lson);build(rson);sum[x]=min(sum[x<<1],sum[x<<1|1]);
  53. }
  54. int query(int tl,int tr,int x,int l,int r){
  55. if(tl<=l&&tr>=r) return sum[x];
  56. int m=(l+r)>>1;int ans=inf;
  57. if(tl<=m) ans=min(ans,query(tl,tr,lson));
  58. if(tr>m) ans=min(ans,query(tl,tr,rson));
  59. return ans;
  60. }
  61. int qmax(int a,int b){
  62. if(find(a)!=find(b)) return -1;
  63. int ans=inf;
  64. while(tp[a]!=tp[b]){
  65. if(dep[tp[a]]>dep[tp[b]]) swap(a,b);
  66. ans=min(ans,query(idx[tp[b]],idx[b],1,1,n));
  67. b=pre[tp[b]];
  68. }
  69. if(dep[a]>dep[b]) swap(a,b);
  70. if(idx[a]==idx[b]) return ans;
  71. ans=min(ans,query(idx[a]+1,idx[b],1,1,n));
  72. return ans;
  73. }
  74. int main(){
  75. n=read(),m=read();
  76. rep(i,1,m) {
  77. edge &o=e[i];
  78. o.from=read(),o.to=read(),o.dist=read();
  79. }
  80.  
  81. sort(e+1,e+m+1);
  82. rep(i,1,n) fa[i]=i;
  83. rep(i,1,m){
  84. edge &o=e[i];
  85. int ta=find(o.from),tb=find(o.to);
  86. if(ta!=tb){
  87. add(o.from,o.to,o.dist);
  88. fa[ta]=tb;
  89. }
  90. }
  91.  
  92. clr(son,0);clr(idx,0);id[0]=0;
  93. rep(i,1,n) if(!pre[i]) dep[i]=0,dfs(i);
  94. rep(i,1,n) if(!idx[i]) DFS(i,i);
  95.  
  96. build(1,1,n);
  97. int Q=read(),u,v;
  98. rep(i,1,Q){
  99. u=read(),v=read();
  100. printf("%d\n",qmax(u,v));
  101. }
  102. }

bzoj1650:

二分答案+贪心判断。和noip2015day2t1差不多。

  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. 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. const int nmax=50005;
  15. int a[nmax],N,M,L;
  16. bool check(int x){
  17. int ans=0,pre=0;
  18. rep(i,1,N) {
  19. if(a[i]-a[pre]<x) ans++;
  20. else pre=i;
  21. }
  22. if(ans<=M) return true;
  23. return false;
  24. }
  25. int main(){
  26. L=read(),N=read(),M=read();
  27. rep(i,1,N) a[i]=read();
  28. sort(a+1,a+N+1);
  29. int l=0,r=L,mid,ans=0;
  30. while(l<=r){
  31. mid=(l+r)>>1;
  32. if(check(mid)) ans=mid,l=mid+1;
  33. else r=mid-1;
  34. }
  35. printf("%d\n",ans);
  36. return 0;
  37. }

bzoj1648:

边数点数少直接暴力dfs

  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=1005;
  16. const int maxn=10005;
  17. const int inf=0x7f7f7f7f;
  18. struct edge{
  19. int to;edge *next;
  20. };
  21. edge edges[maxn],*pt=edges,*head[nmax];
  22. int a[nmax],ans[nmax];
  23. bool vis[nmax];
  24. void add(int u,int v){
  25. pt->to=v;pt->next=head[u];head[u]=pt++;
  26. }
  27. void dfs(int x){
  28. vis[x]=true;ans[x]++;
  29. qwq(x) if(!vis[o->to]) dfs(o->to);
  30. }
  31. int main(){
  32. int K=read(),N=read(),M=read(),u,v;
  33. rep(i,1,K) a[i]=read();
  34. rep(i,1,M) u=read(),v=read(),add(u,v);
  35. rep(i,1,K) clr(vis,false),dfs(a[i]);
  36. int res=0;
  37. rep(i,1,N) if(ans[i]==K) res++;
  38. printf("%d\n",res);
  39. return 0;
  40. }

bzoj1646:

简单bfs;

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define clr(x,c) memset(x,c,sizeof(x))
  7. const int nmax=200005;
  8. int q[nmax],dist[nmax];
  9. bool vis[nmax];
  10. int main(){
  11. int n,k;
  12. scanf("%d%d",&n,&k);
  13. int l=1,r=1;
  14. clr(vis,false);vis[n]=true;
  15. dist[n]=0;
  16. q[r]=n;
  17. while(l<=r){
  18. int x=q[l];l++;
  19. if(x==k){
  20. printf("%d\n",dist[x]);return 0;
  21. }
  22. if(x-1>=0&&!vis[x-1]) q[++r]=x-1,vis[x-1]=true,dist[x-1]=dist[x]+1;
  23. if(x+1<=200000&&!vis[x+1]) q[++r]=x+1,vis[x+1]=true,dist[x+1]=dist[x]+1;
  24. if(x+x<=200000&&!vis[x+x]) q[++r]=x+x,vis[x+x]=true,dist[x+x]=dist[x]+1;
  25. }
  26. return 0;
  27. }

bzoj1644:

bfs。不知道为什么我这样子写WA了。。。放一下代码求指点。。挖坑有空再写。

  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 clr(x,c) memset(x,c,sizeof(x))
  9. char s[105];
  10. bool map[105][105];
  11. int f[105][105],from[105][105];
  12. queue<int>q,Q;
  13. int xx[5]={0,0,0,1,-1};
  14. int yy[5]={0,1,-1,0,0};
  15. int main(){
  16. int n,sa,sb,ta,tb;scanf("%d",&n);
  17. rep(i,1,n){
  18. scanf("%s",s+1);
  19. rep(j,1,n) {
  20. map[i][j]=s[j]=='x'?0:1;
  21. if(s[j]=='A') sa=i,sb=j;
  22. else if(s[j]=='B') ta=i,tb=j;
  23. }
  24. }
  25. clr(f,0x7f);
  26. f[sa][sb]=0;
  27. q.push(sa);Q.push(sb);
  28. int x,y,tx,ty;
  29. while(!q.empty()){
  30. x=q.front(),y=Q.front();q.pop();Q.pop();
  31. rep(i,1,4){
  32. tx=x+xx[i],ty=y+yy[i];
  33. if(tx<=0||ty<=0||tx>n||ty>n||!map[tx][ty]) continue;
  34. if(from[x][y]==i||x==sa&&y==sb) {
  35. if(f[x][y]<f[tx][ty])
  36. q.push(tx),Q.push(ty),f[tx][ty]=f[x][y],from[tx][ty]=i;
  37. }
  38. else if(f[x][y]<f[tx][ty]-1)
  39. q.push(tx),Q.push(ty),f[tx][ty]=f[x][y]+1,from[tx][ty]=i;
  40. }
  41. }
  42. printf("%d\n",f[ta][tb]);
  43. return 0;
  44. }
  45. /*
  46. 5
  47. ..Bx.
  48. .xxA.
  49. ...x.
  50. .x...
  51. ..x..*/

bzoj1643:

O(n^3)暴力,然后第四个数可以推出来。。因为写过一道搜索+剪枝有一个剪枝类似这样子所以会。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<cmath>
  6. using namespace std;
  7. #define rep(i,s,t) for(int i=s;i<=t;i++)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. int a[105];
  10. int main(){
  11. int n,u,temp,orz,ans=0;
  12. scanf("%d",&n);
  13. int tmp=(int)sqrt(n)+1;
  14. rep(i,0,tmp) a[i]=i*i;
  15. rep(i,0,tmp) {
  16. rep(j,0,tmp) if(a[i]+a[j]<=n){
  17. rep(k,0,tmp) if((u=a[i]+a[j]+a[k])<=n){
  18. temp=n-u,orz=sqrt(temp);
  19. if(orz*orz==temp) ans++;
  20. }
  21. }
  22. }
  23. printf("%d\n",ans);
  24. return 0;
  25. }

bzoj1641:

floyed即可。。。然而一看到题目就二话不说二分答案+暴力dfs(总是觉得应该可以卡时过去。然而还是tle了。。、不过这种做法应该是对的吧

  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=305;
  17. const int maxn=25005;
  18. const int inf=0x7f7f7f7f;
  19. struct edge{
  20. int to,dist;edge *next;
  21. bool flag;
  22. };
  23. edge edges[maxn],*pt=edges,*head[nmax];
  24. int N,M,Q;
  25. bool vis[nmax];
  26. void add(int u,int v,int d){
  27. pt->to=v;pt->dist=d;pt->next=head[u];head[u]=pt++;
  28. }
  29. bool dfs(int x,int t){
  30. vis[x]=true;
  31. if(x==t) return true;
  32. qwq(x) if(!vis[o->to]&&o->flag){
  33. if(dfs(o->to,t)) return true;
  34. }
  35. return false;
  36. }
  37. bool check(int x,int s,int t){
  38. rep(i,1,N) qwq(i) if(o->dist<=x) o->flag=true;else o->flag=false;
  39. clr(vis,false);
  40. if(dfs(s,t)) return true;
  41. return false;
  42. }
  43. int main(){
  44. N=read(),M=read(),Q=read();
  45. int u,v,d,sum=0;
  46. rep(i,1,M) u=read(),v=read(),d=read(),add(u,v,d),sum=max(sum,d);
  47. rep(i,1,Q) {
  48. u=read(),v=read();
  49. int l=0,r=sum,ans=-1,mid;
  50. while(l<=r){
  51. mid=(l+r)>>1;
  52. if(check(mid,u,v)) ans=mid,r=mid-1;
  53. else l=mid+1;
  54. }
  55. printf("%d\n",ans);
  56. }
  57. }*/
  58. #include<cstdio>
  59. #include<cstring>
  60. #include<iostream>
  61. #include<algorithm>
  62. using namespace std;
  63. #define rep(i,s,t) for(int i=s;i<=t;i++)
  64. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  65. #define clr(x,c) memset(x,c,sizeof(x))
  66. int read(){
  67. int x=0;char c=getchar();
  68. while(!isdigit(c)) c=getchar();
  69. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  70. return x;
  71. }
  72. const int nmax=305;
  73. const int maxn=25005;
  74. const int inf=0x7f7f7f7f;
  75. int dist[nmax][nmax];
  76. int main(){
  77. int N=read(),M=read(),Q=read(),u,v,d;
  78. clr(dist,0x7f);
  79. rep(i,1,M) u=read(),v=read(),d=read(),dist[u][v]=d;
  80. rep(k,1,N) rep(i,1,N) rep(j,1,N) if(dist[i][k]!=inf&&dist[k][j]!=inf)
  81. dist[i][j]=min(dist[i][j],max(dist[i][k],dist[k][j]));
  82. rep(i,1,Q) {
  83. u=read(),v=read();
  84. if(dist[u][v]==inf) printf("-1\n");
  85. else printf("%d\n",dist[u][v]);
  86. }
  87. return 0;
  88. }

bzoj1640:

直接模拟。。。然而没有看清题意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. const int nmax=2005;
  10. int a[nmax],ans[nmax];
  11. char c[5];
  12. int main(){
  13. int n;scanf("%d",&n);
  14. rep(i,1,n){
  15. scanf("%s",c);
  16. a[i]=c[0]-'A';
  17. }
  18. int l=1,r=n,tmp;
  19. rep(k,1,n){
  20. if(a[l]<a[r]) ans[k]=a[l],l++;
  21. else if(a[l]>a[r]) ans[k]=a[r],r--;
  22. else{
  23. for(int i=l,j=r;i<=j;i++,j--){
  24. if(a[i]<a[j]){
  25. tmp=l;break;
  26. }else if(a[i]>a[j]){
  27. tmp=r;break;
  28. }else if(i==j){
  29. tmp=l;break;
  30. }
  31. }
  32. ans[k]=a[tmp];
  33. tmp==l?l++:r--;
  34. }
  35. }
  36. rep(i,1,n){
  37. putchar('A'+ans[i]);
  38. if(i%80==0) putchar('\n');
  39. }
  40. return 0;
  41. }
  42. /*
  43. 10
  44. A
  45. C
  46. D
  47. E
  48. F
  49. B
  50. E
  51. D
  52. C
  53. B
  54. */

bzoj1639:

二分答案+贪心判断。这种模拟总有感觉自己会写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 clr(x,c) memset(x,c,sizeof(x))
  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. const int nmax=100005;
  15. const int inf=0x7f7f7f7f;
  16. int N,M,a[nmax];
  17. bool check(int x){
  18. int ans=0,cur=1,tmp;
  19. while(1){
  20. tmp=a[cur];
  21. if(tmp>x) return false;
  22. while(tmp<=x&&cur<=N) cur++,tmp+=a[cur];
  23. ans++;
  24. if(cur>N) break;
  25. }
  26. if(ans<=M) return true;
  27. return false;
  28. }
  29. int main(){
  30. N=read(),M=read();
  31. rep(i,1,N) a[i]=read();
  32. int l=0,r=inf,mid,ans=0;
  33. while(l<=r){
  34. mid=(l+r)>>1;
  35. if(check(mid)) ans=mid,r=mid-1;
  36. else l=mid+1;
  37. }
  38. printf("%d\n",ans);
  39. return 0;
  40. }

bzoj1638:

dfs。不会做,orz了hzwer(我原本的做法求方案数又是抱着应该可以卡过去的想法暴力dfs。。。stopstopstop小搜怡情爆搜伤身啊。。

  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 qaq(x) for(edge *o=h[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=5005;
  18. const int maxn=50005;
  19. const int inf=0x7f7f7f7f;
  20. bool in[nmax];
  21. int s[maxn],t[maxn];
  22. int f[nmax],dp[nmax];
  23. struct edge{
  24. int to;edge *next;
  25. };
  26. edge edges[maxn],*pt=edges,*head[nmax];
  27. edge e[maxn],*p=e,*h[nmax];
  28. void add(int u,int v){
  29. pt->to=v;pt->next=head[u];head[u]=pt++;
  30. }
  31. void adde(int u,int v){
  32. p->to=v;p->next=h[u];h[u]=p++;
  33. }
  34. void dfs(int x){
  35. if(!head[x]) {
  36. dp[x]=1;return ;
  37. }
  38. qwq(x){
  39. if(!dp[o->to]) dfs(o->to);
  40. dp[x]+=dp[o->to];
  41. }
  42. }
  43. void DFS(int x){
  44. if(!h[x]) {
  45. f[x]=1;return ;
  46. }
  47. qaq(x){
  48. if(!f[o->to]) DFS(o->to);
  49. f[x]+=f[o->to];
  50. }
  51. }
  52. int main(){
  53. int N=read(),M=read(),u,v;
  54. rep(i,1,M) u=read(),v=read(),add(u,v),adde(v,u),in[v]=true,s[i]=u,t[i]=v;
  55. rep(i,1,N) if(!in[i]) dfs(i);
  56. DFS(N);
  57. int ans=0;
  58. rep(i,1,M) ans=max(ans,dp[t[i]]*f[s[i]]);
  59. printf("%d\n",ans);
  60. return 0;
  61. }

bzoj1637:

1就+1,0就-1,然后找乱搞就可以了。

  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 cur,x;
  18. bool operator<(const node&rhs)const{
  19. return cur<rhs.cur;}
  20. };
  21. node nodes[nmax];
  22. int sum[nmax],ll[nmax+nmax],rr[nmax+nmax];
  23. int main(){
  24. int n=read();
  25. rep(i,1,n) nodes[i].x=read(),nodes[i].cur=read();
  26. sort(nodes+1,nodes+n+1);
  27. rep(i,1,n) {
  28. node&o=nodes[i];
  29. if(o.x) sum[i]=sum[i-1]+1;
  30. else sum[i]=sum[i-1]-1;
  31. if(!ll[sum[i]+n]) ll[sum[i]+n]=i;
  32. else rr[sum[i]+n]=i;
  33. }
  34. int ans=0;
  35. rep(i,0,n+n){
  36. if(!rr[i]) continue;
  37. ans=max(ans,nodes[rr[i]].cur-nodes[ll[i]+1].cur);
  38. }
  39. printf("%d\n",ans);
  40. return 0;
  41. }

bzoj1636:

多次求区间最大最小差值。ST和线段树都可以搞。没写过ST写一下还是挺好写的。

  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. char s[100];
  16. void print(int x){
  17. int cur=0;
  18. if(!x) {
  19. putchar('0');putchar('\n');
  20. return;
  21. }
  22. while(x){
  23. s[++cur]=x%10+'0',x/=10;
  24. }
  25. dwn(i,cur,1) putchar(s[i]);
  26. putchar('\n');
  27. }
  28. const int nmax=50005;
  29. int a[nmax],f[nmax][20],g[nmax][20];
  30. int main(){
  31. int N=read(),Q=read(),u,v;
  32. rep(i,1,N) a[i]=read(),f[i][0]=g[i][0]=a[i];
  33. for(int k=1;(1<<k)<=N;k++)
  34. for(int i=1;i+(1<<k)-1<=N;i++)
  35. f[i][k]=max(f[i][k-1],f[i+(1<<k-1)][k-1]),g[i][k]=min(g[i][k-1],g[i+(1<<k-1)][k-1]);
  36. rep(i,1,Q){
  37. u=read(),v=read();
  38. int tmp;
  39. for(tmp=0;(1<<tmp)<=v-u+1;tmp++);tmp--;
  40. print(max(f[u][tmp],f[v-(1<<tmp)+1][tmp])-min(g[u][tmp],g[v-(1<<tmp)+1][tmp]));
  41. }
  42. return 0;
  43. }

bzoj1635:

差分序列!!!感觉好高大上的东西。就是可以区间内加减一个数。然后就可以啦。

  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. 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. const int nmax=10005;
  15. int ans[nmax];
  16. struct node{
  17. int x,y;
  18. bool operator<(const node&rhs)const{
  19. return x<rhs.x||x==rhs.x&&y<rhs.y;}
  20. };
  21. node nodes[nmax];
  22. int main(){
  23. int N=read(),I=read(),H=read(),M=read(),u,v;
  24. rep(i,1,M) {
  25. node&o=nodes[i];
  26. o.x=read(),o.y=read();
  27. if(o.x>o.y) swap(o.x,o.y);
  28. }
  29. sort(nodes+1,nodes+M+1);
  30. rep(i,1,M){
  31. if(nodes[i].x==nodes[i-1].x&&nodes[i].y==nodes[i-1].y) continue;
  32. ans[nodes[i].x+1]--;ans[nodes[i].y]++;
  33. }
  34. rep(i,1,N) printf("%d\n",(ans[i]+=ans[i-1])+H);printf("\n");
  35. return 0;
  36. }

bzoj1634:

贪心。对于AB判断A前B后或者A后B前哪一种更优可以推出表达式。那么久可以确定顺序了。以点破面?。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. #define rep(i,s,t) for(int i=s;i<=t;i++)
  6. #define clr(x,c) memset(x,c,sizeof(x))
  7. #define ll long long
  8. const int nmax=100005;
  9. struct node{
  10. int w,t,num;
  11. bool operator<(const node&rhs)const{
  12. return rhs.w*t>w*rhs.t;}
  13. };
  14. node nodes[nmax];
  15. int main(){
  16. int N;scanf("%d",&N);
  17. rep(i,1,N) scanf("%d%d",&nodes[i].w,&nodes[i].t),nodes[i].num=i;
  18. sort(nodes+1,nodes+N+1);
  19. ll sum=0,ans=0;
  20. rep(i,1,N) ans+=sum*nodes[i].t<<1,sum+=nodes[i].w;
  21. printf("%lld\n",ans);
  22. return 0;
  23. }

bzoj1632:

bfs。多加一维来乱搞(然而我一直调不出来。。。挖坑。啊我为什么bfs总是WA啊。。。

bzoj1631:

两遍spfa就可以了。。。将边反过来存储就又变成单源最短路了。。以前见过。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<queue>
  5. #include<algorithm>
  6. using namespace std;
  7. #define rep(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 qaq(x) for(edge *o=h[x];o;o=o->next)
  11. int read(){
  12. int x=0;char c=getchar();int f=1;
  13. while(!isdigit(c)){
  14. if(c=='-') f=-1;c=getchar();
  15. }
  16. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  17. return f*x;
  18. }
  19. const int nmax=1005;
  20. const int maxn=100005;
  21. const int inf=0x7f7f7f7f;
  22. struct edge{
  23. int to,dist;edge*next;
  24. };
  25. edge edges[maxn],*pt=edges,*head[nmax];
  26. edge e[maxn],*p=e,*h[nmax];
  27. void add(int u,int v,int d){
  28. pt->to=v;pt->dist=d;pt->next=head[u];head[u]=pt++;
  29. }
  30. void adde(int u,int v,int d){
  31. p->to=v;p->dist=d;p->next=h[u];h[u]=p++;
  32. }
  33. queue<int>q;
  34. int dist[nmax],dis[nmax];
  35. bool inq[nmax];
  36. void spfa(int t){
  37. clr(inq,false);inq[t]=1;
  38. clr(dist,0x7f);dist[t]=0;
  39. q.push(t);
  40. while(!q.empty()){
  41. int x=q.front();q.pop();inq[x]=false;
  42. qwq(x) if(dist[o->to]>dist[x]+o->dist){
  43. dist[o->to]=dist[x]+o->dist;
  44. if(!inq[o->to]) q.push(o->to),inq[o->to]=true;
  45. }
  46. }
  47. }
  48. void SPFA(int t){
  49. clr(inq,false);inq[t]=1;
  50. clr(dis,0x7f);dis[t]=0;
  51. q.push(t);
  52. while(!q.empty()){
  53. int x=q.front();q.pop();inq[x]=false;
  54. qaq(x) if(dis[o->to]>dis[x]+o->dist){
  55. dis[o->to]=dis[x]+o->dist;
  56. if(!inq[o->to]) q.push(o->to),inq[o->to]=true;
  57. }
  58. }
  59. }
  60. int main(){
  61. int N=read(),M=read(),T=read(),u,v,d;
  62. rep(i,1,M){
  63. u=read(),v=read(),d=read();
  64. add(u,v,d);adde(v,u,d);
  65. }
  66. spfa(T);SPFA(T);
  67. int ans=-1;
  68. rep(i,1,N) ans=max(ans,dist[i]+dis[i]);
  69. printf("%d\n",ans);
  70. return 0;
  71. }

bzoj1630:

这可是道背包dp神题啊。挖坑似乎可以前缀和优化+滚动数组。。。然而我只会滚动数组。(防止mle。好劲啊这是。。。

  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=1e5+5;
  16. const int maxn=1e3+5;
  17. const int mod=1e6;
  18. int dp[nmax],cnt[maxn];
  19. int main(){
  20. int T=read(),A=read(),S=read(),B=read(),u;
  21. rep(i,1,A) u=read(),cnt[u]++;
  22. dp[0]=1;
  23. rep(i,1,T) dwn(j,B,1) rep(k,1,cnt[i]) {
  24. if(j<k) break;
  25. dp[j]=(dp[j]+dp[j-k])%mod;
  26. }
  27. int ans=0;
  28. rep(i,S,B) ans=(ans+dp[i])%mod;
  29. printf("%d\n",ans);
  30. return 0;
  31. }

bzoj1629:

贪心。。AB谁前谁后可以判断。和1634是同一种类型题。

  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. 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. const int nmax=50005;
  15. const int inf=0x7f7f7f7f;
  16. struct node{
  17. int w,t;
  18. bool operator<(const node&rhs)const{
  19. return max(-t,w-rhs.t)<max(-rhs.t,rhs.w-t);}
  20. };
  21. node nodes[nmax];
  22. int main(){
  23. int n=read();
  24. rep(i,1,n) nodes[i].w=read(),nodes[i].t=read();
  25. sort(nodes+1,nodes+n+1);
  26. int ans=-inf,sum=0;
  27. rep(i,1,n) ans=max(ans,sum-nodes[i].t),sum+=nodes[i].w;
  28. printf("%d\n",ans);
  29. return 0;
  30. }

bzoj1628:

单调栈!边界没有处理好!!!注意边界。。

  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. 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. const int nmax=50005;
  15. int a[nmax],s[nmax];
  16. int main(){
  17. int N=read(),W=read(),u,v;
  18. rep(i,1,N) u=read(),a[i]=read();
  19. int r=0,ans=0;
  20. rep(i,1,N){
  21. while(r&&s[r]>a[i]) r--;
  22. if(s[r]!=a[i]) ans++;
  23. s[++r]=a[i];
  24. }
  25. printf("%d\n",ans);
  26. return 0;
  27. }

bzoj1627:

简单bfs。。。。

  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 clr(x,c) memset(x,c,sizeof(x))
  9. int read(){
  10. int x=0;char c=getchar();int f=1;
  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 f*x;
  16. }
  17. const int nmax=1005;
  18. const int orz=500;
  19. bool on[nmax][nmax],vis[nmax][nmax];
  20. int dist[nmax][nmax];
  21. struct node{
  22. int x,y;
  23. node(int x,int y):x(x),y(y){}
  24. };
  25. queue<node>q;
  26. int xx[5]={0,0,0,1,-1};
  27. int yy[5]={0,1,-1,0,0};
  28. int main(){
  29. int ta=read(),tb=read(),N=read(),u,v,d;
  30. ta+=orz,tb+=orz;
  31. clr(vis,false);clr(on,true);
  32. rep(i,1,N) u=read(),v=read(),on[u+orz][v+orz]=false;
  33. q.push(node(orz,orz));vis[orz][orz]=true;
  34. while(!q.empty()){
  35. node t=q.front();q.pop();
  36. rep(i,1,4){
  37. int tx=t.x+xx[i],ty=t.y+yy[i];
  38. if(tx&&ty&&tx<=1000&&ty<=1000&&!vis[tx][ty]&&on[tx][ty]) {
  39. vis[tx][ty]=true;dist[tx][ty]=dist[t.x][t.y]+1;
  40. q.push(node(tx,ty));
  41. if(tx==ta&&ty==tb){
  42. printf("%d\n",dist[tx][ty]);
  43. return 0;
  44. }
  45. }
  46. }
  47. }
  48. return 0;
  49. }

bzoj1626:

最小生成树。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<cmath>
  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=1005;
  17. const int maxn=1000005;
  18. int fa[nmax],xi[nmax],yi[nmax];
  19. struct edge{
  20. int from,to;double dist;
  21. bool operator<(const edge&rhs)const{
  22. return dist<rhs.dist;}
  23. };
  24. edge edges[maxn];
  25. int find(int x){
  26. return fa[x]==x?x:fa[x]=find(fa[x]);
  27. }
  28. int main(){
  29. int N=read(),M=read(),u,v,ta,tb;
  30. rep(i,1,N) xi[i]=read(),yi[i]=read();
  31. rep(i,1,N) fa[i]=i;
  32. rep(i,1,M){
  33. u=read(),v=read();
  34. ta=find(u),tb=find(v);
  35. if(ta!=tb) fa[ta]=tb;
  36. }
  37. int cnt=0;
  38. rep(i,1,N-1) rep(j,i+1,N) {
  39. edge &o=edges[++cnt];
  40. o.from=i,o.to=j;
  41. o.dist=sqrt((double)(xi[i]-xi[j])*(xi[i]-xi[j])+(double)(yi[i]-yi[j])*(yi[i]-yi[j]));
  42. }
  43. sort(edges+1,edges+cnt+1);
  44. //rep(i,1,cnt) printf("%d %d %lf\n",edges[i].from,edges[i].to,edges[i].dist);
  45. double ans=0;int res=M;
  46. rep(i,1,cnt){
  47. ta=find(edges[i].from);tb=find(edges[i].to);
  48. if(ta!=tb) fa[ta]=tb,ans+=edges[i].dist,res++;
  49. if(res==N-1) break;
  50. }
  51. printf("%.2lf\n",ans);
  52. return 0;
  53. }

bzoj1625:

背包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=3500;
  16. const int maxn=13000;
  17. int w[nmax],c[nmax];
  18. int dp[maxn];
  19. int main(){
  20. int N=read(),M=read();
  21. rep(i,1,N) w[i]=read(),c[i]=read();
  22. rep(i,1,N) dwn(j,M,w[i]) dp[j]=max(dp[j],dp[j-w[i]]+c[i]);
  23. printf("%d\n",dp[M]);
  24. return 0;
  25. }

bzoj1624:

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 clr(x,c) memset(x,c,sizeof(x))
  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. const int nmax=105;
  15. const int maxn=10005;
  16. int dist[nmax][nmax];
  17. int ans[maxn];
  18. int main(){
  19. int N=read(),M=read();
  20. rep(i,1,M) ans[i]=read();
  21. rep(i,1,N) rep(j,1,N) dist[i][j]=read();
  22. rep(k,1,N) rep(i,1,N) rep(j,1,N)
  23. dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
  24. int res=0;
  25. rep(i,1,M-1) res+=dist[ans[i]][ans[i+1]];
  26. printf("%d\n",res);
  27. return 0;
  28. }

bzoj1623:

贪心。。。

  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. int a[nmax];
  17. int main(){
  18. int N=read(),M=read(),D=read(),L=read();
  19. rep(i,1,N) a[i]=read();
  20. sort(a+1,a+N+1);
  21. int ans=0;
  22. rep(i,1,N){
  23. if(a[i]-ans/M*D>=L) ans++;
  24. }
  25. printf("%d\n",ans);
  26. return 0;
  27. }

bzoj1622:

乱搞。。(这种模拟题我总是很虚啊。。。

  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. const int nmax=1005;
  9. const int maxn=105;
  10. char s[nmax][nmax],t[maxn][35];
  11. int ans[nmax];
  12. int lena[nmax],lenb[nmax];
  13. int main(){
  14. int N,M;
  15. scanf("%d%d",&N,&M);
  16. rep(i,1,N) {
  17. scanf("%s",s[i]);
  18. lena[i]=strlen(s[i]);
  19. rep(j,0,lena[i]-1)
  20. if(s[i][j]<'a') s[i][j]+=32;
  21. }
  22. rep(i,1,M) {
  23. scanf("%s",t[i]);
  24. lenb[i]=strlen(t[i]);
  25. rep(j,0,lenb[i]-1)
  26. if(t[i][j]<'a') t[i][j]+=32;
  27. }
  28. rep(i,1,N) rep(j,1,M) {
  29. int p=0,pt=0;
  30. while(p<lena[i]&&pt<lenb[j]){
  31. if(s[i][p]==t[j][pt]) pt++;
  32. p++;
  33. }
  34. if(pt==lenb[j]) ans[i]++;
  35. }
  36. rep(i,1,N) printf("%d\n",ans[i]);
  37. return 0;
  38. }

bzoj1621:

递归。。。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. int read(){
  7. int x=0;char c=getchar();
  8. while(!isdigit(c)) c=getchar();
  9. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  10. return x;
  11. }
  12. int n,K;
  13. int dfs(int x){
  14. if((x+K)%2) return 1;
  15. if(x<=K) return 1;
  16. return dfs((x+K)/2)+dfs((x-K)/2);
  17. }
  18. int main(){
  19. n=read(),K=read();
  20. printf("%d\n",dfs(n));
  21. return 0;
  22. }

bzoj1620:

二分答案+贪心判断。。。

  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. 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. const int nmax=100005;
  15. const int inf=0x7f7f7f7f;
  16. int N,M,a[nmax];
  17. bool check(int x){
  18. int ans=0,cur=1,tmp;
  19. while(1){
  20. tmp=a[cur];
  21. if(tmp>x) return false;
  22. while(tmp<=x&&cur<=N) cur++,tmp+=a[cur];
  23. ans++;
  24. if(cur>N) break;
  25. }
  26. if(ans<=M) return true;
  27. return false;
  28. }
  29. int main(){
  30. N=read(),M=read();
  31. rep(i,1,N) a[i]=read();
  32. int l=0,r=inf,mid,ans=0;
  33. while(l<=r){
  34. mid=(l+r)>>1;
  35. if(check(mid)) ans=mid,r=mid-1;
  36. else l=mid+1;
  37. }
  38. printf("%d\n",ans);
  39. return 0;
  40. }

bzoj1618:

背包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=60005;
  16. const int maxn=105;
  17. const int inf=0x7f7f7f7f;
  18. int w[maxn],c[maxn];
  19. int f[nmax];
  20. int main(){
  21. int n=read(),h=read();
  22. rep(i,1,n) w[i]=read(),c[i]=read();
  23. clr(f,0x7f);f[0]=0;
  24. rep(i,1,n) rep(j,0,h) if(f[j]!=inf) f[j+w[i]]=min(f[j+w[i]],f[j]+c[i]);
  25. int ans=inf;
  26. rep(i,h,h+5005) ans=min(ans,f[i]);
  27. printf("%d\n",ans);
  28. return 0;
  29. }

bzoj1617:

区间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 x;
  10. int read(){
  11. 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=2505;
  17. const int inf=0x7f7f7f7f;
  18. int cost[nmax],dp[nmax];
  19. int main(){
  20. int n=read(),m=read();
  21. rep(i,1,n) cost[i]=read(),cost[i]+=cost[i-1];
  22. clr(dp,0x7f);dp[0]=0;
  23. rep(i,1,n) rep(j,0,i-1) dp[i]=min(dp[i],dp[j]+cost[i-j]+m+m);
  24. printf("%d\n",dp[n]-m);
  25. return 0;
  26. }

bzoj1616:

多加一维然后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=20;
  17. int dp[maxn][nmax][nmax],a[nmax][nmax];
  18. char s[nmax];
  19. int xx[5]={0,0,0,1,-1};
  20. int yy[5]={0,1,-1,0,0};
  21. int main(){
  22. int n=read(),m=read(),T=read();
  23. rep(i,1,n){
  24. scanf("%s",s);
  25. rep(j,1,m) a[i][j]=s[j-1]=='.'?1:0;
  26. }
  27. int sa=read(),ta=read(),sb=read(),tb=read();
  28. dp[0][sa][ta]=1;
  29. rep(i,1,T) rep(j,1,n) rep(k,1,m) {
  30. if(a[j][k]) {
  31. rep(o,1,4){
  32. int tx=j+xx[o],ty=k+yy[o];
  33. if(tx&&ty&&tx<=n&&ty<=m&&a[tx][ty]) dp[i][j][k]+=dp[i-1][tx][ty];
  34. }
  35. }else dp[i][j][k]=0;
  36. }
  37. printf("%d\n",dp[T][sb][tb]);
  38. return 0;
  39. }

bzoj1615:

乱搞。。。

  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();int f=1;
  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=205;
  18. int x[nmax],y[nmax];
  19. double ans[nmax];
  20. int main(){
  21. int n=read();
  22. rep(i,1,n) x[i]=read(),y[i]=read();
  23. int cnt=0;bool f=false;
  24. rep(i,1,n) rep(j,1,n) if(i!=j){
  25. if(x[i]==x[j]) f=true;
  26. else ans[++cnt]=(double)(y[i]-y[j])/(x[i]-x[j]);
  27. }
  28. sort(ans+1,ans+cnt+1);
  29. int res=0;
  30. if(cnt) res++;
  31. rep(i,2,cnt) if(ans[i]!=ans[i-1]) res++;
  32. if(f) res++;
  33. printf("%d\n",res);
  34. return 0;
  35. }

bzoj1612:

spfa求路径最小值。。。都是差不多的啦。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<queue>
  5. #include<algorithm>
  6. using namespace std;
  7. #define rep(i,s,t) for(int i=s;i<=t;i++)
  8. #define clr(x,c) memset(x,c,sizeof(x))
  9. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  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=10005;
  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,k;
  30. node(int x,int k):x(x),k(k){}
  31. };
  32. queue<node>q;
  33. int dist[nmax][nmax];
  34. bool inq[nmax][nmax];
  35. void spfa(int K,int n){
  36. clr(dist,0x7f);dist[1][0]=0;
  37. clr(inq,false);inq[1][0]=true;
  38. q.push(node(1,0));
  39. while(!q.empty()){
  40. node oo=q.front();q.pop();inq[oo.x][oo.k]=false;
  41. qwq(oo.x){
  42. int to=o->to;
  43. if(dist[to][oo.k]>max(dist[oo.x][oo.k],o->dist)) {
  44. dist[to][oo.k]=max(dist[oo.x][oo.k],o->dist);
  45. if(!inq[to][oo.k]){
  46. q.push(node(to,oo.k));inq[to][oo.k]=true;
  47. }
  48. }
  49. if(oo.k>=K) continue;
  50. if(dist[to][oo.k+1]>dist[oo.x][oo.k]){
  51. dist[to][oo.k+1]=dist[oo.x][oo.k];
  52. if(!inq[to][oo.k+1]){
  53. q.push(node(to,oo.k+1));inq[to][oo.k+1]=true;
  54. }
  55. }
  56. }
  57. }
  58. if(dist[n][K]==inf) printf("-1\n");
  59. else printf("%d\n",dist[n][K]);
  60. return ;
  61. }
  62. int main(){
  63. int n=read(),m=read(),p=read(),u,v,d;
  64. rep(i,1,m) u=read(),v=read(),d=read(),add(u,v,d);
  65. spfa(p,n);
  66. return 0;
  67. }

bzoj1612:

暴力dfsQAQ。。。

  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. #define qaq(x) for(edge *o=h[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=105;
  17. const int maxn=4505;
  18. const int inf=0x7f7f7f7f;
  19. struct edge{
  20. int to;edge *next;
  21. };
  22. edge edges[maxn],*pt=edges,*head[nmax];
  23. edge e[maxn],*p=e,*h[nmax];
  24. int ans[nmax];
  25. bool vis[nmax];
  26. void add(int u,int v){
  27. pt->to=v;pt->next=head[u];head[u]=pt++;
  28. p->to=u;p->next=h[v];h[v]=p++;
  29. }
  30. void dfs(int x){
  31. qwq(x) if(!vis[o->to]) ans[o->to]++,vis[o->to]=true,dfs(o->to);
  32. }
  33. void DFS(int x){
  34. qaq(x) if(!vis[o->to]) ans[o->to]++,vis[o->to]=true,DFS(o->to);
  35. }
  36. int main(){
  37. int n=read(),m=read(),u,v;
  38. rep(i,1,m) u=read(),v=read(),add(u,v);
  39. rep(i,1,n) {
  40. clr(vis,false);dfs(i);
  41. }
  42. rep(i,1,n){
  43. clr(vis,false);DFS(i);
  44. }
  45. int res=0;
  46. rep(i,1,n) if(ans[i]==n-1) res++;
  47. printf("%d\n",res);
  48. return 0;
  49. }

bzoj1611:

对于每个点,能转移到该点必定没有被炸,那么可以利用这一点性质在bfs时转移!。。

  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. 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=305;
  17. const int inf=0x7f7f7f7f;
  18. int map[nmax][nmax],dist[nmax][nmax];
  19. bool vis[nmax][nmax];
  20. struct node{
  21. int x,y;
  22. node(int x,int y):x(x),y(y){}
  23. };
  24. queue<node>q;
  25. int xx[5]={0,0,0,1,-1};
  26. int yy[5]={0,1,-1,0,0};
  27. int main(){
  28. int m=read(),u,v,d;
  29. clr(map,0x7f);
  30. rep(i,1,m) {
  31. u=read(),v=read(),d=read();map[u][v]=min(map[u][v],d);
  32. rep(k,1,4) if(u+xx[k]>=0&&v+yy[k]>=0) map[u+xx[k]][v+yy[k]]=min(d,map[u+xx[k]][v+yy[k]]);
  33. }
  34. if(map[0][0]==inf){
  35. printf("0\n");return 0;
  36. }
  37. q.push(node(0,0));
  38. clr(vis,false);vis[0][0]=true;dist[0][0]=0;
  39. while(!q.empty()){
  40. node o=q.front();q.pop();
  41. rep(i,1,4){
  42. int x=o.x,y=o.y,tx=x+xx[i],ty=y+yy[i];
  43. if(tx<0||ty<0||map[tx][ty]-1<=dist[x][y]||vis[tx][ty]) continue;
  44. if(map[tx][ty]==inf){
  45. printf("%d\n",dist[x][y]+1);return 0;
  46. }
  47. q.push(node(tx,ty));dist[tx][ty]=dist[x][y]+1;vis[tx][ty]=true;
  48. }
  49. }
  50. printf("-1\n");
  51. return 0;
  52. }

bzoj4395:

暴力+bfs。多次bfs就可以了。。

  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. 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=105;
  17. const int maxn=20005;
  18. const int inf=0x7f7f7f7f;
  19. struct edge{
  20. int to,too;edge *next;
  21. };
  22. edge edges[maxn],*pt=edges,*head[nmax][nmax];
  23. bool on[nmax][nmax],vis[nmax][nmax];
  24. void add(int x,int y,int d,int w){
  25. pt->to=d;pt->too=w;pt->next=head[x][y];head[x][y]=pt++;
  26. }
  27.  
  28. struct node{
  29. int a,b;
  30. node(int a,int b):a(a),b(b){}
  31. };
  32. queue<node>q;
  33.  
  34. int xx[5]={0,0,0,1,-1};
  35. int yy[5]={0,1,-1,0,0};
  36.  
  37. int main(){
  38. int n=read(),m=read();
  39. rep(i,1,m){
  40. int u=read(),v=read(),d=read(),w=read();
  41. add(u,v,d,w);
  42. }
  43. int ans=1,last=1;on[1][1]=true;
  44. while(1){
  45. q.push(node(1,1));
  46. clr(vis,0);vis[1][1]=true;
  47. while(!q.empty()){
  48. node x=q.front();q.pop();
  49. for(edge *o=head[x.a][x.b];o;o=o->next){
  50. if(!on[o->to][o->too]) on[o->to][o->too]=true,ans++;
  51. }
  52. rep(i,1,4){
  53. int tx=x.a+xx[i],ty=x.b+yy[i];
  54. if(tx&&ty&&tx<=n&&ty<=n){
  55. if(on[tx][ty]&&!vis[tx][ty])
  56. vis[tx][ty]=true,q.push(node(tx,ty));
  57. }
  58. }
  59. }
  60. if(last==ans) break;
  61. last=ans;
  62. }
  63. printf("%d\n",ans);
  64. return 0;
  65. }

bzoj1318:

神题。。这种题都不知道怎么想出来的。。。orzhzwer后勉勉强强懂了。。。然而太神了这。。。

  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=1000015;
  17. const int inf=0x7f7f7f7f;
  18. int n,ans=-1,last[nmax],next[nmax],a[nmax];
  19. ll sum[nmax];
  20. bool vis[nmax];
  21. void solve(int x){
  22. int len=0,rmax=inf;
  23. rep(i,x+1,n) {
  24. if(a[i]==1) break;
  25. if(!vis[a[i]]) vis[a[i]]=true;
  26. else {
  27. rmax=i;break;
  28. }
  29. }
  30. dwn(i,x,1){
  31. if(a[i]==1&&i!=x) break;
  32. rmax=min(rmax,next[i]);
  33. len=max(len,a[i]);
  34. if(i+len-1<=n&&i+len-1<rmax&&sum[i+len-1]-sum[i-1]==(ll)len*(len+1)/2) ans=max(ans,len);
  35. }
  36. rep(i,x+1,n) {
  37. if(a[i]==1) break;
  38. vis[a[i]]=false;
  39. }
  40. }
  41. void work(){
  42. clr(last,0x7f);
  43. dwn(i,n,1) {
  44. next[i]=last[a[i]];
  45. last[a[i]]=i;
  46. }
  47. rep(i,1,n) if(a[i]==1) solve(i);
  48. }
  49. int main(){
  50. n=read();
  51. rep(i,1,n) a[i]=read(),sum[i]=sum[i-1]+a[i];
  52. work();
  53. reverse(a+1,a+n+1);
  54. clr(sum,0);
  55. rep(i,1,n) sum[i]=sum[i-1]+a[i];
  56. work();
  57. printf("%d\n",ans);
  58. return 0;
  59. }

bzoj1306:

搜索+剪枝!。我写了三个剪枝但是tle了。到网上一看然后再加一个剪枝就卡过去了。。

  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 f[4]={3,1,0,0};
  14. int ans[9],a[9],res=0,n;
  15. void dfs(int x,int y){
  16. if(ans[x]>a[x]) return ;
  17. if(ans[x]+(n-y+1)*3<a[x]) return ;
  18. if(x==n) {
  19. res++;return ;
  20. }
  21. if(y==n){
  22. int tmp=a[x]-ans[x];
  23. if(tmp==2) return ;
  24. ans[y]+=f[tmp];
  25. dfs(x+1,x+2);
  26. ans[y]-=f[tmp];
  27. }else{
  28. ans[x]+=3;dfs(x,y+1);ans[x]-=3;
  29. ans[x]++,ans[y]++,dfs(x,y+1),ans[x]--,ans[y]--;
  30. ans[y]+=3;dfs(x,y+1),ans[y]-=3;
  31. }
  32. }
  33. int main(){
  34. n=read();
  35. rep(i,1,n) a[i]=read();
  36. dfs(1,2);
  37. printf("%d\n",res);
  38. return 0;
  39. }

bzoj1303:

大于的就+1,小于的就-1,求中位数子串有多少个。。然后乱搞就可以了。

  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=200005;
  16. const int inf=0x7f7f7f7f;
  17. int a[nmax],cnt[nmax],sum[nmax];//qi ou
  18. int main(){
  19. int n=read(),m=read(),cur,u;
  20. rep(i,1,n){
  21. a[i]=read();
  22. if(a[i]==m) cur=i;
  23. a[i]+=100000;
  24. }
  25. m+=100000;
  26. sum[100000]=1;a[0]=100000;
  27. rep(i,1,cur-1){
  28. if(a[i]>m) a[i]=a[i-1]+1;
  29. else a[i]=a[i-1]-1;
  30. if(i%2) cnt[a[i]]++;
  31. else sum[a[i]]++;
  32. }
  33. int ans=0;
  34. rep(i,cur,n){
  35. if(a[i]>m) a[i]=a[i-1]+1;
  36. else if(a[i]==m) a[i]=a[i-1];
  37. else a[i]=a[i-1]-1;
  38. if(i%2) ans+=sum[a[i]];
  39. else ans+=cnt[a[i]];
  40. }
  41. printf("%d\n",ans);
  42. return 0;
  43. }

  

8.3-8.7 usaco的更多相关文章

  1. USACO . Your Ride Is Here

    Your Ride Is Here It is a well-known fact that behind every good comet is a UFO. These UFOs often co ...

  2. 【USACO 3.1】Stamps (完全背包)

    题意:给你n种价值不同的邮票,最大的不超过10000元,一次最多贴k张,求1到多少都能被表示出来?n≤50,k≤200. 题解:dp[i]表示i元最少可以用几张邮票表示,那么对于价值a的邮票,可以推出 ...

  3. USACO翻译:USACO 2013 NOV Silver三题

    USACO 2013 NOV SILVER 一.题目概览 中文题目名称 未有的奶牛 拥挤的奶牛 弹簧牛 英文题目名称 nocow crowded pogocow 可执行文件名 nocow crowde ...

  4. USACO翻译:USACO 2013 DEC Silver三题

    USACO 2013 DEC SILVER 一.题目概览 中文题目名称 挤奶调度 农场航线 贝西洗牌 英文题目名称 msched vacation shuffle 可执行文件名 msched vaca ...

  5. USACO翻译:USACO 2014 DEC Silver三题

    USACO 2014 DEC SILVER 一.题目概览 中文题目名称 回程 马拉松 奶牛慢跑 英文题目名称 piggyback marathon cowjog 可执行文件名 piggyback ma ...

  6. USACO翻译:USACO 2012 FEB Silver三题

    USACO 2012 FEB SILVER 一.题目概览 中文题目名称 矩形草地 奶牛IDs 搬家 英文题目名称 planting cowids relocate 可执行文件名 planting co ...

  7. USACO翻译:USACO 2012 JAN三题(3)

    USACO 2012JAN(题目三) 一.题目概览 中文题目名称 放牧 登山 奶牛排队 英文题目名称 grazing climb lineup 可执行文件名 grazing climb lineup ...

  8. USACO翻译:USACO 2012 JAN三题(2)

    USACO 2012 JAN(题目二) 一.题目概览 中文题目名称 叠干草 分干草 奶牛联盟 英文题目名称 stacking baleshare cowrun 可执行文件名 stacking bale ...

  9. USACO翻译:USACO 2012 JAN三题(1)

    USACO 2012 JAN(题目一) 一.题目概览 中文题目名称 礼物 配送路线 游戏组合技 英文题目名称 gifts delivery combos 可执行文件名 gifts delivery c ...

  10. USACO翻译:USACO 2013 JAN三题(1)

    USACO 2013 JAN 一.题目概览 中文题目名称 镜子 栅栏油漆 奶牛排队 英文题目名称 mirrors paint lineup 可执行文件名 mirrors paint lineup 输入 ...

随机推荐

  1. Android基于GridView实现的翻牌游戏效果

    好久没有写博客了,上一篇博文距现在都有三个多月了,实在是惭愧.但是这段时间仍然是在忙于项目或是自我充电.这几天实现了一个基于GridView的翻牌动画效果,这里就将其整理出来同各位分享. 一.整体介绍 ...

  2. Oracle RAC LoadBalance

    LoadBalance 就是把负载平均的分配到集群中的各个节点,从而提高整体的吞吐能力. Oracle 10g RAC 提供了两种不同的方法来分散负载: 通过Connection Balancing, ...

  3. 升级python版本导致Django无法使用的解决办法

    运行环境是CentOS6.2 x86_64,在把python从2.6.6升级到2.7.5后,由于环境变量的改变,在python代码中再import django的话将会出现以下报错:   “No mo ...

  4. MenuItem

    private void 文件ToolStripMenuItem_Click(object sender, EventArgs e) { MessageBox.Show("打开测试" ...

  5. ios NavBar+TarBar技巧

    NavBar+TarBar iphone开发 NavBar+TarBar 1  改变NavBar颜色:选中Navigation Bar 的Tint属性.选中颜色. 2  隐藏“back”按钮: sel ...

  6. EXTJS 4.2 资料 控件之Grid Columns 列renderer 绑定事件

    columns: [ { header: '序号', xtype: 'rownumberer', align: 'center', width: 100 }, { header: 'CompanyId ...

  7. DB天气app冲刺第九天

    今天已经是冲刺的第九天了.应该算是进入了冲刺的后半期了.今天的android界面UI设计基本完成了.但还是有一些的bug,自己怎么也调不好,明天需要请教一下大神去. 今天已经把昨天布置的任务完成了.昨 ...

  8. Code for the Homework1

    作业要求: http://www.cnblogs.com/bingc/p/4919692.html 代码(未使用Eigen): #include <iostream> #include & ...

  9. hdu 4740 The Donkey of Gui Zhou(暴力搜索)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4740 [题意]: 森林里有一只驴和一只老虎,驴和老虎互相从来都没有见过,各自自己走过的地方不能走第二次 ...

  10. Extjs4.2——bbar的默认类型(xtype)

    bbar:在Panel经常使用的工具栏 如下面的示例——这将牵涉本文要追寻的问题:在下面的Panel中的bbar第一个组件明确指定的xtype:'button',第二个没有明确指出,那么它是何类型,为 ...