[Atcoder Grand Contest 006 F][AGC006F] Blackout [染色]
题面
思路
首先,这个涂黑的方法我们来优化一下模型(毕竟当前这个放到矩形里面,你并看不出来什么规律qwq)
我们令每个行/列编号为一个点,令边(x,y)表示一条从x到y的有向边
那么显然只要有一条长度为2的路径,就会得到一个三元环
我们考虑如何统计新加入的边的数量,发现有如下规律:
1.如果一个弱联通块中的点可以被3染色(0的出边染成1,1的染成2,2的染成0,倒着染就是反过来),那么这个联通块中所有0会向所有1连边,所有1会向所有2连边,所有2会向0连边
2.如果一个弱联通块染色的时候会遇到一个点染了2种颜色,那么这个联通块会变成一个团(一个有向完全图)
3.如果一个弱联通块染完色了,只用了1或者2种颜色,那么这个联通块不会增加新的边
然后这题就做完了
Code
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cassert>
#define ll long long
using namespace std;
inline int read(){
int re=0,flag=1;char ch=getchar();
while(ch>'9'||ch<'0'){
if(ch=='-') flag=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') re=(re<<1)+(re<<3)+ch-'0',ch=getchar();
return re*flag;
}
int n,m,first[100010],cnte=-1,col[100010],vis[200010];ll cnt[3],cntn,cntm;
struct edge{
int to,next;
}a[200010];
inline void add(int u,int v){
a[++cnte]=(edge){v,first[u]};first[u]=cnte;
a[++cnte]=(edge){u,first[v]};first[v]=cnte;
}
bool dfs(int u,int f,int type){
int i,v,re=1,w;col[u]=(col[f]+type+3)%3;cnt[col[u]]++;cntn++;
for(i=first[u];~i;i=a[i].next){
v=a[i].to;w=(i%2?1:-1);
if(vis[i]||vis[i^1]) continue;
else cntm++,vis[i]=vis[i^1]=1;
if(col[v]==-1) re&=dfs(v,u,w);
else{
if(col[v]!=(col[u]+w+3)%3) re=0,cnt[0]=cnt[1]=cnt[2]=1e9;
}
}
return re;
}
int main(){
memset(first,-1,sizeof(first));
n=read();m=read();int i,t1,t2;ll ans=0;
for(i=1;i<=m;i++){
t1=read();t2=read();
add(t1,t2);
}
memset(col,-1,sizeof(col));
for(i=1;i<=n;i++){
if(~col[i]) continue;
memset(cnt,0,sizeof(cnt));cntn=cntm=0;
if(dfs(i,0,1)){
if(!cnt[0]||!cnt[1]||!cnt[2]) ans+=cntm;
else ans+=cnt[0]*cnt[1]+cnt[1]*cnt[2]+cnt[2]*cnt[0];
}
else{
if(!cnt[0]||!cnt[1]||!cnt[2]) ans+=cntm;
else ans+=cntn*cntn;
}
}
cout<<ans;
}
[Atcoder Grand Contest 006 F][AGC006F] Blackout [染色]的更多相关文章
- AtCoder Grand Contest 006 F - Blackout
Description 在 \(n*n\) 的棋盘上给出 \(m\) 个黑点,若 \((x,y)\),\((y,z)\) 都是黑点,那么 \((z,x)\) 也会变成黑点,求最后黑点的数量 题面 So ...
- AtCoder Grand Contest 006
AtCoder Grand Contest 006 吐槽 这套题要改个名字,叫神仙结论题大赛 A - Prefix and Suffix 翻译 给定两个串,求满足前缀是\(S\),后缀是\(T\),并 ...
- AtCoder Grand Contest 002 F:Leftmost Ball
题目传送门:https://agc002.contest.atcoder.jp/tasks/agc002_f 题目翻译 你有\(n*k\)个球,这些球一共有\(n\)种颜色,每种颜色有\(k\)个,然 ...
- AtCoder Grand Contest 006 C:Rabbit Exercise
题目传送门:https://agc006.contest.atcoder.jp/tasks/agc006_c 题目翻译 数轴上有\(N\)只兔子,从\(1\)到\(N\)编号,每只兔子初始位置是\(x ...
- AtCoder Grand Contest 017 F - Zigzag
题目传送门:https://agc017.contest.atcoder.jp/tasks/agc017_f 题目大意: 找出\(m\)个长度为\(n\)的二进制数,定义两个二进制数的大小关系如下:若 ...
- AtCoder Grand Contest 003 F - Fraction of Fractal
题目传送门:https://agc003.contest.atcoder.jp/tasks/agc003_f 题目大意: 给定一个\(H×W\)的黑白网格,保证黑格四连通且至少有一个黑格 定义分形如下 ...
- AtCoder Grand Contest 011 F - Train Service Planning
题目传送门:https://agc011.contest.atcoder.jp/tasks/agc011_f 题目大意: 现有一条铁路,铁路分为\(1\sim n\)个区间和\(0\sim n\)个站 ...
- AtCoder Grand Contest 010 F - Tree Game
题目传送门:https://agc010.contest.atcoder.jp/tasks/agc010_f 题目大意: 给定一棵树,每个节点上有\(a_i\)个石子,某个节点上有一个棋子,两人轮流操 ...
- AtCoder Grand Contest 016 F - Games on DAG
题目传送门:https://agc016.contest.atcoder.jp/tasks/agc016_f 题目大意: 给定一个\(N\)点\(M\)边的DAG,\(x_i\)有边连向\(y_i\) ...
随机推荐
- 泉五培训Day2
T1 旅游 题目 [题目描述] 幻想乡有n个景点(从1开始标号),有m条双向的道路连在景点之间,每条道路有一个人气值d,表示这条道路的拥挤程度.小G不会经过那些人气值大于x的道路,她想知道有多少对景点 ...
- Servlet学习笔记07——什么是cookie,session?
7)cookie的路径问题 a.什么是cookie路径问题? 浏览器在向服务器上的某个地址发送请求时, 会查看cookie的路径是否与该地址匹配,只有 匹配的cookie才会被发送. b.cookie ...
- PHP siege 压测 QPS大小
1.使用 PHP-FPM SOCKET的形式通讯 2.配置 PHP-FPM配置 [root@bogon php-fpm.d]# ls -al 总用量 drwxr-xr-x. root root 8月 ...
- 使用myeclipse创建servlet后输入地址无法访问
问题: 使用myeclipse创建servlet后输入地址无法访问 1.首先,路径的访问地址是在web.xml里设置的,一般会自动生成(但是可能会和你自己输入的有出入) 你必须按照<url-pa ...
- list函数及list对象的reverse方法
list的reverse方法,是就地reverse,不返回值 如a是一个list,a.reverse()直接将a这个list给reverse了,所以如果print(a.reverse())就是None ...
- 指定的参数已超出有效值的范围。 参数名: site
“/”应用程序中的服务器错误. 指定的参数已超出有效值的范围.参数名: site 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的 ...
- Huffman Tree -- Huffman编码
#include <stdlib.h> #include <stdio.h> #include <string.h> typedef struct HuffmanT ...
- 3,Linux入门
操作系统的分类 Windows系列操作系统,Unix类操作系统,Linux类操作系统,Mac操作系统 提问:为什么要去学习Linux? 同学甲可能要问,超哥你介绍了这么多有关Linux的知识,但我还是 ...
- WPF 加载等待动画
原文:WPF 加载等待动画 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_29844879/article/details/80216587 ...
- 从库函数操作RCC的流程来理解偏移变量
下面是库函数操作RCC流程,看完后有我的疑问:偏移地址的理解 1,库函数直接操作:RCC库函数操作 RCC_APB2PeriphClockCmd ()RCC->APB2ENR |= RCC_A ...