http://cdn.ac.nbutoj.com/Problem/view.xhtml?id=1541html
When rain, nocLyt discovered a magical phenomenon that the rainwater always flow to the low-lying place.ios |
我之後都在題解裏放一小段題目,讓人更容易搜到,有沒有頗有想法!(咦這樣好像放所有的題目更容易被搜到啊)(不過那樣好像比較亂啊)ide
[1541] Rainwater 時間限制: 3000 ms 內存限制: 262144 K 問題描述 When rain, nocLyt discovered a magical phenomenon that the rainwater always flow to the low-lying place. Now, there is a N * N grid matrix (four Unicom) and above the first row was constantly raining. I have to tell you some rules: 1. Each grid is solid (represented as black) initially, the rain cannot flow into the solid grid. 2. You can "Open" a grid, if you "Open" that grid, that grid will becomes hollow (represented as white). 3. Rainwater can flow from top to bottom and from left to right (also right to left), but the precondition is that they are both hollow grid. (grid fill with rainwater represented as blue) You can get more information from below picture. Figure: from left to right are executed 50 times, 100 times, 150 times, 204 times "Open" operation. We have three operation: 1. O i j: "Open" the grid (i, j). 2. F i j: You should tell me whether the grid(i, j) filled with rainwater. If yes, you should output 1, otherwise output 0. 4. C: You should tell me whether the rainwater has flow to the last row. If yes, you should output 1, otherwise output 0. Note: The grid matrix from top to bottom number 1 to N, from left to right number 1 to N. 輸入 There are multiple test cases, each test case contains two positive integers N (1 <= N <= 5000) and M (1 <= M <= 1000000). Following M lines, each line contain one of the three operation: 1. O i j (1 <= i, j <= N) 2. F i j (1 <= i, j <= N) 3. C 輸出 Output the answer. 樣例輸入 3 7 O 1 1 F 2 1 O 2 1 F 2 1 C O 3 1 C 樣例輸出 0 1 0 1 提示 無來源 nocLyt @SDAU
我把題目隱藏成一行,這樣就不亂,並且好像也能被搜到。不過這樣格式有點逗,要看題目仍是點連接去看好了。spa
好下面來講這題Rainwater:code
看圖比較容易懂意思,就是你的三種操做是開某個孔,查某個孔有沒有進水,查最下面一行有沒有水。水會從最上面一行出現,而後隨便亂流,看最後一個圖能夠知道它會往上流。orm
看完題目,這不就是超水的深搜嗎!cdn
把地圖從1開始,第0行先灌滿水。每次開一塊的時候,若是四個方向沒水,那這一塊確定沒水。若是有水,那就把這格填上水,而且深搜一波,把能到的地方都水了。這樣每格最多水一次,複雜度超低。而後它詢問某個孔的時候就直接答,詢問最下面這行的話也直接答,搜的時候記得記最下面這行有沒有水,不要在查的時候才查一整行,這個但是要問100W個問題的,地圖只有5000*5000,最下面那一行有5000個格子啊,你敢每次搜一下嗎!htm
總之就是搜就過啦,深搜王,我咧哇納魯!blog
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define ll long long 6 const int MAXN=5555; 7 const int gx[4]={0,0,-1,1}; 8 const int gy[4]={-1,1,0,0}; 9 int a[MAXN][MAXN]; 10 int n,m,flagc; 11 12 void dfs(int x,int y) 13 { 14 int i; 15 a[x][y]=2; 16 if(x==n) flagc=1; 17 for(i=0;i<4;i++) 18 if(a[x+gx[i]][y+gy[i]]==1) dfs(x+gx[i],y+gy[i]); 19 } 20 21 void open(int x,int y) 22 { 23 int i,j; 24 if(a[x][y]!=0) return; 25 a[x][y]=1; 26 for(i=0;i<4;i++) 27 if(a[x+gx[i]][y+gy[i]]==2){a[x][y]=2;break;} 28 if(a[x][y]==1) return; 29 dfs(x,y); 30 } 31 32 int main() 33 { 34 char c; 35 int x,y,i; 36 while(scanf("%d%d",&n,&m)!=EOF) 37 { 38 memset(a,0,sizeof(a)); 39 for(i=1;i<=n;i++) 40 a[0][i]=2; 41 flagc=0; 42 for(i=0;i<m;i++) 43 { 44 //cout<<i<<"!"<<endl; 45 do{scanf("%c",&c);}while(c=='\n' || c==' '); 46 if(c!='C') 47 { 48 scanf("%d%d",&x,&y); 49 if(c=='O') open(x,y); 50 else if (c=='F') 51 { 52 printf("%d\n",a[x][y]==2); 53 } 54 } 55 else 56 { 57 printf("%d\n",flagc); 58 } 59 } 60 } 61 return 0; 62 }