题目描述

跳蚤国王和蛐蛐国王在玩一个游戏。

他们在一个 nn 行 mm 列的网格上排兵布阵。其中的 cc 个格子中 (0 \leq c \leq n\cdot m)(0≤c≤n⋅m),每个格子有一只蛐蛐,其余的格子中,每个格子有一只跳蚤。

我们称占据的格子有公共边的两只跳蚤是相邻的。

我们称两只跳蚤是连通的,当且仅当这两只跳蚤相邻,或存在另一只跳蚤与这两只跳蚤都连通。

现在,蛐蛐国王希望,将某些(零个,一个或多个)跳蚤替换成蛐蛐,使得在此之后存在至少两只跳蚤不连通。

例如:图 11 描述了一个 n=4n=4,m=4m=4,c=2c=2 的情况。

这种情况下蛐蛐国王可以通过将第二行第二列,和第三行第三列的两只跳蚤替换为蛐蛐,从而达成他的希望,如右图所示。并且,不存在更优的方案,但是可能存在其他替换两只跳蚤的方案。

你需要首先判断蛐蛐国王的希望能否被达成。如果能够达成,你还需要最小化被替换的跳蚤的个数。

输入格式

每个输入文件包含多组数据。

输入文件的第一行只有一个整数 TT,表示数据的组数。

接下来依次输入 TT 组数据,每组数据的第一行包含三个整数 n, m, cn,m,c。

接下来 cc 行,每行包含两个整数 x, yx,y 表示第 xx 行,第 yy 列的格子被一个蛐蛐占据。每一组数据当中,同一个蛐蛐不会被多次描述。

输出格式

对于每一组数据依次输出一行答案。

如果这组数据中,蛐蛐国王的希望不能被达成,输出 -1−1。否则,输出被替换的跳蚤的个数的最小值。

输入输出样例

输入 #1复制

4
4 4 2
1 1
4 4
2 3 1
1 2
2 2 2
1 1
2 2
1 1 0

输出 #1复制

2
1
0
-1

说明/提示

样例解释

第一组数据就是问题描述中的例子。

对于第二组数据,可以将第二行第二列的一只跳蚤替换为蛐蛐,从而使得存在两只跳蚤不连通,并且不存在更优的方案。

对于第三组数据,最初已经存在两只跳蚤不连通,故不需要再进行替换。

对于第四组数据,由于最多只有一只跳蚤,所以无论如何替换都不能存在两只跳蚤不连通。

数据范围

对于全部的测试点,保证 1 \leq T \leq 201≤T≤20。我们记 \sum c∑c 为某个测试点中,其 TT 组输入数据的所有 cc 的总和。对于所有的测试点,\sum c \leq 10^5∑c≤105。

对于全部的数据,满足 1 \leq n,m \leq 10^91≤n,m≤109,0 \leq c \leq n \times m0≤c≤n×m,1 \leq x \leq n, 1 \leq y \leq m1≤x≤n,1≤y≤m。

每个测试点的详细数据范围见下表。表中的 n,m,cn,m,c 均是对于单个输入数据(而非测试点)而言的,也就是说同一个测试点下的 TT 组数据均满足限制条件;而 \sum c∑c是对于单个测试点而言的。为了方便阅读,“测试点”一列被放到了表格的中间而不是左边。

n,mn,m 测试点 cc
n*m\leq 4n∗m≤4 11 c\leq n*mc≤n∗m
n*m\leq 8n∗m≤8 22 c\leq n*mc≤n∗m
n*m\leq 15n∗m≤15 33 c\leq n*mc≤n∗m
n*m\leq 30n∗m≤30 44 c\leq n*mc≤n∗m
n*m\leq 100n∗m≤100 55 c\leq n*mc≤n∗m
n*m\leq 300n∗m≤300 66 c\leq n*mc≤n∗m
n*m\leq 10^3n∗m≤103 77 c\leq n*mc≤n∗m
n*m\leq 2\times 10^4n∗m≤2×104 88 c\leq 5c≤5
n*m\leq 2\times 10^4n∗m≤2×104 99 c\leq 15c≤15
n*m\leq 2\times 10^4n∗m≤2×104 1010 c\leq 30c≤30
n,m\leq 2\times 10^4,n*m\leq2\times 10^4n,m≤2×104,n∗m≤2×104 1111 \sum c\leq 2\times 10^4∑c≤2×104
n,m\leq 2\times 10^4,n*m\leq10^5n,m≤2×104,n∗m≤105 1212 \sum c\leq 2\times 10^4∑c≤2×104
n,m\leq 2\times 10^4,n*m\leq3\times 10^5n,m≤2×104,n∗m≤3×105 1313 \sum c\leq 2\times 10^4∑c≤2×104
n,m\leq 2\times 10^4,n*m\leq10^6n,m≤2×104,n∗m≤106 1414 \sum c\leq 2\times 10^4∑c≤2×104
n,m\leq 2\times 10^4,n*m\leq 10^9n,m≤2×104,n∗m≤109 1515 \sum c\leq 2\times 10^4∑c≤2×104
n,m\leq 10^5n,m≤105 1616 \sum c\leq 10^5∑c≤105
n,m\leq 10^9n,m≤109 1717 c=0c=0
n,m\leq 10^9n,m≤109 1818 c\leq 1c≤1
n,m\leq 10^9n,m≤109 1919 c\leq 2c≤2
n,m\leq 10^9n,m≤109 2020 c\leq 3c≤3
n,m\leq 10^9n,m≤109 2121 c\leq 10c≤10
n,m\leq 10^9n,m≤109 2222 c\leq 30c≤30
n,m\leq 10^9n,m≤109 2323 c\leq 300c≤300
n,m\leq 10^9n,m≤109 2424 \sum c\leq 2 \times 10^4∑c≤2×104
n,m\leq 10^9n,m≤109 2525

\sum c\leq 10^5∑c≤105

上代码:

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
const int dx[4]={0,1,0,-1};
const int dy[4]={1,0,-1,0};
const int P=1000117;
const int N=100050;
char rB[1<<21],*rS,*rT;
inline char gc(){return rS==rT&&(rT=(rS=rB)+fread(rB,1,1<<21,stdin),rS==rT)?EOF:*rS++;}
inline int rd(){char c=gc();while(c<48||c>57)c=gc();int x=c&15;for(c=gc();c>=48&&c<=57;c=gc())x=(x<<3)+(x<<1)+(c&15);return x;
}
int x[N],y[N],G[N*24],to[N*192],nxt[N*192],sz,cnt,pre[N*24],dfsc,n,m,c,tmpx[N*24],tmpy[N*24],ctmp;
bool isok[N*24],iscut[N*24];
struct node{int x,y;node(){}node(int x,int y):x(x),y(y){}
};
queue<node> Q,q;
struct Hash{  //用hash实现mapint h[P],vx[N*25],vy[N*25],p[N*25],nxt[N*25],sz;inline void clear(){memset(h,0,sizeof(h));sz=0;}inline void ins(int x,int y,int id){int pos=((ll)(x-1)*n+y-1)%P;vx[++sz]=x;vy[sz]=y;p[sz]=id;nxt[sz]=h[pos];h[pos]=sz;}inline int ask(int x,int y){for(int k=h[((ll)(x-1)*n+y-1)%P];k;k=nxt[k])if(vx[k]==x&&vy[k]==y)return p[k];return 0;}
}h,col,tem;
inline int Abs(int x){return x<0?-x:x;}
inline int Max(int a,int b){return a>b?a:b;}
inline void add(int u,int v){to[++sz]=v;nxt[sz]=G[u];G[u]=sz;to[++sz]=u;nxt[sz]=G[v];G[v]=sz;
}
inline bool check(){int i,j,k,tx,ty;for(i=1;i<=n;++i)for(j=1;j<=m;++j)if(!h.ask(i,j)){for(k=0;k<4;++k)if((tx=i+dx[k])&&tx<=n&&(ty=j+dy[k])&&ty<=m&&!h.ask(tx,ty))return 1;return 0;}
}
inline void bfs(int sx,int sy,int cl){  //第一次floodfillint i,u,v,tx,ty;q.push(node(sx,sy));col.ins(sx,sy,cl);while(!q.empty()){u=q.front().x;v=q.front().y;q.pop();for(i=0;i<4;++i)if((tx=u+dx[i])&&tx<=n&&(ty=v+dy[i])&&ty<=m&&h.ask(tx,ty)>0&&!col.ask(tx,ty)){col.ins(tx,ty,cl);  //用col来记录所属联通块编号(也成为颜色)q.push(node(tx,ty));}}
}
inline bool bfs2(int sx,int sy){int i,u,v,x,y,t;q.push(node(sx,sy));tem.ins(sx,sy,-1);while(!q.empty()){u=q.front().x;v=q.front().y;q.pop();for(x=Max(1,u-1);x<=n&&x<=u+1;++x)for(y=Max(1,v-1);y<=m&&y<=v+1;++y)if((t=h.ask(x,y))&&!tem.ask(x,y))if(t==-1){tem.ins(x,y,-1);  //用tem来防止对障碍结点重复访问
//对跳蚤结点的重复访问最多总共c*8个,不会影响复杂度q.push(node(x,y));}else{tmpx[++ctmp]=x;tmpy[ctmp]=y;}}if(ctmp==-1)return 1;for(i=1,t=col.ask(tmpx[0],tmpy[0]);i<=ctmp;++i)if(col.ask(tmpx[i],tmpy[i])!=t)return 0;return 1;
}
inline bool ncon(){  //判断是否不连通int i,u,v,ccl=0;col.clear();while(!Q.empty()){u=Q.front().x;v=Q.front().y;Q.pop();if(col.ask(u,v))continue;bfs(u,v,++ccl);}tem.clear();for(i=0;i<c;++i)if(!tem.ask(x[i],y[i])){ctmp=-1;if(!bfs2(x[i],y[i]))return 1;}return 0;
}
int dfs(int u,int fa){  //dfs求割顶int i,v,lowu=pre[u]=++dfsc,lowv,chd=0;for(i=G[u];i;i=nxt[i])if((v=to[i])!=fa)if(!pre[v]){++chd;if((lowv=dfs(v,u))>=pre[u])iscut[u]=1;if(lowv<lowu)lowu=lowv;}else if(pre[v]<lowu)lowu=pre[v];if(!fa&&chd==1)iscut[u]=0;return lowu;
}
int main(){int T=rd(),i,j,k,l,t,tt,tx,ty;bool ok;while(T--){n=rd();m=rd();c=rd();h.clear();for(i=0;i<c;++i){x[i]=rd();y[i]=rd();h.ins(x[i],y[i],-1);}if((ll)n*m-c<2ll){puts("-1");continue;}if((ll)n*m-c==2ll){puts(check()?"-1":"0");continue;}memset(G,0,sizeof(G));ok=sz=cnt=dfsc=0;memset(pre,0,sizeof(pre));memset(iscut,0,sizeof(iscut));memset(isok,0,sizeof(isok));//建图for(i=0;i<c;++i)for(j=Max(1,x[i]-2);j<=x[i]+2&&j<=n;++j)for(k=Max(1,y[i]-2);k<=y[i]+2&&k<=m;++k)if(!(t=h.ask(j,k))){h.ins(j,k,++cnt);Q.push(node(j,k));isok[cnt]=Max(Abs(j-x[i]),Abs(k-y[i]))<=1;for(l=0;l<4;++l)if((tx=j+dx[l])&&tx<=n&&(ty=k+dy[l])&&ty<=m&&(tt=h.ask(tx,ty))>0)add(cnt,tt);}else if(t>0&&Max(Abs(j-x[i]),Abs(k-y[i]))<=1)isok[t]=1;if(ncon()){puts("0");continue;}if(n==1||m==1){  //一行或一列可以特判puts("1");continue;}for(i=1;i<=cnt;++i){if(!pre[i])dfs(i,0);if(isok[i]&&iscut[i]){puts("1");ok=1;break;}}if(!ok)puts("2");}return 0;
}

洛谷P1173 网格相关推荐

  1. 洛谷P1173:[NOI2016] 网格(tarjan、离散化)

    解析 看起来很不码农但写起来其实还行的一道题. 主要也是因为我贺题解把所有的雷都避过去了 首先一个比较显然的结论是:通过堵角上的,答案不超过2. 所以本题只要把答案是-1,0,1,2的情况判出来即可. ...

  2. 深搜+广搜——Lake Counting S(洛谷 P1596)

    题目选自洛谷P1596 这道题目我觉得是比较综合的搜索题了,可以用dfs.bfs来解题.下面给出2种方法的思路: 首先,确定什么情况是一个水坑: 对于每一个'w' ,如果在八个方向上有于其相邻的'w' ...

  3. 洛谷刷题C语言:Even? Odd? G、The Robot Plow G、pb的游戏(1)、询问学号、cover

    记录洛谷刷题QAQ 一.[USACO09OCT]Even? Odd? G 题目描述 Bessie's cruel second grade teacher has assigned a list of ...

  4. 2021寒假——洛谷刷题计划(35题)

    (希望大家不要Copy) AC:Accept,程序通过. CE:Compile Error,编译错误. PC:Partially Correct,部分正确. WA:Wrong Answer,答案错误. ...

  5. 洛谷算法题单:模拟与高精度例题(下)

    接着上篇的例题. 1.洛谷P4924魔法少女小Scarlet 题目描述: Scarlet最近学会了一个数组魔法,她会在n∗n二维数组上将一个奇数阶方阵按照顺时针或者逆时针旋转90°, 首先,Scarl ...

  6. 洛谷 P2704 炮兵阵地 题解

    洛谷 P2704 炮兵阵地 题解 洛谷 P2704 题目 司令部的将军们打算在NNNMMM的网格地图上部署他们的炮兵部队.一个NNNMMM的地图由NNN行MMM列组成,地图的每一格可能是山地(用&qu ...

  7. 洛谷P4474 王者之剑(吾王的题目!!!)

    蒟蒻第一次发题解,看官点个赞再走QwQ 题目链接 https://www.luogu.org/problem/P4474 题目描述 这是在阿尔托利亚·潘德拉贡成为英灵前的事情,她正要去拔出石中剑成为亚 ...

  8. 洛谷P1524 十字绣 dfs+思维

    前言 最近打算考研去软院,顺便向xmd了解了一点算法岗实习的行情,决定重拾算法能力,多多刷题. 现在在刷洛谷的题单和vijos的训练计划,听很多同学说leetcode很不错,打算把vj的训练计划刷完后 ...

  9. 洛谷 T282123 电路维修

    PS:如果读过题了可以跳过题目描述直接到题解部分 提交链接:洛谷 T282123 电路维修 题目 题目背景 达达是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女 翰翰,从而被收留在地 ...

最新文章

  1. pandas对dataframe的数据行进行随机抽样(Random Sample of Rows):使用sample函数进行数据行随机抽样(有放回的随机抽样,replacement)
  2. 针对苹果最新审核要求 为应用兼容IPv6
  3. Html做弹出式菜单,JavaScript制作的可折叠弹出式菜单示例
  4. linux批量部署war工具,Linux批量部署工具Expect
  5. java左移、右移、无符号右移
  6. LeetCode 2169. 得到 0 的操作数
  7. ZOJ 3810 A Volcanic Island (2014年牡丹江赛区网络赛B题)
  8. 《Macbook Pro概要》- Mac的各种功能使用方法
  9. 一只火鸡带你了解大数据预测(经典)
  10. AndroidStudio实用快捷键组合
  11. Matlab标定工具箱使用教程
  12. Eclipse插件(RCP)自定义编辑器添加Dirty效果
  13. el-select 远程搜索时 没有箭头图标
  14. 油价又双叒叕涨,司机教你如何开车更省油?
  15. 解救IP被封的服务器
  16. Kubernetes - CPU 单位
  17. MySQL 推荐书目
  18. html单元格分割,html – 拆分td在两个
  19. android app 的后台代码,包括后台的Android美食APP项目开源代码
  20. 在计算机中 音乐被数字化了 被一,数字化音乐论文10篇_发表之家

热门文章

  1. P2264 情书 Trie匹配
  2. 七日杀服务器可以修改吗,七日杀如何更改游戏设置 | 手游网游页游攻略大全
  3. UE高级性能剖析技术(1)-- RHI线程(渲染提交)
  4. UE4虚幻引擎,编辑器基础应用,使用技巧(二)
  5. 巧妙的使用模板字符串生成dom元素
  6. 做好软件项目的配置管理
  7. 界面显示这个时间格式的js代码: 2016年1月19日 星期二 乙未(羊)年 腊月初十
  8. JSP住宅小区物业管理系统(源代码+开题报告+论文+答辩PPT)
  9. python日期函数_python时间函数(time)
  10. 如何将照片变成卡通图,animegan2-pytorch机器学习项目使用 | 机器学习