【题解】Atcoder AGC#16 E-Poor Turkeys
%拜!颜神怒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的更多相关文章
- [题解] Atcoder AGC 005 F Many Easy Problems NTT,组合数学
题目 观察当k固定时答案是什么.先假设每个节点对答案的贡献都是\(\binom{n}{k}\),然后再减掉某个点没有贡献的选点方案数.对于一个节点i,它没有贡献的方案数显然就是所有k个节点都选在i连出 ...
- AGC 16 D - XOR Replace
AGC 16 D - XOR Replace 附上attack(自为风月马前卒爷) 的题解 Problem Statement There is a sequence of length N: a=( ...
- [AGC016E]Poor Turkeys
[AGC016E]Poor Turkeys 题目大意: 有\(n(n\le400)\)只火鸡,编号为\(1\)到\(n\),有\(m(m\le10^5)\)个人,每人指定了两只火鸡\(x\)和\(y\ ...
- Atcoder AGC016 E Poor Turkeys
比赛的时候口胡这道题口胡了一年,看完题解被教做人 题意:有n只火鸡,m个猎人按序来杀火鸡,从自己预先选的两只中杀一只,问有多少火鸡对可以同时存活 考虑对于每一只火鸡i,按时间逆序维护一个最小的集合Si ...
- AtCoder Grand Contest 016 E - Poor Turkeys
题目传送门:https://agc016.contest.atcoder.jp/tasks/agc016_e 题目大意: 有\(N\)只火鸡,现有\(M\)个人,每个人指定了两只火鸡\(x,y\),每 ...
- 【题解】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]}\) ...
- 【题解】Atcoder AGC#03 E-Sequential operations on Sequence
仙题膜拜系列...首先我们可以发现:如果在截取了一段大的区间之后再截取一段小的区间,显然是没有什么用的.所以我们可以将操作序列变成单调递增的序列. 然后怎么考虑呢?启示:不一定要考虑每一个数字出现的次 ...
- 【做题记录】AtCoder AGC做题记录
做一下AtCoder的AGC锻炼一下思维吧 目前已做题数: 75 总共题数: 239 每一场比赛后面的字母是做完的题,括号里是写完题解的题 AGC001: ABCDEF (DEF) AGC002: A ...
- AtCoder AGC #2 Virtual Participation
在知乎上听zzx大佬说AGC练智商...于是试了一下 A.Range Product 给$a$,$b$,求$\prod^{b}_{i=a}i$是正数,负数还是$0$ ...不写了 B.Box and ...
随机推荐
- 【POJ2482】Stars in Your Window
[POJ2482]Stars in Your Window 题面 vjudge 题解 第一眼还真没发现这题居然™是个扫描线 令点的坐标为\((x,y)\)权值为\(c\),则 若这个点能对结果有\(c ...
- 【LG2495】[SDOI2011]消耗战
[LG2495][SDOI2011]消耗战 题面 洛谷 题解 参考博客 题意 给你\(n\)个点的一棵树 \(m\)个询问,每个询问给出\(k\)个点 求将这\(k\)个点与\(1\)号点断掉的最小代 ...
- jQuery tableExport导出 excel
上篇写的是jQuery 导出word,就试试导出excel.看见网上写的很乱,我这就把我写的整理下来,有部分来自网上capy 1. js文件的引用 <script type="te ...
- 【JUC源码解析】AQS
简介 AQS,也即AbstractQueuedSynchronizer,抽象队列同步器,提供了一个框架,可以依赖它实现阻塞锁和相关同步器.有两种类型,独占式(Exclusive)和共享式(Share) ...
- 移动性能测试之gemebench安装
越来越多的人从事各种移动端性能测试,但工具和文档的资料却相对较少,这两天需要测试一款APP的性能,就来先简单介绍下gamebench的安装吧! 作为国人来说,使用gamebench还是有相当多的坑点: ...
- Memcache的客户端连接系列(一) Java
声明:本文并非原创,转自华为云帮助中心的分布式缓存服务(Memcached)的用户指南. 关键词: Memcached 客户端 Java Java连接池 Java客户端示例 用户的弹性云服务器已安装 ...
- 深度学习笔记 (二) 在TensorFlow上训练一个多层卷积神经网络
上一篇笔记主要介绍了卷积神经网络相关的基础知识.在本篇笔记中,将参考TensorFlow官方文档使用mnist数据集,在TensorFlow上训练一个多层卷积神经网络. 下载并导入mnist数据集 首 ...
- NTP错误总结
Ntp错误总结 解决ntp的错误 no server suitable for synchronization found 当用ntpdate -d 来查询时会发现导致 no server suita ...
- 1.linux环境配置
首先说一下,这里是虚拟机环境. 1.用vbox安装centos6.8-mini 注意不要使用复制的方式安装,复制的虚拟机网络不通 安装如下: 主机 ip 角色 内存 hadoop1 192.168.0 ...
- HADOOP docker(九):hdfs权限
1. 概述2. 用户身份标识3. 组映射4.关于权限的实现5.文件系统API的变更6.应用程序shell的变更7.超级用户8.ACLs9.ACL 文件系统API10.ACL命令11.参数配置12.总结 ...