2017国家集训队作业[agc006f]Blackout
2017国家集训队作业[agc006f]Blackout
题意:
有一个\(N*N\)的网格,一开始有\(M\)个格子被涂黑,给出这\(M\)个格子,和染色操作:如果有坐标为\((x,y),(y,z)\)的格子已被染黑,那么就可以染黑坐标为\((y,z)\)的格子。问操作到不能再操作的时候,网格里有多少个黑格子?(\(1\le N,M\le 10^5\),最开始给出的\(M\)个坐标互不相同)
题解:
在场上签到签了两个小时,看到这题一脸懵逼。= =!大概想到是把形如\((x,y),(y,z)\)格子之间连一条边,然后会产生个新点之类的。现在想想,这样的空间复杂度完全不对了,做法不可能是这个。(然而我在场上想到这的时候,决定去打暴力了)
每个\(OIer\)肯定做过一题,就是在网格上求某种合法方案,使得同一行、同一列只能有一个点。二分图匹配,对吧。那里选一个点等于行号同列之间连一条边。这题也是这样的模型。
把所有初始涂黑的点的行号同列号之间连一条单向边,那么所有点组成了若干个弱联通块,如果有边\(x\rightarrow y,y\rightarrow z\),就会产生\(z\rightarrow x\)的边,这样,我们发现一次操作一定生成了一个三元环,三染色。。。。。。。。不妨设染色顺序为\(0,1,2\)。
三种情况:
\(1.\)如果三种颜色没法全部用到,那么说明当前弱联通块无法进行操作。那么它对答案的贡献就是弱联通块的边数。
\(2.\)如果三种颜色全部用到了,但是存在某两个同颜色的点之间有边,那么说明这个弱联通块出现了环,稍微画画就能得出这个弱联通块最后一定会成为一个完全图,贡献为点数的平方。
\(3.\)其它情况,贡献为:颜色为颜色为\(0\)的点数\(*\)颜色为\(1\)的点数\(+\)颜色为\(1\)的点数\(*\)颜色为\(2\)的点数\(+\)颜色为\(2\)的点数\(*\)颜色为\(0\)的点数。
一名签到和暴力选手的啰嗦题解。。。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define fo(i,l,r) for(ll i=l;i<=r;i++)
#define of(i,l,r) for(ll i=l;i>=r;i--)
#define fe(i,u) for(ll i=head[u];i;i=e[i].next)
using namespace std;
typedef long long ll;
inline ll rd()
{
static ll x,f;
x=0,f=1;
char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
const ll N=100010;
struct edge{
ll v,ty,next;
edge(ll v=0,ll ty=0,ll next=0):v(v),ty(ty),next(next){}
}e[N<<1];
ll n,m,col[N],cnt[3],siz;
ll tot=0,head[N];
bool flag;
inline void add(ll u,ll v,ll ty){e[++tot]=edge(v,ty,head[u]);head[u]=tot;}
void dfs(ll u)
{
cnt[col[u]]++;
fe(i,u){
ll v=e[i].v,ty=e[i].ty;
siz+=(ty==1);
if(~col[v])flag|=(col[v]!=(col[u]+ty)%3);
else col[v]=(col[u]+ty)%3,dfs(v);
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("inb.txt","r",stdin);
#endif
n=rd();m=rd();
fo(i,1,m){
ll x=rd(),y=rd();
add(x,y,1);add(y,x,2);
}
memset(col,-1,sizeof col);
ll ans=0;
fo(i,1,n){
if(~col[i])continue;
cnt[col[i]=0]=cnt[1]=cnt[2]=siz=flag=0;
dfs(i);
if(flag)ans+=(cnt[0]+cnt[1]+cnt[2])*(cnt[0]+cnt[1]+cnt[2]);
else if(cnt[0]&&cnt[1]&&cnt[2])ans+=cnt[0]*cnt[1]+cnt[1]*cnt[2]+cnt[2]*cnt[0];
else ans+=siz;
}
printf("%lld\n",ans);
return 0;
}
2017国家集训队作业[agc006f]Blackout的更多相关文章
- 2017国家集训队作业Atcoder题目试做
2017国家集训队作业Atcoder题目试做 虽然远没有达到这个水平,但是据说Atcoder思维难度大,代码难度小,适合我这种不会打字的选手,所以试着做一做 不知道能做几题啊 在完全自己做出来的题前面 ...
- 2017国家集训队作业[agc016b]Color Hats
2017国家集训队作业[agc016b]Color Hats 题意: 有\(N\)个人,每个人有一顶帽子.帽子有不同的颜色.现在,每个人都告诉你,他看到的所有其它人的帽子共有多少种颜色,问有没有符合所 ...
- 2017国家集训队作业[agc016e]Poor Turkey
2017国家集训队作业[agc016e]Poor Turkey 题意: 一开始有\(N\)只鸡是活着的,有\(M\)个时刻,每个时刻有两个数\(X_i,Y_i\),表示在第\(i\)个时刻在\(X_i ...
- 2017国家集训队作业[agc004f]Namori
2017国家集训队作业[agc004f]Namori 题意: 给你一颗树或环套树,树上有\(N\)个点,有\(M\)条边.一开始,树上的点都是白色,一次操作可以选择一条端点颜色相同的边,使它的端点颜色 ...
- 2017国家集训队作业[arc082d]Sandglass
2017国家集训队作业[arc082d]Sandglass 题意: 有一个沙漏,初始时\(A\)瓶在上方,两个瓶子的最大容量都为\(X\)克,沙子流动的速度为\(1g\)每单位时间.给出\(K\) ...
- 2017国家集训队作业[arc076d/f][Exhausted?]
2017国家集训队作业[arc076d/f][Exhausted?] 题意: 有\(N\)个人,\(M\)把椅子,给出\(...L_i.R_i\)表示第\(i\)个人可以选择编号为\(1\sim ...
- 2017国家集训队作业[agc006e]Rotate 3x3
2017国家集训队作业[agc006e]Rotate 3x3 题意: 给你一个\(3*N\)的网格,每次操作选择一个\(3*3\)的网格,旋转\(180^\circ\).问可不可以使每个位置\(( ...
- 2017国家集训队作业[agc014d]Black and White Tree
2017国家集训队作业[agc014d]Black and White Tree 题意: 有一颗n个点的树,刚开始每个点都没有颜色.Alice和Bob会轮流对这棵树的一个点涂色,Alice涂白,B ...
- 2017国家集训队作业[agc008f]Black Radius
2017国家集训队作业[agc008f]Black Radius 时隔4个月,经历了省赛打酱油和中考各种被吊打后,我终于回想起了我博客园的密码= = 题意: 给你一棵树,树上有若干个关键点.选中某 ...
随机推荐
- [国家集训队]拉拉队排练 Manancher_前缀和_快速幂
Code: #include <cstdio> #include <algorithm> #include <cstring> using namespace st ...
- 关于ios11和Chrome浏览器非HTTPS 对高德定位不支持问题
最近,在开发二维码签到系统时,需要对用户的签到的经纬度进行获取,并且判断签到距离是否在可支持范围内. 使用了高德地图.因为本人最近刚刚入手了一款新的Iphone7里面是最新的ios11系统.发现我的手 ...
- iOS——集成支付宝 ’openssl/asn1.h' file not found
问题原因:文件路径找不到的问题 解决方法:在 Building Settings -> Search Paths -> Header Search Paths 里,添加一个文件路径:$(P ...
- LVS+keepalived均衡nginx配置
如果单台LVS发生突发情况,例如宕机.发生不可恢复现象,会导致用户无法访问后端所有的应用程序.避免这种问题可以使用HA故障切换,也就是有一台备用的LVS,主LVS 宕机,LVS VIP自动切换到从,可 ...
- django orm 时间处理
说明 datetime 类型赋值: 数据库设置时区为:utc 系统设置时区为:'Asia/Shanghai' 1.赋值为:‘2019-04-24 15:00:00’ 数据库的结果为 ‘ ...
- python 调试大法-大笨蛋的笔记
说在前面 我觉得没有什么错误是调试器无法解决的,如果没有,那我再说一遍,如果有,那当我没说 一.抛出异常 可以通过 raise 语句抛出异常,使程序在我们已经知道的缺陷处停下,并进入到 except ...
- 题解 CF911D 【Inversion Counting】
这是一道看似复杂其实也不简单的思维题. 其实思路很明显. 因为这道题的数据范围比较大,有1e5的询问,如果暴力(像我考场上那样打平衡树)的话可以做到$mnlogn$. 但那样也是稳T. 经过思考之后我 ...
- 洛谷 P2005 A/B Problem II
P2005 A/B Problem II 题目背景 为了让大家紧张的心情放松一下,这一题题是一道非常简单的题目. 题目描述 给出正整数N和M,请你计算N div M(N/M的下取整). 输入输出格式 ...
- C++刷题——2802: 推断字符串是否为回文
Description 编敲代码,推断输入的一个字符串是否为回文. 若是则输出"Yes".否则输出"No". 所谓回文是指順读和倒读都是一样的字符串. Inpu ...
- STL 源代码剖析 算法 stl_algo.h -- search
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie search --------------------------------------- ...