考试反思(2019/1/22)
今天是noip2017d2测验
因为没开longlong写挂t1是一种什么样的体验???
1.奶酪
因为最近在练dfs,就十分钟写出dfs然后过了样例就交了不管了。
就不放代码了,看下次再写还记不记得开longlong
2.宝藏
其实之前刷状压时做过,写起来还好,中间因为剪错了枝,一度调试到不知所措。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 const int maxn=1e4+5; 2 int f[1<<12],d[20],e[20][20]; 3 int n,m,ans=0x3f3f3f3f,num; 4 void read() 5 { 6 memset(e,0x3f,sizeof(e)); 7 n=quick(); 8 m=quick(); 9 int x,y,l; 10 for(int i=1;i<=m;i++) 11 { 12 x=quick(); 13 y=quick(); 14 l=quick(); 15 e[x][y]=e[y][x]=min(e[x][y],l); 16 } 17 } 18 void dfs(int now) 19 { 20 //printf("%d\n",now); 21 if(num==n) 22 { 23 ans=min(ans,f[(1<<n)-1]); 24 /*printf("%d\n",ans); 25 for(int i=1;i<=n;i++) 26 printf("%d ",d[i]); 27 printf("\n");*/ 28 return; 29 } 30 for(int i=1;i<=n;i++) 31 { 32 if((now&(1<<i-1))==0) 33 continue; 34 for(int j=1;j<=n;j++) 35 { 36 if(d[j]) 37 continue; 38 if((1<<j-1)&now) 39 continue; 40 if(e[i][j]==0x3f3f3f3f) 41 continue; 42 //if(f[now]+e[i][j]*d[i]>f[(1<<n)-1]) 43 //break; 44 if(f[now]+e[i][j]*d[i]<f[now|(1<<j-1)]) 45 { 46 num++; 47 f[now|(1<<j-1)]=f[now]+e[i][j]*d[i]; 48 int t=d[j]; 49 d[j]=d[i]+1; 50 dfs(now|(1<<j-1)); 51 //f[now|(1<<j-1)]-=e[i][j]*d[i]; 52 d[j]=t; 53 num--; 54 } 55 } 56 } 57 } 58 void work() 59 { 60 for(int i=1;i<=n;i++) 61 { 62 memset(f,0x3f,sizeof(f)); 63 memset(d,0,sizeof(d)); 64 num=1; 65 d[i]=1; 66 f[1<<i-1]=0; 67 dfs(1<<i-1); 68 ans=min(ans,f[(1<<n)-1]); 69 } 70 printf("%d",ans); 71 }
3.列队
先写了个30分代码,然后考试剩下的一个多小时全花在攻克n==1那4组数据上了,用鬼畜的线段树没有做出来,不过好歹练习了下线段树模版
30分+失败的线段树
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 const int maxn=1e6+5; 2 int n,m,q,ans,mark1,mark2; 3 int a[1005][1005]; 4 int sum[maxn],lazytag[maxn],b[maxn]; 5 void build(int l,int r,int x,int y,int z) 6 { 7 if(x==y) 8 { 9 if(x==m) 10 mark1=z; 11 sum[z]=0; 12 return; 13 } 14 int j=(x+y)>>1; 15 build(l,r,x,j,z<<1); 16 build(l,r,j+1,y,z<<1|1); 17 } 18 void pushdown(int x,int y,int z) 19 { 20 if(!lazytag[z]) 21 return; 22 lazytag[z<<1]=lazytag[z<<1|1]=lazytag[z]; 23 lazytag[z]=0; 24 } 25 void query(int u,int x,int y,int z) 26 { 27 if(u==x&&u==y) 28 { 29 ans=b[u+lazytag[z]]; 30 return; 31 } 32 pushdown(x,y,z); 33 int j=(x+y)>>1; 34 if(u<=j) 35 query(u,x,j,z<<1); 36 if(u>j) 37 query(u,j+1,y,z<<1|1); 38 39 } 40 void change1(int l,int r,int x,int y,int z) 41 { 42 if(l<=x&&r>=y) 43 { 44 lazytag[z]++; 45 return; 46 } 47 pushdown(x,y,z); 48 int j=(x+y)>>1; 49 if(l<=j) 50 change1(l,r,x,j,z<<1); 51 if(r>j) 52 change1(l,r,j+1,y,z<<1|1); 53 } 54 void change2(int u,int x,int y,int z) 55 { 56 if(u==x&&u==y) 57 { 58 lazytag[mark1]+=b[u]-b[m+lazytag[mark1]]; 59 return; 60 } 61 pushdown(x,y,z); 62 int j=(x+y)>>1; 63 if(u<=j) 64 change2(u,x,j,z<<1); 65 if(u>j) 66 change2(u,j+1,y,z<<1|1); 67 } 68 int main() 69 { 70 input(); 71 n=quick(); 72 m=quick(); 73 q=quick(); 74 if(n!=1&&n<=1000&&m<=1000) 75 { 76 for(int i=1;i<=n;i++) 77 for(int j=1;j<=m;j++) 78 a[i][j]=(i-1)*m+j; 79 int x,y; 80 for(int i=1;i<=q;i++) 81 { 82 x=quick(); 83 y=quick(); 84 printf("%d\n",a[x][y]); 85 int t=a[x][y]; 86 for(int i=y+1;i<=m;i++) 87 a[x][i-1]=a[x][i]; 88 for(int i=x+1;i<=n;i++) 89 a[i-1][m]=a[i][m]; 90 a[n][m]=t; 91 } 92 } 93 if(n==1) 94 { 95 for(int i=1;i<=m;i++) 96 b[i]=i; 97 build(1,m,1,m,1); 98 int x,y; 99 for(int i=1;i<=q;i++) 100 { 101 x=quick(); 102 y=quick(); 103 query(y,1,m,1); 104 if(ans%m>0) 105 ans%=m; 106 printf("%d\n",ans); 107 change1(y,m-1,1,m,1); 108 change2(ans,1,m,1); 109 } 110 } 111 return 0; 112 }