题目传送门: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优化

  1. /*program from Wolfycz*/
  2. #include<cmath>
  3. #include<cstdio>
  4. #include<vector>
  5. #include<cstring>
  6. #include<iostream>
  7. #include<algorithm>
  8. #define inf 0x7f7f7f7f
  9. using namespace std;
  10. typedef long long ll;
  11. typedef unsigned int ui;
  12. typedef unsigned long long ull;
  13. inline char gc(){
  14. static char buf[1000000],*p1=buf,*p2=buf;
  15. return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
  16. }
  17. inline int frd(){
  18. int x=0,f=1; char ch=gc();
  19. for (;ch<'0'||ch>'9';ch=gc()) if (ch=='-') f=-1;
  20. for (;ch>='0'&&ch<='9';ch=gc()) x=(x<<3)+(x<<1)+ch-'0';
  21. return x*f;
  22. }
  23. inline int read(){
  24. int x=0,f=1; char ch=getchar();
  25. for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
  26. for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
  27. return x*f;
  28. }
  29. inline void print(int x){
  30. if (x<0) putchar('-'),x=-x;
  31. if (x>9) print(x/10);
  32. putchar(x%10+'0');
  33. }
  34. const int N=4e2,M=1e5;
  35. int A[M+10],B[M+10];
  36. bool vis[N+10],sub[N+10][N+10];
  37. int main(){
  38. int n=read(),m=read(),Ans=0;
  39. for (int i=1;i<=m;i++) A[i]=read(),B[i]=read();
  40. for (int i=1;i<=n;i++){
  41. sub[i][i]=1;
  42. for (int j=m;j;j--){
  43. bool x=sub[i][A[j]],y=sub[i][B[j]];
  44. if (x&&y) vis[i]=1;
  45. else if (x) sub[i][B[j]]=1;
  46. else if (y) sub[i][A[j]]=1;
  47. }
  48. }
  49. for (int i=1;i<=n;i++){
  50. if (vis[i]) continue;
  51. for (int j=i+1;j<=n;j++){
  52. if (vis[j]) continue;
  53. bool flag=1;
  54. for (int k=1;k<=n;k++) if (sub[i][k]&&sub[j][k]) flag=0;
  55. Ans+=flag;
  56. }
  57. }
  58. printf("%d\n",Ans);
  59. return 0;
  60. }

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. ribbon负载均衡进行服务消费

    相同服务以不同端口形式注册到eureka上,ribbon从eureka上获取冰进行服务消费,会偶现如下现象: I/O error on GET request for "http://COM ...

  2. ++*p,(*p)++,*p++与*++p四者的区别

    四者的区别(*和++优先级相同默认从右向左运算) ++*p相当于++(*p),表示先给p指向的变量值加1,然后取该变量的值. (*p)++相当于先取p指向的变量,然后该变量值加1. *p++相当于*( ...

  3. 每天一个JavaScript实例-apply和call的使用方法

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  4. 在C语言中使用libiconv进行编码转换的示例

    libiconv_sample.c #include <stdio.h> #include <malloc.h> #include "libiconv/iconv.h ...

  5. DOM操作三

    1.以一个对象的x和y属性的方式返回滚动条的偏移量 function getScrollOffsets(w){ //使用指定的窗口,如果不带参数则使用当前窗口 w= w || window; //除了 ...

  6. ElasticSearch远程随意代码运行漏洞(CVE-2014-3120)分析

    原理 这个漏洞实际上非常easy,ElasticSearch有脚本运行(scripting)的功能,能够非常方便地对查询出来的数据再加工处理. ElasticSearch用的脚本引擎是MVEL,这个引 ...

  7. vmware Ubuntu忘记登录密码

    VMware Workstation 上的Ubuntu 11.10 登录时,用户密码忘记了,以下是我对此问题解决的方法: 1)重新启动Ubtuntu 16 系统,同时长时间按住(或连续点击)esc键进 ...

  8. 包、修饰符、内部类、匿名内部类(java基础知识十)

    1.package关键字的概述及作用 * A:为什么要有包     * 将字节码(.class)进行分类存放  * B:包的概述     *   * C:包的作用     * 包名要定义在第一行,   ...

  9. iOS NSInteger/NSUInteger与int/unsigned int、long/unsigned long之间的区别!

    在iOS开发中经常使用NSInteger和NSUInteger,而在其他的类似于C++的语言中,我们经常使用的是int.unsigned int.我们知道iOS也可以使用g++编译器,那么它们之间是否 ...

  10. linux--安装phpcurl扩展

    在UBUNTU中直接用APT包管理工具安装: apt-get install curl libcurl3 libcurl3-dev php5-curl 安装好后重启Apache服务器就行了,如果还是不 ...