题目传送门:https://agc016.contest.atcoder.jp/tasks/agc016_e

题目大意:

有\(N\)只火鸡,现有\(M\)个人,每个人指定了两只火鸡\(x,y\),每人依次进行操作,会从\(x,y\)中选一只火鸡吃掉;如果只有一个,那么必定吃掉剩下那个;如果都没有,这个人只能饿着肚子离开了……

问最后有多少对火鸡可能存活


我们设状态\(f_{i,j}\)表示如果要留下\(i\),那么是否要炖了\(j\),初始状态\(f_{i,i}=1\)

我们倒序考虑,如果\(f_{i,j}=1\),那么必然存在某个时刻会在\(i,j\)中抉择,这时\(j\)就会为了\(i\)挡枪子,但在这之前的时间,\(j\)需要收到和\(i\)一样的保护。那么这样就会牵扯到一堆火鸡,于是我们记\(S_i\)表示要留下\(i\),要为这一系列连锁反应挡枪的火鸡集合

如果存在某个时刻,需要在\(x,y\)中选择,但是存在\(f_{i,x}=f_{i,y}=1\),那么\(i\)就无法存活,这是结论1

考虑一对鸡\((i,j)\)如何被留下,如果存在一只鸡\(x\),既要保护\(i\),也要保护\(j\),那么\((i,j)\)必然不能共存,因为\(x\)只有一条命……因此我们可以得到,\((i,j)\)同时存在,当且仅当\(S_i\land S_j=\varnothing\),这是结论2

应用结论1和2即可,复杂度为\(O(nm+n^3)\),集合判交可以使用bitset优化

/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline char gc(){
static char buf[1000000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
inline int frd(){
int x=0,f=1; char ch=gc();
for (;ch<'0'||ch>'9';ch=gc()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=gc()) x=(x<<3)+(x<<1)+ch-'0';
return x*f;
}
inline int read(){
int 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<<3)+(x<<1)+ch-'0';
return x*f;
}
inline void print(int x){
if (x<0) putchar('-'),x=-x;
if (x>9) print(x/10);
putchar(x%10+'0');
}
const int N=4e2,M=1e5;
int A[M+10],B[M+10];
bool vis[N+10],sub[N+10][N+10];
int main(){
int n=read(),m=read(),Ans=0;
for (int i=1;i<=m;i++) A[i]=read(),B[i]=read();
for (int i=1;i<=n;i++){
sub[i][i]=1;
for (int j=m;j;j--){
bool x=sub[i][A[j]],y=sub[i][B[j]];
if (x&&y) vis[i]=1;
else if (x) sub[i][B[j]]=1;
else if (y) sub[i][A[j]]=1;
}
}
for (int i=1;i<=n;i++){
if (vis[i]) continue;
for (int j=i+1;j<=n;j++){
if (vis[j]) continue;
bool flag=1;
for (int k=1;k<=n;k++) if (sub[i][k]&&sub[j][k]) flag=0;
Ans+=flag;
}
}
printf("%d\n",Ans);
return 0;
}

AtCoder Grand Contest 016 E - Poor Turkeys的更多相关文章

  1. AtCoder Grand Contest 016 C - +/- Rectangle

    题目传送门:https://agc016.contest.atcoder.jp/tasks/agc016_c 题目大意: 给定整数\(H,W,h,w\),你需要判断是否存在满足如下条件的矩阵,如果存在 ...

  2. AtCoder Grand Contest 016 B - Colorful Hats

    题目传送门:https://agc016.contest.atcoder.jp/tasks/agc016_b 题目大意: 有\(N\)只猫,每只猫头上带着一个帽子,帽子有颜色,现在告诉你每只猫能看到的 ...

  3. AtCoder Grand Contest 016 F - Games on DAG

    题目传送门:https://agc016.contest.atcoder.jp/tasks/agc016_f 题目大意: 给定一个\(N\)点\(M\)边的DAG,\(x_i\)有边连向\(y_i\) ...

  4. AtCoder Grand Contest 016

    在雅礼和衡水的dalao们打了一场atcoder 然而窝好菜啊…… A - Shrinking 题意:定义一次操作为将长度为n的字符串变成长度n-1的字符串,且变化后第i个字母为变化前第i 或 i+1 ...

  5. Atcoder Grand Contest 016 F - Games on DAG(状压 dp)

    洛谷题面传送门 & Atcoder 题面传送门 如何看待 tzc 补他一个月前做的题目的题解 首先根据 SG 定理先手必输当且仅当 \(\text{SG}(1)=\text{SG}(2)\). ...

  6. AtCoder Grand Contest 016题解

    传送门 \(A\) 直接枚举最终的字母然后模拟就行了-- 就这数据范围还是别学我写的这种做法了-- const int N=105; char s[N];int las[26],mx[26],n,re ...

  7. AtCoder Grand Contest 012

    AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...

  8. AtCoder Grand Contest 011

    AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...

  9. AtCoder Grand Contest 031 简要题解

    AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...

随机推荐

  1. 李洪强iOS开发之 - enum与typedef enum的用法

    李洪强iOS开发之 - enum与typedef enum的用法 01 - 定义枚举类型 上面我们就在ViewController.h定义了一个枚举类型,枚举类型的值默认是连续的自然数,例如例子中的T ...

  2. Spark SQL is a Spark module for structured data processing.

    http://spark.apache.org/docs/latest/sql-programming-guide.html

  3. 中国vs美国制造业公司营业额大排名,看看哪些属于美国制造业的优势产业(中美旗鼓相当,而且还有本土制造的优势)

    当然,所谓的美国制造业,大量的东西现在 在中国制造和生产,但这里列举的,主要是卖实体工业产品为主的美国公司这个榜单里主要列出以工业产品销售为主的公司. 所以各大能源巨头虽然本身也是装备制造大户,但没被 ...

  4. 按行读入xml文件,删除不需要的行 -Java

    删除挺麻烦的,这里其实只是把需要的行存到arraylist中再存到另一个文件中 import java.io.BufferedReader;import java.io.BufferedWriter; ...

  5. i2c_set_clientdata函数【转】

    本文转载自‘:http://blog.csdn.net/jk198310/article/details/43738367 在i2c驱动中有很多函数和数据结构,很多一时难以理解,所以写下本文共同学习. ...

  6. jconsole工具检测堆内存变化的使用

    jconsole将Java写的程序检测. 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行.您可以轻松地使 ...

  7. [Silverlight 2.0 控制物体绕圆弧运行(C#初探篇)]

    我自己写的第一个 Silverlight 2.0 程序    [Silverlight 2.0 控制物体绕圆弧运行(C#初探篇)]            程序运行时:小地球将绕着圆形轨迹做圆周运动. ...

  8. uestc 250 windy数(数位dp)

    题意:不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 思路:数位dp #include<iostream ...

  9. CollectionView垂直缩放卡片布局

    实现效果 实现思路 从效果图可以看到变化是,越是往中间滚动的item显示最大,越显眼.而越是往前面,或者越是后面的,反而显示越小,这样就形成了视觉差. 实现的思路就是通过重写在可见范围内的所有item ...

  10. 并不对劲的p4449于神之怒加强版

    题目大意 给定\(t,k(t\leq2000,k\leq5*10^6)\) \(t\)组询问,每组给出\(n,m(n,m\leq5*10^6)\)求$\sum_{i=1}^n \sum_{j=1}^m ...