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 6Sample Output
1
3
3
4
3HINT
样例每一次操作后的战场如下:
Source
题目链接:
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,为一行或一列的连续格子)
问每次操作后网格内的联通块数量(不含障碍)。
题目思路:
【逆向思维+二维并查集】
首先将问题反过来做,每次删去一些障碍,求联通块数量。
先将所有数据读入,之后用二维并查集统计联通块数量。
接下来每次都可能删除某些障碍,将新的方格看作新的联通块,然后判断是否会让之前的联通块连通,增减答案。
最后正序输出答案即可。
/****************************************************
Author : Coolxxx
Copyright 2017 by Coolxxx. All rights reserved.
BLOG : http://blog.csdn.net/u010568270
****************************************************/
#include<bits/stdc++.h>
#pragma comment(linker,"/STACK:1024000000,1024000000")
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) ((a)*(a))
#define mem(a,b) memset(a,b,sizeof(a))
const double EPS=1e-;
const int J=;
const int MOD=;
const int MAX=0x7f7f7f7f;
const double PI=3.14159265358979323;
const int N=;
const int M=;
using namespace std;
typedef long long LL;
double anss;
LL aans;
int cas,cass;
int n,m,lll,ans;
int num[N][N],sz[N][N];
int fa[N][N][];
int f[M];
int dx[]={-,,,};
int dy[]={,,,-};
struct xxx
{
int x1,y1,x2,y2;
}q[M];
void zhao(int x,int y,int &fx,int &fy)
{
if((fa[x][y][]==x && fa[x][y][]==y) || (!fa[x][y][] && !fa[x][y][]))
{
fx=x,fy=y;
return;
}
zhao(fa[x][y][],fa[x][y][],fx,fy);
fa[x][y][]=fx;
fa[x][y][]=fy;
}
void print()
{
int i,j;
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
printf("%d ",num[i][j]);
puts("");
}
puts("");
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
printf("%d,%d ",fa[i][j][],fa[i][j][]);
puts("");
}
puts("");
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
printf("%d ",sz[i][j]);
puts("");
}
puts("");
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("1.txt","r",stdin);
// freopen("2.txt","w",stdout);
#endif
int i,j,k;
int x,y,z;
// for(scanf("%d",&cass);cass;cass--)
// for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
// while(~scanf("%s",s))
while(~scanf("%d",&n))
{
mem(num,);mem(sz,);mem(fa,);mem(f,);
scanf("%d%d",&m,&cass);
for(i=;i<=cass;i++)
{
scanf("%d%d%d%d",&q[i].x1,&q[i].y1,&q[i].x2,&q[i].y2);
if(q[i].x1==q[i].x2)
{
if(q[i].y1>q[i].y2)swap(q[i].y1,q[i].y2);
for(j=q[i].y1;j<=q[i].y2;j++)
num[q[i].x1][j]++;
}
else
{
if(q[i].x1>q[i].x2)swap(q[i].x1,q[i].x2);
for(j=q[i].x1;j<=q[i].x2;j++)
num[j][q[i].y1]++;
}
}
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
for(k=;k<;k++)
{
x=i+dx[k];
y=j+dy[k];
if(x< || x>n || y< || y>m || num[i][j] || num[x][y])continue;
int fx1,fy1,fx2,fy2;
zhao(i,j,fx1,fy1);
zhao(x,y,fx2,fy2);
if(fx1==fx2 && fy1==fy2)continue;
fa[fx2][fy2][]=fx1;
fa[fx2][fy2][]=fy1;
}
}
}
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
zhao(i,j,fa[i][j][],fa[i][j][]);
if(!sz[fa[i][j][]][fa[i][j][]] && !num[i][j])f[cass+]++;
sz[fa[i][j][]][fa[i][j][]]++;
}
}
for(i=cass;i>;i--)
{
f[i]=f[i+];
if(q[i].x1==q[i].x2)
{
for(j=q[i].y1;j<=q[i].y2;j++)
{
num[q[i].x1][j]--;
if(num[q[i].x1][j]==)
{
f[i]++;
for(k=;k<;k++)
{
x=q[i].x1+dx[k];
y=j+dy[k];
if(x< || x>n || y< || y>m || num[x][y])continue;
int fx1,fy1,fx2,fy2;
zhao(q[i].x1,j,fx1,fy1);
zhao(x,y,fx2,fy2);
if(fx1==fx2 && fy1==fy2)continue;
fa[fx2][fy2][]=fx1;
fa[fx2][fy2][]=fy1;
f[i]--;
}
}
}
}
else
{
for(j=q[i].x1;j<=q[i].x2;j++)
{
num[j][q[i].y1]--;
if(num[j][q[i].y1]==)
{
f[i]++;
for(k=;k<;k++)
{
x=j+dx[k];
y=q[i].y1+dy[k];
if(x< || x>n || y< || y>m || num[x][y])continue;
int fx1,fy1,fx2,fy2;
zhao(j,q[i].y1,fx1,fy1);
zhao(x,y,fx2,fy2);
if(fx1==fx2 && fy1==fy2)continue;
fa[fx2][fy2][]=fx1;
fa[fx2][fy2][]=fy1;
f[i]--;
}
}
}
}
}
for(i=;i<=cass+;i++)
printf("%d\n",f[i]);
//print();
}
return ;
}
/*
//
//
*/
XMU 1614 刘备闯三国之三顾茅庐(二) 【逆向思维+二维并查集】的更多相关文章
- XMU 1613 刘备闯三国之三顾茅庐(一) 【并查集】
1613: 刘备闯三国之三顾茅庐(一) Time Limit: 1000 MS Memory Limit: 128 MBSubmit: 99 Solved: 29[Submit][Status][ ...
- XMU 1615 刘备闯三国之三顾茅庐(三) 【欧拉函数+快速幂+欧拉定理】
1615: 刘备闯三国之三顾茅庐(三) Time Limit: 1000 MS Memory Limit: 128 MBSubmit: 45 Solved: 8[Submit][Status][W ...
- XMU 1617 刘备闯三国之汉中之战 【BFS+染色】
1617: 刘备闯三国之汉中之战 Time Limit: 1000 MS Memory Limit: 128 MBSubmit: 6 Solved: 5[Submit][Status][Web B ...
- XMU 1612 刘备闯三国之桃园结义 【二分】
1612: 刘备闯三国之桃园结义 Time Limit: 1000 MS Memory Limit: 128 MBSubmit: 181 Solved: 12[Submit][Status][We ...
- XMU 1611 刘备闯三国之卖草鞋 【贪心】
1611: 刘备闯三国之卖草鞋 Time Limit: 1000 MS Memory Limit: 64 MBSubmit: 90 Solved: 48[Submit][Status][Web B ...
- CodeForces - 505B Mr. Kitayuta's Colorful Graph 二维并查集
Mr. Kitayuta's Colorful Graph Mr. Kitayuta has just bought an undirected graph consisting of n verti ...
- B. Mr. Kitayuta's Colorful Graph,二维并查集,一个简单变形就可以水过了~~
B. Mr. Kitayuta's Colorful Graph -> Link <- 题目链接在上面,题目比较长,就不贴出来了,不过这是道很好的题,很多方法都可以做,真心邀请去A了这 ...
- [分享] IT天空的二十二条军规
Una 发表于 2014-9-19 20:25:06 https://www.itsk.com/thread-335975-1-1.html IT天空的二十二条军规 第一条.你不是什么都会,也不是什么 ...
- Bootstrap <基础二十二>超大屏幕(Jumbotron)
Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: ...
随机推荐
- [SQL]数据库中对值为数字,存储格式为varchar类型的字段进行排序
如果要对数据库中某存储数字的列(存储类型不为int)进行排序,可以在order by 里对该列进行转换, 即如 order by cast(mycolumn as int) desc
- 【06】sass编译工具(弃)
[06]编译工具(弃) SASS转译工具 除了使用sass命令来转译SASS文件之外,还可以借助第三方工具完成,目前世面上较为流行的转译工具主要有: Compass.app Scout Codekit ...
- 【Codeforces 140A】New Year Table
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 算出来每个盘子要占用多少角度. 然后乘n看看是不是小于等于2π就好 (精度最好定在1e-7) [代码] #include <bits/s ...
- DBCA建库出错ORA-00600: internal error code, arguments
正常步骤安装完成Oralce,通过dbca建库,报错如下图所示: Oracle安装日志中报错如下: [Thread-40] [ 1999-12-15 12:23:54.055 CST ] [Basic ...
- [luoguP2129] L国的战斗续之多路出击(模拟 || 矩阵)
传送门 1.模拟 easy #include <cstdio> #define N 500001 int n, m; int X[N], Y[N], x[N], y[N], a = 1, ...
- [luoguP1866]滑动窗口(单调队列)
传送门 可以搞2个单调队列. 然后,然后就没有然后了. # include <iostream> # include <cstdio> # include <cstrin ...
- SDWebImage实现分析
该博文来自南峰子的技术博客,文章从下载和缓存俩个大的组件分析到里面一些核心方法的实现,条理清晰,相对于一些一上来就通篇分析实现思路的技术文章, 这篇的讲解思路明确,框架架构也讲的比较清楚.看完这篇再去 ...
- 飞行路线(BZOJ 2763)
题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的 ...
- msp430入门编程27
msp430中C语言开发工具调试程序 msp430入门学习 msp430入门编程
- POJ 2391 多源多汇拆点最大流 +flody+二分答案
题意:在一图中,每个点有俩个属性:现在牛的数量和雨棚大小(下雨时能容纳牛的数量),每个点之间有距离, 给出牛(速度一样)在顶点之间移动所需时间,问最少时间内所有牛都能避雨. 模型分析:多源点去多汇点( ...
