XMU 1614 刘备闯三国之三顾茅庐(二) 【逆向思维+二维并查集】

1614: 刘备闯三国之三顾茅庐(二)

Time Limit: 1000 MS  Memory Limit: 128 MB
Submit: 15  Solved: 5
[Submit][Status][Web Board]

Description

 

        刘备(161年-223年6月10日),字玄德,东汉末年幽州涿郡涿县,西汉中山靖王刘胜的后代。刘备一生极具传奇色彩,早年颠沛流离、备尝艰辛最终却凭借自己的谋略终成一方霸主。那么在那个风云激荡的年代,刘备又是如何从一个卖草鞋的小人物一步一步成为蜀汉的开国皇帝呢?让我们一起拨开历史的迷雾,还原一个真实的刘备。

 

      公元207年冬至,当时驻军新野的刘备在徐庶的建议下,到南阳卧龙岗拜访诸葛亮。这是刘备第二次拜访诸葛亮的故事。三国演义记载的事,由于诸葛亮被朋友邀请不在家中,刘备再次无功而返。然而据我翻阅古籍发现:其实诸葛亮是抛出了如下的问题,想考察刘备本人的谋略、以确定其是否是自己要效忠的那个人:

        这是关于战斗的题目。首先我们将战场分割成n*m个区域,诸葛亮每次可以指挥一只军队占领某一行连续的几个格子或者某一列连续的几个格子。诸葛亮会进行q次操作,他想知道每一次操作后,战场被分割成了几个区域?

        刘备为人英明神武,但对此类问题也是束手无策,所以这个任务又要交给刘备身边的小跟班——也就是你来解决了。

 

 

 

 

Input

 第一行包含3个整数n,m,q(1<=n,m<=1000,1<=q<=10000)。

接下来有q行,每一行包括4个整数x1,x2,y1,y2(保证有x1=x2或者y1=y2),表示诸葛亮将派遣军队占领(x1,y1)到(x2,y2)这一行/列的区域。

 

Output

 对于每一次操作,输出当前战场被分割成几个区域。

初始时,战场为1个区域。

Sample Input

4 6 5
2 2 2 6
1 3 4 3
2 5 3 5
4 6 4 6
1 6 4 6

Sample Output

1
3
3
4
3

HINT

 

 样例每一次操作后的战场如下:


 

Source

[Submit][Status][Web Board]

 

 

题目链接:

  http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1614

题目大意:

  一个N*M的矩形网格,Q个操作,每次操作会输入x1 y1 x2 y2,使(x1,y1)到(x2,y2)的成为障碍(保证x1=x2 或y1=y2,为一行或一列的连续格子)

  问每次操作后网格内的联通块数量(不含障碍)。

题目思路:

  【逆向思维+二维并查集】

  首先将问题反过来做,每次删去一些障碍,求联通块数量。

  先将所有数据读入,之后用二维并查集统计联通块数量。

  接下来每次都可能删除某些障碍,将新的方格看作新的联通块,然后判断是否会让之前的联通块连通,增减答案。

  最后正序输出答案即可。

 

  1 /****************************************************
  2       
  3     Author : Coolxxx
  4     Copyright 2017 by Coolxxx. All rights reserved.
  5     BLOG : http://blog.csdn.net/u010568270
  6       
  7 ****************************************************/
  8 #include<bits/stdc++.h>
  9 #pragma comment(linker,"/STACK:1024000000,1024000000")
 10 #define abs(a) ((a)>0?(a):(-(a)))
 11 #define lowbit(a) (a&(-a))
 12 #define sqr(a) ((a)*(a))
 13 #define mem(a,b) memset(a,b,sizeof(a))
 14 const double EPS=1e-8;
 15 const int J=10;
 16 const int MOD=100000007;
 17 const int MAX=0x7f7f7f7f;
 18 const double PI=3.14159265358979323;
 19 const int N=1004;
 20 const int M=10004;
 21 using namespace std;
 22 typedef long long LL;
 23 double anss;
 24 LL aans;
 25 int cas,cass;
 26 int n,m,lll,ans;
 27 int num[N][N],sz[N][N];
 28 int fa[N][N][2];
 29 int f[M];
 30 int dx[]={-1,0,1,0};
 31 int dy[]={0,1,0,-1};
 32 struct xxx
 33 {
 34     int x1,y1,x2,y2;
 35 }q[M];
 36 void zhao(int x,int y,int &fx,int &fy)
 37 {
 38     if((fa[x][y][0]==x && fa[x][y][1]==y) || (!fa[x][y][0] && !fa[x][y][1]))
 39     {
 40         fx=x,fy=y;
 41         return;
 42     }
 43     zhao(fa[x][y][0],fa[x][y][1],fx,fy);
 44     fa[x][y][0]=fx;
 45     fa[x][y][1]=fy;
 46 }
 47 void print()
 48 {
 49     int i,j;
 50     for(i=1;i<=n;i++)
 51     {
 52         for(j=1;j<=m;j++)
 53             printf("%d ",num[i][j]);
 54         puts("");
 55     }
 56     puts("");
 57     for(i=1;i<=n;i++)
 58     {
 59         for(j=1;j<=m;j++)
 60             printf("%d,%d ",fa[i][j][0],fa[i][j][1]);
 61         puts("");
 62     }
 63     puts("");
 64     for(i=1;i<=n;i++)
 65     {
 66         for(j=1;j<=m;j++)
 67             printf("%d ",sz[i][j]);
 68         puts("");
 69     }
 70     puts("");
 71 }
 72 int main()
 73 {
 74     #ifndef ONLINE_JUDGE
 75     freopen("1.txt","r",stdin);
 76 //  freopen("2.txt","w",stdout);
 77     #endif
 78     int i,j,k;
 79     int x,y,z;
 80 //  for(scanf("%d",&cass);cass;cass--)
 81 //  for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
 82 //  while(~scanf("%s",s))
 83     while(~scanf("%d",&n))
 84     {
 85         mem(num,0);mem(sz,0);mem(fa,0);mem(f,0);
 86         scanf("%d%d",&m,&cass);
 87         for(i=1;i<=cass;i++)
 88         {
 89             scanf("%d%d%d%d",&q[i].x1,&q[i].y1,&q[i].x2,&q[i].y2);
 90             if(q[i].x1==q[i].x2)
 91             {
 92                 if(q[i].y1>q[i].y2)swap(q[i].y1,q[i].y2);
 93                 for(j=q[i].y1;j<=q[i].y2;j++)
 94                     num[q[i].x1][j]++;
 95             }
 96             else
 97             {
 98                 if(q[i].x1>q[i].x2)swap(q[i].x1,q[i].x2);
 99                 for(j=q[i].x1;j<=q[i].x2;j++)
100                     num[j][q[i].y1]++;
101             }
102         }
103         for(i=1;i<=n;i++)
104         {
105             for(j=1;j<=m;j++)
106             {
107                 for(k=0;k<4;k++)
108                 {
109                     x=i+dx[k];
110                     y=j+dy[k];
111                     if(x<1 || x>n || y<1 || y>m || num[i][j] || num[x][y])continue;
112                     int fx1,fy1,fx2,fy2;
113                     zhao(i,j,fx1,fy1);
114                     zhao(x,y,fx2,fy2);
115                     if(fx1==fx2 && fy1==fy2)continue;
116                     fa[fx2][fy2][0]=fx1;
117                     fa[fx2][fy2][1]=fy1;
118                 }
119             }
120         }
121         for(i=1;i<=n;i++)
122         {
123             for(j=1;j<=m;j++)
124             {
125                 zhao(i,j,fa[i][j][0],fa[i][j][1]);
126                 if(!sz[fa[i][j][0]][fa[i][j][1]] && !num[i][j])f[cass+1]++;
127                 sz[fa[i][j][0]][fa[i][j][1]]++;
128             }
129         }
130         for(i=cass;i>1;i--)
131         {
132             f[i]=f[i+1];
133             if(q[i].x1==q[i].x2)
134             {
135                 for(j=q[i].y1;j<=q[i].y2;j++)
136                 {
137                     num[q[i].x1][j]--;
138                     if(num[q[i].x1][j]==0)
139                     {
140                         f[i]++;
141                         for(k=0;k<4;k++)
142                         {
143                             x=q[i].x1+dx[k];
144                             y=j+dy[k];
145                             if(x<1 || x>n || y<1 || y>m || num[x][y])continue;
146                             int fx1,fy1,fx2,fy2;
147                             zhao(q[i].x1,j,fx1,fy1);
148                             zhao(x,y,fx2,fy2);
149                             if(fx1==fx2 && fy1==fy2)continue;
150                             fa[fx2][fy2][0]=fx1;
151                             fa[fx2][fy2][1]=fy1;
152                             f[i]--;
153                         }
154                     }
155                 }
156             }
157             else
158             {
159                 for(j=q[i].x1;j<=q[i].x2;j++)
160                 {
161                     num[j][q[i].y1]--;
162                     if(num[j][q[i].y1]==0)
163                     {
164                         f[i]++;
165                         for(k=0;k<4;k++)
166                         {
167                             x=j+dx[k];
168                             y=q[i].y1+dy[k];
169                             if(x<1 || x>n || y<1 || y>m || num[x][y])continue;
170                             int fx1,fy1,fx2,fy2;
171                             zhao(j,q[i].y1,fx1,fy1);
172                             zhao(x,y,fx2,fy2);
173                             if(fx1==fx2 && fy1==fy2)continue;
174                             fa[fx2][fy2][0]=fx1;
175                             fa[fx2][fy2][1]=fy1;
176                             f[i]--;
177                         }
178                     }
179                 }
180             }
181         }
182         for(i=2;i<=cass+1;i++)
183             printf("%d\n",f[i]);
184         //print();
185     }
186     return 0;
187 }
188 /*
189 //
190   
191 //
192 */
View Code

 

posted @ 2017-04-23 22:33  Cool639zhu  阅读(371)  评论(0编辑  收藏  举报