%拜!颜神怒A此题,像我这样的渣渣只能看看题解度日╭(╯^╰)╮在这里把两种做法都记录一下吧~

  题解做法:可以考虑单独的一只鸡 u 能否存活。首先我们将 u 加入到集合S。然后我们按照时间倒序往回推,如果在时间 t 的时候发现有 u 和 v 同时被抉择,为了保证 u 的存活我们只能杀掉 v,也就是说在 t - 1的时刻 v 必须存活。这时我们将 v 加入到集合 S 中,再继续进行这个过程。如果在某个时刻我们发现 u 和 v 同时被抉择,可 u 和 v 都已经在集合中出现过了(要求在这个时刻一并存活),这样显然是非法的。所以可以判定 u 没有存活的可能。

  如果一只鸡 u 能够存活,我们把这个过程中获得的 S 集合称作 \(S_{u}\) 。u 和 v 能够共存的充要条件即为 u 和 v 均有存活的可能,且 \(S_{u}\) 和 \(S_{v}\) 两个集合不存在交集。为什么呢?因为一只鸡在 t 时刻出现在了 S 集合中,说明它将在 t 时刻被杀掉。如果两个集合中 x 出现的时间不同,那么出现了冲突;但它们又不可能在同一个时间出现,因为一个时间节点只有唯一的一个抉择,反推回去也必然都是一样的,但开始的节点一个是 u,一个是 v,所以不可能。得证。

  代码:

#include <bits/stdc++.h>
using namespace std;
#define maxn 405
#define maxm 100500
int n, m, x[maxm], y[maxm], mark[maxn];
int ans, S[maxn][maxn]; int read()
{
int x = , k = ;
char c; c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} int main()
{
n = read(), m = read();
for(int i = ; i <= m; i ++) x[i] = read(), y[i] = read();
for(int i = ; i <= n; i ++)
{
memset(mark, , sizeof(mark));
mark[i] = ; S[i][++ S[i][]] = i;
for(int j = m; j >= ; j --)
{
if(mark[x[j]] && mark[y[j]]) { S[i][] = -; break; }
if(mark[x[j]]) mark[y[j]] = ;
else if(mark[y[j]]) mark[x[j]] = ;
}
if(S[i][] == -) continue;
for(int j = ; j <= n; j ++)
if(mark[j]) S[i][] ++, S[i][S[i][]] = j;
} for(int i = ; i <= n; i ++)
for(int j = i + ; j <= n; j ++)
{
if(S[i][] == - || S[j][] == -) continue;
memset(mark, , sizeof(mark)); bool flag = ;
for(int k = ; k <= S[i][]; k ++) mark[S[i][k]] = ;
for(int k = ; k <= S[j][]; k ++)
if(mark[S[j][k]]) { flag = ; break; }
if(flag) ans ++;
}
printf("%d\n", ans);
return ;
}

  下面是颜神的解法(并没有代码...)也非常的妙,而且复杂度比题解还低……可以考虑建出一张图,在这张图上面所有有连边的鸡均无法共存来获得答案。那么如何建出这张图?一个人选择了 u 和 v 这两只鸡,那么这两只鸡是一定不可能共存的。假设我们在 t - 1 时刻建出的图满足在 t - 1 时刻及之前出现的所有抉择所限制不能共存的鸡均有连边,那么考虑加入t时刻的抉择之后会对这张图产生什么影响。

  考虑 u 和 v 的抉择,会使哪些原本可以和 u 共存的鸡不能再和 u 共存?

  如果图中的一只鸡 x 与 u 没有连边,也与 v 没有连边,那么它与 u 的生死无关;

  如果一只鸡 x 与 v 有连边,而与 u 没有连边,说明 u 和 x 不能共存,我们添加一条从 u 到 x 的边。因为 x 与 v 不能共存,所以若 x 存活,v 一定死亡。那么新的 u,v 边一定会导致 u 的死亡;若 x 死亡,那么 u 可能依然存活,也可能已经死亡;但在这两种情况下,x 都不能与 u 共存。对于 v 我们也是一样的添边。

  最后检查一下哪些节点是可以共存的即可。

【题解】Atcoder AGC#16 E-Poor Turkeys的更多相关文章

  1. [题解] Atcoder AGC 005 F Many Easy Problems NTT,组合数学

    题目 观察当k固定时答案是什么.先假设每个节点对答案的贡献都是\(\binom{n}{k}\),然后再减掉某个点没有贡献的选点方案数.对于一个节点i,它没有贡献的方案数显然就是所有k个节点都选在i连出 ...

  2. AGC 16 D - XOR Replace

    AGC 16 D - XOR Replace 附上attack(自为风月马前卒爷) 的题解 Problem Statement There is a sequence of length N: a=( ...

  3. [AGC016E]Poor Turkeys

    [AGC016E]Poor Turkeys 题目大意: 有\(n(n\le400)\)只火鸡,编号为\(1\)到\(n\),有\(m(m\le10^5)\)个人,每人指定了两只火鸡\(x\)和\(y\ ...

  4. Atcoder AGC016 E Poor Turkeys

    比赛的时候口胡这道题口胡了一年,看完题解被教做人 题意:有n只火鸡,m个猎人按序来杀火鸡,从自己预先选的两只中杀一只,问有多少火鸡对可以同时存活 考虑对于每一只火鸡i,按时间逆序维护一个最小的集合Si ...

  5. AtCoder Grand Contest 016 E - Poor Turkeys

    题目传送门:https://agc016.contest.atcoder.jp/tasks/agc016_e 题目大意: 有\(N\)只火鸡,现有\(M\)个人,每个人指定了两只火鸡\(x,y\),每 ...

  6. 【题解】Atcoder AGC#01 E-BBQ Hard

    计数题萌萌哒~ 这道题其实就是统计 \(\sum_{i=1}^{n}\sum_{j=i+1}^{n}C\binom{a[i] + a[j]}{a[i] + a[j] + b[i] + b[j]}\) ...

  7. 【题解】Atcoder AGC#03 E-Sequential operations on Sequence

    仙题膜拜系列...首先我们可以发现:如果在截取了一段大的区间之后再截取一段小的区间,显然是没有什么用的.所以我们可以将操作序列变成单调递增的序列. 然后怎么考虑呢?启示:不一定要考虑每一个数字出现的次 ...

  8. 【做题记录】AtCoder AGC做题记录

    做一下AtCoder的AGC锻炼一下思维吧 目前已做题数: 75 总共题数: 239 每一场比赛后面的字母是做完的题,括号里是写完题解的题 AGC001: ABCDEF (DEF) AGC002: A ...

  9. AtCoder AGC #2 Virtual Participation

    在知乎上听zzx大佬说AGC练智商...于是试了一下 A.Range Product 给$a$,$b$,求$\prod^{b}_{i=a}i$是正数,负数还是$0$ ...不写了 B.Box and ...

随机推荐

  1. python字符串格式化符号及转移字符含义

    博文出自鱼C论坛文章 http://bbs.fishc.com/thread-39140-1-1.html

  2. fastjson处理json

    返回主页 你是风儿 博客园首页新随笔联系订阅管理 随笔 - 29 文章 - 0 评论 - 23 FastJson对于JSON格式字符串.JSON对象及JavaBean之间的相互转换 fastJson对 ...

  3. mysql新手进阶03

    当年忠贞为国酬,何曾怕断头? 如今天下红遍,江山靠谁守? 业未就,身躯倦,鬓已秋. 你我之辈,忍将夙愿,付与东流? 数据库结构如下: 仓库(仓库号, 城市, 面积) 订购单(职工号, 供应商号, 订购 ...

  4. (转载)Unity3d中的属性(Attributes)整理

    附加: float字段检视面板修改:[Range(1,10)] 对属性进行分组:[Header("xxx")] 工具栏中调用方法,类文件需在Editor文件夹中:[MenuIte( ...

  5. leetcode-帕斯卡三角形

    帕斯卡三角形 给定一个非负整数 numRows,生成杨辉三角的前 numRows 行. 示例: 输入: 5 输出: [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4 ...

  6. ajax 和 mock 数据

    ajax ajax是一种技术方案,但并不是一种新技术.它依赖的是现有的CSS/HTML/Javascript,而其中最核心的依赖是浏览器提供的XMLHttpRequest对象,是这个对象使得浏览器可以 ...

  7. Matlab结构体定义

    定义一个Matlab结构体的代码,以飞行器为例: classdef flightpro properties pos = [ ]; RGB = [ ]; rate; type; end end

  8. canvas学习(四):高级属性

    一:阴影 示例:绘制一个带有阴影的正方形 var canvas = document.getElementById("myCanvas") var ctx = canvas.get ...

  9. Switches and Lamps(思维)

    You are given n switches and m lamps. The i-th switch turns on some subset of the lamps. This inform ...

  10. 软工2017团队协作第七周——个人PSP

    10.27 --11.2本周例行报告 1.PSP(personal software process )个人软件过程. 类型 任务 开始时间                结束时间 中断时间 实际用时 ...