標籤:c style class blog code a
http://cdn.ac.nbutoj.com/Problem/view.xhtml?id=1541
When rain, nocLyt discovered a magical phenomenon that the rainwater always flow to the low-lying place. |
我以後都在題解裡放一小段題目,讓人更容易搜到,有沒有很有想法!(咦這樣好像放全部的題目更容易被搜到啊)(不過那樣好像比較亂啊)
[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 7O 1 1F 2 1O 2 1F 2 1CO 3 1C範例輸出 0101提示 無來源 nocLyt @SDAU
題目
我把題目隱藏成一行,這樣就不亂,而且好像也能被搜到。不過這樣格式有點逗,要看題目還是點連結去看好了。
好下面來說這題Rainwater:
看圖比較容易懂意思,就是你的三種操作是開某個孔,查某個孔有沒有進水,查最下面一行有沒有水。水會從最上面一行出現,然後隨便亂流,看最後一個圖可以知道它會往上流。
看完題目,這不就是超水的深搜嗎!
把地圖從1開始,第0行先灌滿水。每次開一塊的時候,如果四個方向沒水,那這一塊肯定沒水。如果有水,那就把這格填上水,並且深搜一波,把能到的地方都水了。這樣每格最多水一次,複雜度超低。然後它詢問某個孔的時候就直接答,詢問最下面這行的話也直接答,搜的時候記得記最下面這行有沒有水,不要在查的時候才查一整行,這個可是要問100W個問題的,地圖只有5000*5000,最下面那一行有5000個格子啊,你敢每次搜一下嗎!
總之就是搜就過啦,深搜王,我咧哇納魯!
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 else56 {57 printf("%d\n",flagc);58 }59 }60 }61 return 0;62 }
View Code