纪中游记(四)
20190805
写在前面的话
今天的题竟然全是模拟!!!
太有趣了。
T0
初
哇,这一题是真的简单。
如果是管道,只需要处理周围与它联通的方格,例如
1 //莫名其妙的空行 2 if(ch=='|') 3 op[i-1][j]+=200,op[i+1][j]+=1000; 4 else if(ch=='-') 5 op[i][j-1]+=4,op[i][j+1]+=30; 6 else if(ch=='+') 7 op[i-1][j]+=200,op[i+1][j]+=1000,op[i][j-1]+=4,op[i][j+1]+=30; 8 else if(ch=='1'||ch=='2'||ch=='3'||ch=='4') 9 { 10 if(ch-'0'==1) op[i][j+1]+=30,op[i+1][j]+=1000; 11 else if(ch-'0'==2) op[i-1][j]+=200,op[i][j+1]+=30; 12 else if(ch-'0'==3) op[i][j-1]+=4,op[i-1][j]+=200; 13 else if(ch-'0'==4) op[i][j-1]+=4,op[i+1][j]+=1000; 14 } 15 else if(ch=='M') 16 op[i-1][j]+=200,op[i+1][j]+=1000,op[i][j-1]+=4,op[i][j+1]+=30; 17 else if(ch=='Z') 18 op[i-1][j]+=200,op[i+1][j]+=1000,op[i][j-1]+=4,op[i][j+1]+=30;
之后再打一个循环找到遗失的管道就行了
1 if(op[i][j]==1200) 2 { 3 cout<<i<<" "<<j<<" "<<'|'; 4 return 0; 5 } 6 else if(op[i][j]==34) 7 { 8 cout<<i<<" "<<j<<" "<<'-'; 9 return 0; 10 } 11 else if(op[i][j]==1234) 12 { 13 cout<<i<<" "<<j<<" "<<'+'; 14 return 0; 15 } 16 else if(op[i][j]==1030) 17 { 18 cout<<i<<" "<<j<<" "<<'3'; 19 return 0; 20 } 21 else if(op[i][j]==230) 22 { 23 cout<<i<<" "<<j<<" "<<'4'; 24 return 0; 25 } 26 else if(op[i][j]==204) 27 { 28 cout<<i<<" "<<j<<" "<<'1'; 29 return 0; 30 } 31 else if(op[i][j]==1004) 32 { 33 cout<<i<<" "<<j<<" "<<'2'; 34 return 0; 35 } 36 else continue;
复
毫无悬念的AC。(第一次写‘复’这么水)
终
细心就可以。
T1
初
当初看这题的时候,就直接跳过了。
复
土法
完全模拟,结果时间爆炸
正解
只用关注移动的点,然后再模拟
1 #include<bits/stdc++.h> 2 using namespace std; 3 int r,c,op[30][30]; 4 int main() 5 { 6 scanf("%d%d",&r,&c); 7 for(register int i=1;i<=r;i++) 8 { 9 for(register int j=1;j<=c;j++) 10 { 11 char ch; 12 cin>>ch; 13 if(ch=='.'); 14 else 15 { 16 op[i][j]+=10000; 17 if(ch=='|') 18 op[i-1][j]+=200,op[i+1][j]+=1000; 19 else if(ch=='-') 20 op[i][j-1]+=4,op[i][j+1]+=30; 21 else if(ch=='+') 22 op[i-1][j]+=200,op[i+1][j]+=1000,op[i][j-1]+=4,op[i][j+1]+=30; 23 else if(ch=='1'||ch=='2'||ch=='3'||ch=='4') 24 { 25 if(ch-'0'==1) op[i][j+1]+=30,op[i+1][j]+=1000; 26 else if(ch-'0'==2) op[i-1][j]+=200,op[i][j+1]+=30; 27 else if(ch-'0'==3) op[i][j-1]+=4,op[i-1][j]+=200; 28 else if(ch-'0'==4) op[i][j-1]+=4,op[i+1][j]+=1000; 29 } 30 else if(ch=='M') 31 op[i-1][j]+=200,op[i+1][j]+=1000,op[i][j-1]+=4,op[i][j+1]+=30; 32 else if(ch=='Z') 33 op[i-1][j]+=200,op[i+1][j]+=1000,op[i][j-1]+=4,op[i][j+1]+=30; 34 } 35 } 36 } 37 for(register int i=1;i<=r;i++) 38 { 39 for(register int j=1;j<=c;j++) 40 { 41 if(op[i][j]>=10000) 42 continue; 43 if(op[i][j]==1200) 44 { 45 cout<<i<<" "<<j<<" "<<'|'; 46 return 0; 47 } 48 else if(op[i][j]==34) 49 { 50 cout<<i<<" "<<j<<" "<<'-'; 51 return 0; 52 } 53 else if(op[i][j]==1234) 54 { 55 cout<<i<<" "<<j<<" "<<'+'; 56 return 0; 57 } 58 else if(op[i][j]==1030) 59 { 60 cout<<i<<" "<<j<<" "<<'3'; 61 return 0; 62 } 63 else if(op[i][j]==230) 64 { 65 cout<<i<<" "<<j<<" "<<'4'; 66 return 0; 67 } 68 else if(op[i][j]==204) 69 { 70 cout<<i<<" "<<j<<" "<<'1'; 71 return 0; 72 } 73 else if(op[i][j]==1004) 74 { 75 cout<<i<<" "<<j<<" "<<'2'; 76 return 0; 77 } 78 else continue; 79 } 80 } 81 }
终
我竟然直接放弃了,亏
T2
初
完全暴力模拟水了50分。开心
复
T3
初
直接模拟,结果才7.7分,what?
复
正解听说是一个叫差分树状数组的东西,实际上在进阶指南上就有,十分清晰易懂。
其实只用差分的原理就可以实现区间修改。
1 #include<bits/stdc++.h> 2 using namespace std; 3 inline int read() 4 { 5 int x=0; 6 char ch=getchar(); 7 while(ch<'0'||ch>'9') 8 { 9 ch=getchar(); 10 } 11 while(ch>='0'&&ch<='9') 12 { 13 x=(x<<1)+(x<<3)+ch-'0'; 14 ch=getchar(); 15 } 16 return x; 17 } 18 struct jkl 19 { 20 int x,y; 21 }op[100005]; 22 int n,m,a[100005],re[100005]; 23 void add(int xx,int yy) 24 { 25 while(xx<=m) 26 { 27 a[xx]++; 28 xx+=((xx)&(-xx)); 29 } 30 while(yy<=m) 31 { 32 a[yy]--; 33 yy+=((yy)&(-yy)); 34 } 35 } 36 inline int ask(int xx) 37 { 38 int num=0; 39 while(xx) 40 { 41 num+=a[xx]; 42 xx-=((xx)&(-xx)); 43 } 44 return num; 45 } 46 int main() 47 { 48 n=read(); 49 for(register int i=1;i<=n;i++) 50 { 51 int l,r; 52 l=read(),r=read(); 53 op[i].x=l,op[i].y=r; 54 m=max(m,r); 55 } 56 for(register int i=1;i<=n;i++) 57 { 58 int anl=ask(op[i].x),anr=ask(op[i].y); 59 printf("%d\n",anr+anl-re[op[i].x]-re[op[i].y]); 60 re[op[i].x]=max(re[op[i].x],anl); 61 re[op[i].y]=max(re[op[i].y],anr); 62 add(op[i].x+1,op[i].y); 63 } 64 return 0; 65 }
终
转化很重要!