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

解析

看起来很不码农但写起来其实还行的一道题。
主要也是因为我贺题解把所有的雷都避过去了

首先一个比较显然的结论是:通过堵角上的,答案不超过2。
所以本题只要把答案是-1,0,1,2的情况判出来即可。

-1是只有一个空位或只有两个相邻空位。
0是原图不连通。
1是原图存在割点。
其他都是2。

做完了?太天真了。

n,m≤109n,m\le 10^9n,m109

那咋办?
注意到,c≤105c\le 10^5c105,这张图非常稀疏,在空网格上暴力tarjan看起来非常的蠢。
那怎么办?
我们尝试对于每个蛐蛐,提取出它周围的格子,这样的节点数就变成了 O(c)O(c)O(c) 级别。(感觉有些像华容道那个题)
然后在新的图上tarjan就好了。

还要注意亿点点坑点:

  1. 提出的“周围一圈”应该是 5×55\times 55×5 而不是 3×33\times 33×3,同时只有距离最近蛐蛐曼哈顿距离为1的点是割点才算割点。
  2. 判联通的时候要把8联通的蛐蛐全找出来一起判。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("OK\n")
using namespace std;const int N=1e5+100;const int mod=1333331;
const double inf=1e9;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m,c;
bool flag=0;struct node{int to,nxt;
}p[N*25*4*2];
int fi[N*25],cnt;
inline void addline(int x,int y){p[++cnt]=(node){y,fi[x]};fi[x]=cnt;
}struct Hash{node p[N*25];int fi[mod+1],tot,cnt;ll key[N*25];int id[N*25];void ins(int x,int y,int Id){ll w=1ll*x*(m+1)+y,o=w%mod;++tot;id[tot]=Id;key[tot]=w;    p[++cnt]=(node){tot,fi[o]};fi[o]=cnt;//debug("add o=%lld fi=%d\n",o,fi[o]);}int find(int x,int y){ll w=1ll*x*(m+1)+y,o=w%mod;for(int i=fi[o];~i;i=p[i].nxt){//debug("o=%lld i=%d\n",o,i);//ok;if(key[p[i].to]==w) return id[p[i].to];}return 0;}void init(){tot=0;memset(fi,-1,sizeof(fi));cnt=-1;}
}mp;int tot;int x[N],y[N];
bool jd[N*25];
int d24x[25]={0,-2,-2,-2,-2,-2,-1,-1,-1,-1,-1,0,0,0,0,1,1,1,1,1,2,2,2,2,2},d24y[25]={0,-2,-1,0,1,2,-2,-1,0,1,2,-2,-1,1,2,-2,-1,0,1,2,-2,-1,0,1,2};
int d8x[9]={0,-1,-1,-1,0,0,1,1,1},d8y[9]={0,-1,0,1,-1,1,-1,0,1};
int d4x[5]={0,-1,0,0,1},d4y[5]={0,0,-1,1,0};int cut;
int dfn[N*25],low[N*25],tim,bel[N*25],Id;
void tarjan(int x,int rt=0){dfn[x]=low[x]=++tim;bel[x]=Id;int son(0);for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;//if(to<=c) continue;if(!dfn[to]){tarjan(to);son++;if(low[to]>=dfn[x]){cut+=jd[x];}low[x]=min(low[x],low[to]);}else low[x]=min(low[x],dfn[to]);}if(rt&&son==1) cut-=jd[x];return;
}bool vis[N];
int nowId;
void dfs(int x,int y){int now=mp.find(x,y);vis[now]=1;for(int d=1;d<=8;d++){int nx=x+d8x[d],ny=y+d8y[d];if(nx<1||nx>n||ny<1||ny>m) continue;int to=mp.find(nx,ny);if(to>c){if(nowId==0) nowId=bel[to];else if(nowId!=bel[to]) nowId=-1;}else if(!vis[to]) dfs(nx,ny);    }
}void clear(){mp.init();memset(fi,-1,sizeof(int)*(tot+1));cnt=-1;memset(jd,0,sizeof(int)*(tot+1));cut=tim=Id=0;memset(dfn,0,sizeof(int)*(tot+1));memset(low,0,sizeof(int)*(tot+1));memset(bel,0,sizeof(int)*(tot+1));memset(vis,0,sizeof(int)*(c+1));tot=0;
}void work(){n=read();m=read();tot=c=read();for(int i=1;i<=c;i++){x[i]=read();y[i]=read();mp.ins(x[i],y[i],i);    }for(int i=1;i<=c;i++){for(int d=1;d<=24;d++){int nx=x[i]+d24x[d],ny=y[i]+d24y[d];if(nx<1||nx>n||ny<1||ny>m) continue;      if(!mp.find(nx,ny)){mp.ins(nx,ny,++tot);int x=tot;for(int d=1;d<=4;d++){int nnx=nx+d4x[d],nny=ny+d4y[d];int to=mp.find(nnx,nny);if(to&&to>c){//printf("d=%d (%d %d) -> (%d %d)\n",d,nx,ny,nnx,nny);addline(x,to);addline(to,x);}}}int to=mp.find(nx,ny);if(to<=c) continue;if(abs(nx-x[i])<=1&&abs(ny-y[i])<=1) jd[to]=1;}}if(flag) for(int i=1;i<=n;i++){for(int j=1;j<=m;j++) printf("%d ",mp.find(i,j));puts("");}for(int i=c+1;i<=tot;i++){if(!dfn[i]){++Id;tarjan(i,1);}}if(1ll*n*m-c<2||(1ll*n*m-c==2&&(Id==1||n*m==2))){puts("-1");return;}for(int i=1;i<=c;i++){if(!vis[i]){nowId=0;dfs(x[i],y[i]);if(nowId==-1){puts("0");return;}}}if(cut||n==1||m==1) puts("1");else puts("2");return;
}signed main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifmemset(fi,-1,sizeof(fi));cnt=-1;int T=read();while(T--){clear();work();}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【无码专区5】01串(大讨论+构造)

因为只有std&#xff0c;没有自我实现&#xff0c;所以是无码专区 主要是为了训练思维能力 solution才是dls正解&#xff0c;但是因为只有潦草几句&#xff0c;所以大部分会有我自己基于正解上面的算法实现过程&#xff0c;可能选择的算法跟std中dls的实现不太一样。 std可能…

Game of Cards Gym - 102822G

Game of Cards Gym - 102822G 题意&#xff1a; 小兔子和小马喜欢玩奇怪的纸牌游戏。现在&#xff0c;他们正在玩一种叫做0123游戏的纸牌游戏。桌子上有几张牌。其中c0标记为0&#xff0c;c1标记为1&#xff0c;c2标记为2&#xff0c;c3标记为3。小兔子和小马轮流玩游戏&…

开源组件ExcelReport 3.x.x 使用手册(为.netcore而来

ExcelReport转眼已经开源4年了&#xff0c;期间有很长时间也停止了对它的维护。18年年末有人联系到我&#xff0c;说“兄弟&#xff0c;ExcelReport不错&#xff0c;但什么时候支持.netcore呢&#xff1f;”。我寥寥的回了几句搪塞的话&#xff0c;也没当回事。后来这兄弟又来问…

洛谷P4007:小 Y 和恐怖的奴隶主(期望、矩阵快速幂)

解析 不难发现有效的状态只有 SC113165SC_{11}^3165SC113​165 种。 同时&#xff0c;能支持 n1018n10^{18}n1018 的算法也不剩啥了&#xff0c;要么拉插&#xff0c;要么矩乘。 本题当然就是矩乘了&#xff0c;转移矩阵也较为显然。 然而&#xff0c;直接做的话复杂度是 O(T…

集合均值(逆元+数学)

problem 题目描述 有两个可重集合 nnn&#xff0c;初始时 mmm 只包含一个 000&#xff0c;是给定的。 执行以下操作&#xff1a; 在 BBB 中随机选一个数 yyy&#xff0c;把 yyy 从 BBB 移动到 AAA。给答案加上 AAA 的平均值。若 BBB 非空&#xff0c;回到步骤 111。 求最后答…

《.NET Core 和前后端那些事儿》技术交流活动纪实

长沙.NET技术社区.NET Core和前后端那些事儿技术交流纪实2019年3月10日&#xff0c;下午&#xff0c;在位于沁园春御院的长沙市互联网活动基地&#xff0c;在长沙市.NET技术社区的组织下&#xff0c;长沙市.NET技术圈第一次纯粹的技术沙龙在这里召开。这次活动总共参加人数超过…

CF 1529C Parsa‘s Humongous Tree

CF 1529C Parsa’s Humongous Tree 题意&#xff1a; 给你一颗n个点&#xff0c;n-1个边的树&#xff0c;每个点的点权为一个区间值&#xff0c;树的值为边权和。 边权为该边的两个端点的点权差的绝对值的和 问树的值最大是多少&#xff1f; 题解&#xff1a; 这个题给的点…

聚烷撑乙二醇(数学+期望)

problem 有 nnn 个随机数生成器&#xff0c;第 iii 个生成器可以均匀随机地生成 [Li,Ri][L_i,R_i][Li​,Ri​] 内的一个实数。 现在你要玩个游戏&#xff0c;从第 111 个生成器到第 nnn 个生成器&#xff0c;每次当前生成器会生成一个数&#xff0c;你需要选择&#xff1a; …

AT2293 [AGC009D] Uninity(贪心、状压)

解析 题意描述令人一脸懵逼… 看了一下样例再回去看那个uninity的定义才大概明白&#xff0c;题目所求的其实就是按照给出树构造的点分树的最大深度的最小值。 然后…就不会辣qwq 一开始的方向就错了&#xff0c;尝试通过确定分治重心来考虑&#xff0c;还真发现了一些挺有意…

10个小技巧助您写出高性能的ASP.NET Core代码

今天这篇文章我们来聊一聊如何提升并优化ASP.NET Core应用程序的性能&#xff0c;本文的大部分内容来自翻译&#xff0c;当然中间穿插着自己的理解&#xff0c;希望对大家有所帮助&#xff01;话不多说开始今天的主题吧&#xff01;我们都知道性能是公共网站取得成功的关键因素…

技术情报局(笛卡尔树)

problem 有这样一道简单题&#xff1a;给定一个序列求所有区间的最大值的和。 还有这样一道简单题&#xff1a;给定一个序列求所有区间的乘积的和。 众所周知&#xff1a;简单题 简单题 简单题。 所以&#xff0c;给定一个长为 nnn 的正整数序列&#xff0c;定义一个区间…

CF 1529D Kavi on Pairing Duty

CF 1529D Kavi on Pairing Duty 题意&#xff1a; 有2 * n个点&#xff0c;现在要求两个点连成线段&#xff0c;每个连法都可以得到n个线段&#xff0c;合法的连接方式为&#xff1a;连接的n个线段&#xff0c;任意两个线段要么长度相等&#xff0c;要么有包含关系 n<1e6 …

P5363 [SDOI2019]移动金币(博弈论、dp)

解析 阶梯dp&#xff0c;感觉挺妙的。 有想过按奇偶考虑&#xff0c;但是没搞出来… 本题关键肯定就是确定必胜的等价条件。 题意可以转化为&#xff1a;有 m1 个节点&#xff0c;上面一共有 n-m 个棋子&#xff0c;每次可以把一堆的若干个棋子放到前一堆。 这就是经典的阶梯…

东莞.NET技术线下沙龙活动资料分享

今天天气虽然很不好&#xff0c;但不减广大.NET开发者的热情&#xff0c;仍然到场率很高。因图片还在整理中&#xff0c;暂时只发出个简单的活动资料整理分享&#xff0c;后续摄影师图片修图好后&#xff0c;再一并给到场者发送图片&#xff0c;和对活动的现场报道作更详细的图…

F. It‘s a bird! No, it‘s a plane! No, it‘s AaParsa!

F. It’s a bird! No, it’s a plane! No, it’s AaParsa! 题意&#xff1a; 有n个城市&#xff0c;每个城市都有一个传送大炮指向另一个城市&#xff0c;每个大炮都有发送时间&#xff0c;每过1s&#xff0c;大炮就会从原本指向b&#xff0c;指向(b1)%n,问任意两点之间的最短…

【无码专区6】球与盒子(数学线性筛)

因为只有std&#xff0c;没有自我实现&#xff0c;所以是无码专区 主要是为了训练思维能力 solution才是dls正解&#xff0c;但是因为只有潦草几句&#xff0c;所以大部分会有我自己基于正解上面的算法实现过程&#xff0c;可能选择的算法跟std中dls的实现不太一样。 std可能…

P4279 [SHOI2008]小约翰的游戏(博弈论)(Anti-SG)

解析 我的做法&#xff1a;打表&#xff0c;哦…过了。 打表观察的结论&#xff1a;只要不全是1&#xff0c;答案和正常Nim游戏相同&#xff0c;全是1简单讨论奇偶性即可。 证明&#xff1a; 全是1的正确性显然&#xff0c;现在考虑不全是1的时候为什么直接看异或和就行。 关键…

【ASP.NET Core 沉思录】CreateWebHostBuilder 是一个 Convension

失踪人口回归。去年六月份开始&#xff0c;我开始翻译一千多页的《CSharp 7 in a Nutshell》到现在为止终于告一段落。我又回归了表世界。从这次开始我希望展开一个全新的主题。我叫它 ASP.NET Core 沉思录&#xff08;多么高大上的名字&#xff0c;自我陶醉~&#xff09;。今天…

对弈(nim-k游戏博弈)

problem AliceAliceAlice 和 BobBobBob 又在玩游戏。 AliceAliceAlice 和 BobBobBob 在一个 1n1\times n1n 的网格图上玩游戏&#xff0c;网格图的 nnn 个格子中&#xff0c;有 kkk 个格子内被各放了一个棋子&#xff0c;其中 kkk 是一个偶数。 从左到右&#xff0c;这 kkk 个…

Codeforces Round #722 (Div. 2)

Codeforces Round #722 (Div. 2) 题号题目知识点AEshag Loves Big Arrays&#xff08;题解略&#xff09;贪心BSifid and Strange Subsequences思维CParsa’s Humongous Tree树形dpDKavi on Pairing Duty思维推公式ETrees of Tranquillity思维线段树FIt’s a bird! No, it’s …