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的更多相关文章

  1. 2017国家集训队作业Atcoder题目试做

    2017国家集训队作业Atcoder题目试做 虽然远没有达到这个水平,但是据说Atcoder思维难度大,代码难度小,适合我这种不会打字的选手,所以试着做一做 不知道能做几题啊 在完全自己做出来的题前面 ...

  2. 2017国家集训队作业[agc016b]Color Hats

    2017国家集训队作业[agc016b]Color Hats 题意: 有\(N\)个人,每个人有一顶帽子.帽子有不同的颜色.现在,每个人都告诉你,他看到的所有其它人的帽子共有多少种颜色,问有没有符合所 ...

  3. 2017国家集训队作业[agc016e]Poor Turkey

    2017国家集训队作业[agc016e]Poor Turkey 题意: 一开始有\(N\)只鸡是活着的,有\(M\)个时刻,每个时刻有两个数\(X_i,Y_i\),表示在第\(i\)个时刻在\(X_i ...

  4. 2017国家集训队作业[agc004f]Namori

    2017国家集训队作业[agc004f]Namori 题意: 给你一颗树或环套树,树上有\(N\)个点,有\(M\)条边.一开始,树上的点都是白色,一次操作可以选择一条端点颜色相同的边,使它的端点颜色 ...

  5. 2017国家集训队作业[arc082d]Sandglass

    2017国家集训队作业[arc082d]Sandglass 题意: ​ 有一个沙漏,初始时\(A\)瓶在上方,两个瓶子的最大容量都为\(X\)克,沙子流动的速度为\(1g\)每单位时间.给出\(K\) ...

  6. 2017国家集训队作业[arc076d/f][Exhausted?]

    2017国家集训队作业[arc076d/f][Exhausted?] 题意: ​ 有\(N\)个人,\(M\)把椅子,给出\(...L_i.R_i\)表示第\(i\)个人可以选择编号为\(1\sim ...

  7. 2017国家集训队作业[agc006e]Rotate 3x3

    2017国家集训队作业[agc006e]Rotate 3x3 题意: ​ 给你一个\(3*N\)的网格,每次操作选择一个\(3*3\)的网格,旋转\(180^\circ\).问可不可以使每个位置\(( ...

  8. 2017国家集训队作业[agc014d]Black and White Tree

    2017国家集训队作业[agc014d]Black and White Tree 题意: ​ 有一颗n个点的树,刚开始每个点都没有颜色.Alice和Bob会轮流对这棵树的一个点涂色,Alice涂白,B ...

  9. 2017国家集训队作业[agc008f]Black Radius

    2017国家集训队作业[agc008f]Black Radius 时隔4个月,经历了省赛打酱油和中考各种被吊打后,我终于回想起了我博客园的密码= = 题意: ​ 给你一棵树,树上有若干个关键点.选中某 ...

随机推荐

  1. ES6学习笔记(十六)async函数

    1.含义 ES2017 标准引入了 async 函数,使得异步操作变得更加方便. async 函数是什么?一句话,它就是 Generator 函数的语法糖,号称异步的终极解决方案. 前文有一个 Gen ...

  2. 【J-meter】调试JDBC请求

    参考资料: http://www.codesec.net/view/165234.html

  3. Qt编译OpenGL程序遇到的问题

    软件版本号: Qt 4.8.5 依照网上的例程(http://www.qiliang.net/old/nehe_qt/lesson01.html),跑了一下基于Qt Creator的OpenGL.因为 ...

  4. Spark修炼之道(高级篇)——Spark源代码阅读:第十二节 Spark SQL 处理流程分析

    作者:周志湖 以下的代码演示了通过Case Class进行表Schema定义的样例: // sc is an existing SparkContext. val sqlContext = new o ...

  5. 项目:rbac 基于角色的权限管理系统;

    - 简单示意流程图 - RBAC分析: - 基于角色的权限管理: - 权限等于用户可以访问的URL: - 通过限制URL来限制权限: - RBAC表结构组成: from django.db impor ...

  6. Android真机调试访问本地服务器(localhost)的解决方案

    Android系统把它自己作为了localhost!当连接localhost都是他自己啊.. 囧,在这里晕了好久才发现.. 网上介绍的都是模拟器连接本地服务器的,我试着把链接改为http://10.0 ...

  7. 联想 Thinkserver TS250服务器RAID1 重建测试

    1.RAID1状态下,拨掉其中一块硬盘后,RAID1即失效. 2.重新插入后,在进行系统后会自动重建 *RAID1 提示Rebuild *进入桌面后软件,显示重建进度 软件下载地址:https://p ...

  8. 利用canvas画一个实时时钟

    先放一张效果图: 下面是源代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"& ...

  9. 学习《TensorFlow实战Google深度学习框架 (第2版) 》中文PDF和代码

    TensorFlow是谷歌2015年开源的主流深度学习框架,目前已得到广泛应用.<TensorFlow:实战Google深度学习框架(第2版)>为TensorFlow入门参考书,帮助快速. ...

  10. Conservative GC (Part one)

    目录 保守式GC 不明确的根 指针和非指针的区别 貌似指针的非指针 不明确数据结构 优点 准确式GC 正确的根 打标签 不把寄存器和栈等当做根 优点 缺点 间接引用 经由句柄引用对象 优缺点 保守式G ...