Description

​ 给你一个NN行NN列的网格,第ii行第jj列的格子用(i,j)(i,j)表示

一开始的时候有MM个格子被涂成黑色,其他的格子都是白色,具体一点,涂成黑色的格子为(a1,b1),(a2,b2),(a3,b3)...(aM,bM)(a1,b1),(a2,b2),(a3,b3)...(aM,bM)

你的目标是按照以下规则将尽可能多的白色格子涂成黑色:如果存在三个格子(x,y)(x,y),(y,z)(y,z)和(z,x)(z,x)满足(x,y)(x,y)和(y,z)(y,z)都是黑格子并且(z,x)(z,x)是白格子(其中x,y,zx,y,z都是[1,N][1,N]之间的整数),那么你可以将(z,x)(z,x)涂成黑色

输出你不能继续操作时,黑格子的最大数量

Input

​ 第一行两个正整数N,MN,M

接下来MM行每行两个正整数(ai,bi)(ai,bi)表示一开始被涂成黑色的格子

Output

​ 共一行,一个整数ansans表示不能操作时黑格子的最大数量

Sample Input

#Sample1
3 2
1 2
2 3 #Sample2
2 2
1 1
1 2 #Sample3
4 3
1 2
1 3
4 4

Sample Output

#Sample1
3 #Sample2
4 #Sample3
3

HINT

数据范围:

​ 对于100%的数据,1<=N,M<=105,1<=ai,bi<=N1<=N,M<=105,1<=ai,bi<=N,并且所有的(ai,bi)(ai,bi)互不相同

样例解释:

​ Sample1:(1,2)(1,2)和(2,3)(2,3)都是黑的,可将白格(3,1)(3,1)涂成白色

​ Sample2:(1,1)(1,1)和(1,2)(1,2)都是黑的,可将白格(2,1)(2,1)涂成黑色;接着(2,1)(2,1)和(1,2)(1,2)都是黑的,可将白格(2,2)(2,2)涂成黑色

​ Sample3:无法操作

Sol

对于每个黑色点,我们直接连边x-y,然后发现距离为3的点可以产生贡献的边。

为了处理这个问题,我们对图进行012染色,x-y连距离1,y-x连距离2,根据距离mod3决定染得颜色,之后0-1,1-2,2-0都是合法的变黑的方案。。。答案为\(c0*c1+c1*c2+c2*c0\)。

假设染色出现环,画个图就知道所有点都能互相连边,所以答案是\(size^2\)。

如果根本染不满,就是原来的数量。。。

其实上面讲的不是核心思想。。。核心思想之有第一句,后面的只是一种高效简洁的实现方法。。。

Code

#include <bits/stdc++.h>
using namespace std;
int n,m,x,y,col[100005],cnt[5],ok;long long ans;vector<pair<int,int> >e[100005];
void dfs(int x)
{
cnt[col[x]]++;
for(int i=0;i<e[x].size();i++)
{
if(e[x][i].second==1) cnt[3]++;
if(col[e[x][i].first]==-1) col[e[x][i].first]=(col[x]+e[x][i].second)%3,dfs(e[x][i].first);
else if((col[x]+e[x][i].second)%3!=col[e[x][i].first]) ok=1;
}
}
int main()
{
scanf("%d%d",&n,&m);memset(col,-1,sizeof(col));
for(int i=1;i<=m;i++) scanf("%d%d",&x,&y),e[x].push_back(make_pair(y,1)),e[y].push_back(make_pair(x,2));
for(int i=1;i<=n;i++) if(col[i]==-1)
{
memset(cnt,0,sizeof(cnt));ok=col[i]=0;dfs(i);
if(ok){ans+=1ll*(cnt[0]+cnt[1]+cnt[2])*(cnt[0]+cnt[1]+cnt[2]);continue;}
else if((!cnt[0])||(!cnt[1])||(!cnt[2])){ans+=1ll*cnt[3];continue;}
else ans+=1ll*cnt[0]*cnt[1]+1ll*cnt[1]*cnt[2]+1ll*cnt[2]*cnt[0];
}
printf("%lld\n",ans);
}

[agc006f] Blackout 神题的更多相关文章

  1. 2017国家集训队作业[agc006f]Blackout

    2017国家集训队作业[agc006f]Blackout 题意: 有一个\(N*N\)的网格,一开始有\(M\)个格子被涂黑,给出这\(M\)个格子,和染色操作:如果有坐标为\((x,y),(y,z) ...

  2. POJ 2484 A Funny Game(神题!)

    一开始看这道博弈题的时候我就用很常规的思路去分析了,首先先手取1或者2个coin后都会使剩下的coin变成线性排列的长条,然后无论双方如何操作都是把该线条分解为若干个子线条而已,即分解为若干个子游戏而 ...

  3. BUAA 724 晴天小猪的神题(RMQ线段树)

    BUAA 724 晴天小猪的神题 题意:中文题,略 题目链接:http://acm.buaa.edu.cn/problem/724/ 思路:对于询问x,y是否在同一区间,可以转换成有没有存在一个区间它 ...

  4. Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题

    4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 177  Solved: 128[Submit][Status ...

  5. 【CF913F】Strongly Connected Tournament 概率神题

    [CF913F]Strongly Connected Tournament 题意:有n个人进行如下锦标赛: 1.所有人都和所有其他的人进行一场比赛,其中标号为i的人打赢标号为j的人(i<j)的概 ...

  6. [agc007f] Shik and Copying String 模拟神题

    Description ​ "全"在十分愉快打工,第0天,给了他一个仅有小写字母构成的长度为N的字符串S0,在之后的第i天里,"全"的工作是将Si−1复制一份到 ...

  7. AtCoder 神题汇总

    记录平时打 AtCoder 比赛时遇到的一些神题. Tenka1 Programmer Contest 2019 D Three Colors 题目大意 有 $n$ 个正整数 $a_1, a_2,\d ...

  8. hdoj5821【贪心-神题】

    啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,比赛的时候直接读错题了,实力带坑队友.... 题意: 有两个序列都代表筐,每个筐里只有一个球,然后序列的值代表筐里的球的颜色,问你在m次操作后,a序列的球能否变成b ...

  9. [Bzoj4817] [Sdoi2017]树点涂色 (LCT神题)

    4817: [Sdoi2017]树点涂色 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 629  Solved: 371[Submit][Status ...

随机推荐

  1. curl常用设置-涉及超时相关

    curl_easy_setopt( curl, CURLOPT_VERBOSE, 1L ); //在屏幕打印请求连接过程和返回http数据 curl_easy_setopt( curl, CURLOP ...

  2. Apache Flume 安装文档、日志收集

    简介: 官网 http://flume.apache.org 文档 https://flume.apache.org/FlumeUserGuide.html hadoop 生态系统中,flume 的职 ...

  3. IronPython Architecture

    [IronPython] IronPython is an implementation of the Python programming language written by the CLR t ...

  4. VMware Workstation 虚拟机的服务启动项

  5. 第六章 Windows应用程序对键盘与鼠标的响应 P121 6-8

    基于键盘与鼠标应用的程序设计 一.实验目的 1.掌握键盘与鼠标在应用程序中的消息响应机制.   二.实验内容及步骤 实验任务 1.熟悉键盘的消息响应: 2.熟悉鼠标的消息响应: 实验内容 设计一个窗口 ...

  6. ubuntu登陆无限循环

    现象:在Ubuntu登陆界面输入密码之后,黑屏一闪并且出现了check battery state之类的文字之后,又跳转到登录界面. 原因:主目录下的.Xauthority文件拥有者变成了root,从 ...

  7. 从iOS 11看怎样设计APP图标

    苹果WWDC2017开发者大会已经尘埃落定,除了新产品的发布,iOS 11也正式亮相.新系统中,地图.App Store.时钟.相机.联系人等等原生应用都换了新的图标.此次图标的变化势必也会激发下一个 ...

  8. Java程序设计9——泛型

    泛型是对集合的补充,JDK1.5增加泛型支持很大程度上都是为了让集合能记住其元素的数据类型.在没有泛型之前,一旦把一个对象丢进Java集合中,集合就会忘记对象的类型,把所有的对象都当成Object类型 ...

  9. Forms in Angular 2

    Input handling is an important part of application development. The ng-model directive provided in A ...

  10. mysql 更新替换字符串

    update zxg set newlevel = REPLACE(newlevel,'b','') 把表zxg中的newlevel字段中的b删除