题解

之前用的mapTLE了,今天用了个hash把题卡了过去,AC数++

我们只要保留一个点为中心周围5 * 5个格子就可以

如果一个点周围5*5个格子有两个不连通,那么显然输出0

如果一个出现了一个割点,那么看看这个割点在不在离中心点的第一层,如果在的话就是1,没有合法割点的话就是2

然后就是特判了……特判真的挺多的……

代码

#include <bits/stdc++.h>
//#define ivorysi
#define MAXN 100005
#define mo 974711
#define INF 1000000000000000000LL
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
typedef long long int64;
pii poi[MAXN * 26];
vector<int> V[MAXN],st;
int N,M,c,cnt,T;
struct Hash {struct node {int64 x;int next,c;}E[MAXN * 26];int head[mo + 5],sumE;void clear() {sumE = 0;memset(head,0,sizeof(head));}void add(int64 x,int c) {int u = x % mo;E[++sumE].x = x;E[sumE].next = head[u];E[sumE].c = c;head[u] = sumE;}void Insert(pii x,int c) {add(1LL * (x.fi - 1) * M + x.se,c);}int Query(pii x) {int u = (1LL * (x.fi - 1) * M + x.se) % mo;for(int i = head[u] ; i ; i = E[i].next) {if(E[i].x == 1LL * (x.fi - 1) * M + x.se) return E[i].c;}return -1;}
}H;
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
struct node {int to,next;
}edge[MAXN * 100];
int head[MAXN * 26],sumE,low[MAXN * 26],dfn[MAXN * 26],idx,col[MAXN * 26],tot;
bool fir[MAXN * 26];
void dfs(int u,int fa) {dfn[u] = low[u] = ++idx;col[u] = tot;int son = 0;for(int i = head[u] ; i ; i = edge[i].next) {int v = edge[i].to;if(v != fa) {if(dfn[v]) low[u] = min(low[u],dfn[v]);else {++son;dfs(v,u);low[u] = min(low[u],low[v]);if(fa != 0 && low[v] >= dfn[u]) {st.push_back(u);}}}}if(!fa && son > 1) st.push_back(u);
}
void add(int u,int v) {edge[++sumE].to = v;edge[sumE].next = head[u];head[u] = sumE;
}
void Init() {sumE = 0;for(int i = 1 ; i <= cnt ; ++i) {head[i] = dfn[i] = low[i] = col[i] = fir[i] = tot = idx = 0;}H.clear();int u,v;for(int i = 1 ; i <= c ; ++i) {scanf("%d%d",&u,&v);poi[i] = make_pair(u,v);H.Insert(poi[i],i);}cnt = c;for(int i = 1 ; i <= c ; ++i) {V[i].clear();for(int x = -2 ; x <= 2 ; ++x) {for(int y = -2 ; y <= 2 ; ++y) {if(x == 0 && y == 0) continue;pii tmp = make_pair(poi[i].fi + x,poi[i].se + y);if(tmp.fi < 1 || tmp.fi > N || tmp.se < 1 || tmp.se > M) continue;if(H.Query(tmp) == -1) {poi[++cnt] = tmp;H.Insert(poi[cnt],cnt);}if(x <= 1 && x >= -1 && y <= 1 && y >= -1) fir[H.Query(tmp)] = 1;V[i].push_back(H.Query(tmp));}}}for(int i = c + 1 ; i <= cnt ; ++i) {for(int j = 0 ; j <= 3 ; ++j) {pii tmp = make_pair(poi[i].fi + dx[j],poi[i].se + dy[j]);if(tmp.fi < 1 || tmp.fi > N || tmp.se < 1 || tmp.se > M) continue;int x = H.Query(tmp);if(x <= c) continue;add(i,x);}}
}
void Solve() {scanf("%d",&T);while(T--) {scanf("%d%d%d",&N,&M,&c);Init();if(1LL * N * M - c <= 1) {puts("-1");goto again;}if(c == 0) {if(1LL * N * M == 2) puts("-1");else if(N == 1 || M == 1) puts("1");else puts("2");goto again;}st.clear();for(int i = c + 1 ; i <= cnt ; ++i) {if(!dfn[i]) {++tot;dfs(i,0);}}for(int i = 1 ; i <= c ; ++i) {int t = 0;for(auto k : V[i]) {if(k <= c) continue;if(k > c) {if(t == 0) t = col[k];else if(t != col[k]) {puts("0");goto again;}}}}if(1LL * N * M - c == 2) {puts("-1");goto again;}for(auto k : st) {if(fir[k]) {puts("1");goto again;}}if(M == 1 || N == 1) puts("1");else puts("2");again:;}
}int main() {
#ifdef ivorysifreopen("f1.in","r",stdin);
#endifSolve();
}

转载于:https://www.cnblogs.com/ivorysi/p/9560087.html

【LOJ】#2084. 「NOI2016」网格相关推荐

  1. *LOJ#2085. 「NOI2016」循环之美

    $n \leq 1e9,m \leq 1e9,k \leq 2000$,求$k$进制下$\frac{x}{y}$有多少种不同的纯循环数取值,$1 \leq x \leq n,1 \leq y \leq ...

  2. Loj #3111. 「SDOI2019」染色

    Loj #3111. 「SDOI2019」染色 题目描述 给定 \(2 \times n\) 的格点图.其中一些结点有着已知的颜色,其余的结点还没有被染色.一个合法的染色方案不允许相邻结点有相同的染色 ...

  3. Loj #3055. 「HNOI2019」JOJO

    Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...

  4. LOJ#2230. 「BJOI2014」大融合

    LOJ#2230. 「BJOI2014」大融合 题目描述 小强要在$N$个孤立的星球上建立起一套通信系统.这套通信系统就是连接$N$个点的一个树.这个树的边是一条一条添加上去的. 在某个时刻,一条边的 ...

  5. loj#2143. 「SHOI2017」组合数问题

    loj#2143. 「SHOI2017」组合数问题 题目描述 Solution 考虑转化一下我们要求的东西. ∑i=0n(nkik+r)=∑i=0n(nki)[i≡r(modk)]\sum_{i=0} ...

  6. LOJ#2542. 「PKUWC2018」随机游走

    LOJ#2542. 「PKUWC2018」随机游走 题目描述 Solution 去过一个点集中所有节点的期望时间不好求,考虑min−maxmin-maxmin−max容斥,转化为求第一次到达某一个点集 ...

  7. LOJ#2145. 「SHOI2017」分手是祝愿

    LOJ#2145. 「SHOI2017」分手是祝愿 题目描述 Solution 首先有一个结论: 灯的状态序列a1,a2...ana_1,a_2...a_na1​,a2​...an​唯一对应了一个最优 ...

  8. Loj #2568. 「APIO2016」烟花表演

    Loj #2568. 「APIO2016」烟花表演 题目描述 烟花表演是最引人注目的节日活动之一.在表演中,所有的烟花必须同时爆炸.为了确保安全,烟花被安置在远离开关的位置上,通过一些导火索与开关相连 ...

  9. Loj #2585. 「APIO2018」新家

    Loj #2585. 「APIO2018」新家 题目描述 五福街是一条笔直的道路,这条道路可以看成一个数轴,街上每个建筑物的坐标都可以用一个整数来表示.小明是一位时光旅行者,他知道在这条街上,在过去现 ...

最新文章

  1. 禁止input输入框输入指定内容
  2. c语言中div函数,C 库函数
  3. 7、使用CallableStatement接口调用存储过程
  4. matlab电力系统潮流计算,大神们,求个电力系统潮流计算的matlab程序。
  5. Django(part28)--F对象
  6. 手机端开发深度学习应用
  7. 东方航空:拟与携程等出资设立三亚国际航空
  8. python动态类型的坑_在Python中避免动态类型错误的策略是什么(NoneType没有属性x)?...
  9. tomcat处理连接的详细过程
  10. 打乱 数字_“142857”金字塔中的神秘数字,其中隐藏什么秘密?
  11. java定义时钟类clock_Java 编程题,定义一个时钟类(Clock)
  12. 华南理工大学 电力电子技术(王兆安) 期末复习笔记1 第二章第九章
  13. bool类型转int, 或者bool数组对象转int/float数组对象
  14. 降本增效,粮食加工产线自动化控制系统方案
  15. phpcms php5.5,phpcms_v9.5.8_GBK源码下载
  16. Python使用PyAudio制作录音工具
  17. 安徽大学计算机科学与技术学院张磊,吕钊(安徽大学计算机科学与技术学院副教授)_百度百科...
  18. SaaSBase:什么是石墨文档?
  19. 计算机应用基础的操作,计算机应用基础操作(1)
  20. Java基础 DAY08

热门文章

  1. linux Hadoop HDFS NameNode进程重启脚本(linux进程通用)
  2. 为什么docker比VM快?
  3. Java 8大原子操作
  4. Java多线程--使用future进行异步编程
  5. springmvc配置文件的主要内容
  6. Hibernate的配置详解
  7. Java-SpringDataRedis使用入门
  8. eclipse关闭java程序_如何为Java代码的某些部分关闭Eclipse代码格式化程序?
  9. java 钩子_java中钩子方法的概念
  10. Intellij IDEA 2019 自动生成 serialVersionUID