Atcoder AGC016 E Poor Turkeys

比赛的时候口胡这道题口胡了一年,看完题解被教做人

题意:有n只火鸡,m个猎人按序来杀火鸡,从自己预先选的两只中杀一只,问有多少火鸡对可以同时存活

考虑对于每一只火鸡i,按时间逆序维护一个最小的集合Si,满足当前时间其中的所有火鸡都活着才能保证最后火鸡i活下

在当前操作的最前面加入新的操作x y对结果转移的影响

1.x y均不在集合中,显然与i的死活无关,不管

2.一个在集合中,不放设为x,则y在这个操作前必须活着才能保证这个操作后x活着

3.都在集合中,gg

从最后一步逆推到第一步,得到集合Si

从我们的递推过程不难发现Si中的火鸡最后都是必死无疑,而且如果有火鸡在预料之外送人头也会gg

那么i和j能在最后同时存活的充要条件就是Si∩Sj==?

bitset维护,完事

 1 #include <bits/stdc++.h>
 2 #define B bitset<500>
 3 using namespace std;
 4 int n,m;
 5 int x[200000],y[200000];
 6 bool die[500];
 7 B a[500];
 8 int main()
 9 {
10     scanf("%d%d",&n,&m);
11     for(int i=1;i<=m;i++)
12         scanf("%d%d",&x[i],&y[i]);
13     for(int i=1;i<=n;i++)
14     {
15         a[i][i]=1;
16         for(int j=m;j;j--)
17         if(a[i][x[j]] && a[i][y[j]])
18         {
19             die[i]=1;
20             break;
21         }
22         else
23         if(a[i][x[j]])
24             a[i][y[j]]=1;
25         else
26         if(a[i][y[j]])
27             a[i][x[j]]=1;
28     }
29     int ans=0;
30     for(int i=1;i<n;i++)
31     if(!die[i])
32         for(int j=i+1;j<=n;j++)
33         if(!die[j] && (a[i]&a[j]).none())
34             ++ans;
35     printf("%d\n",ans);
36     return 0;
37 }
时间: 2024-08-30 16:44:50

Atcoder AGC016 E Poor Turkeys的相关文章

AtCoder Grand Contest 016 E - Poor Turkeys

题目传送门:https://agc016.contest.atcoder.jp/tasks/agc016_e 题目大意: 有\(N\)只火鸡,现有\(M\)个人,每个人指定了两只火鸡\(x,y\),每人依次进行操作,会从\(x,y\)中选一只火鸡吃掉:如果只有一个,那么必定吃掉剩下那个:如果都没有,这个人只能饿着肚子离开了-- 问最后有多少对火鸡可能存活 考虑倒序,我们设状态\(f_{i,j}\)表示如果要留下\(i\),那么是否要炖了\(j\),初始状态\(f_{i,i}=1\) 我们倒序考虑

[agc016E]Poor Turkeys

Description 传送门 Solution 如果真的按照题目要求一对对的考虑好麻烦的..(我场上就没嗑出来) 我们定义集合ai,假如鸡i要存活,则它需要哪一些鸡在它和i相关的鸡同时被拎出来前存活. 可能定义看得人有点晕..是这样,初始时ai里只有i.则我们要求所有和i同时被拎出来过的鸡,在和i同时被拎出来前存活,将这些点加到ai里. 然后ai里的每一个点都按上述方式扩展直到无法扩展,实现用dfs就好.(假如在扩展中某一个节点已经在集合a中的时候又被访问到则鸡i一定会被吃,证明显然) 我们枚

【AGC016E】Poor Turkeys

Description 有\(n\)(\(1 \le n \le 400\))只鸡,接下来按顺序进行\(m\)(\(1 \le m \le 10^5\))次操作.每次操作涉及两只鸡,如果都存在则随意拿走一只:如果只有一只存在,拿走这一只:如果都不存在,什么都不做. 求最后有多少对鸡(无序)可能共同存活. Solution 个人认为单用集合的解释方法有失偏颇. 首先考虑枚举两只鸡,规定它们一定要存活,然后模拟过程.怎么看单次模拟的复杂度都不会小于\(m\),因此要第一时间舍弃这种方法. 于是要换个

【题解】Atcoder AGC#16 E-Poor Turkeys

%拜!颜神怒A此题,像我这样的渣渣只能看看题解度日╭(╯^╰)╮在这里把两种做法都记录一下吧~ 题解做法:可以考虑单独的一只鸡 u 能否存活.首先我们将 u 加入到集合S.然后我们按照时间倒序往回推,如果在时间 t 的时候发现有 u 和 v 同时被抉择,为了保证 u 的存活我们只能杀掉 v,也就是说在 t - 1的时刻 v 必须存活.这时我们将 v 加入到集合 S 中,再继续进行这个过程.如果在某个时刻我们发现 u 和 v 同时被抉择,可 u 和 v 都已经在集合中出现过了(要求在这个时刻一并存

【AtCoder】AGC016

A - Shrinking 用每个字母模拟一下就行 #include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar(' ') #define enter putchar('\n') #define eps 1e-10 #define MAXN 200

AtCoder Grand Contest 016

AtCoder Grand Contest 016 A - Shrinking 你可以进行一个串的变换,把一个长度为\(n\)的串\(S\)可以变成长度为\(n-1\)的串\(T\),其中\(T_i\)要么是\(S_i\)要么是\(S_{i+1}\). 现在问你最少进行多少次这个操作,能够使最终得到的\(T\)只由一个字符构成. \(|S|\le 100\) 首先枚举最终字符是哪一个.那么首先在\(S\)末尾加上一个这个字符,那么这个最小步数等于对于所有位置而言,离它最近的枚举的字符到这个位置的

AtCoder Grand Contest 016 C - +/- Rectangle

题目传送门:https://agc016.contest.atcoder.jp/tasks/agc016_c 题目大意: 给定整数\(H,W,h,w\),你需要判断是否存在满足如下条件的矩阵,如果存在,则输出任意一种可能的方案 矩阵是\(H\)行\(W\)列 矩阵的每个元素的权值在\([-10^9,10^9]\)之间 矩阵的所有元素权值和为正 任意大小为\(h×w\)的子矩阵的元素权值和为负 构造题一般都是智商题--首先\(\%\%\%wzy\) 既然子矩阵的值是负数,那么我们就尽可能让它负的少

关于过拟合、局部最小值、以及Poor Generalization的思考

Poor Generalization 这可能是实际中遇到的最多问题. 比如FC网络为什么效果比CNN差那么多啊,是不是陷入局部最小值啊?是不是过拟合啊?是不是欠拟合啊? 在操场跑步的时候,又从SVM角度思考了一下,我认为Poor Generalization属于过拟合范畴. 与我的论文 [深度神经网络在面部情感分析系统中的应用与改良] 的观点一致. SVM ImageNet 2012上出现了一个经典虐杀场景.见[知乎专栏] 里面有一段这么说道: 当时,大多数的研究小组还都在用传统compute

【HDOJ】4956 Poor Hanamichi

基本数学题一道,看错位数,当成大数减做了,而且还把方向看反了.所求为最接近l的值. 1 #include <cstdio> 2 3 int f(__int64 x) { 4 int i, sum; 5 6 i = sum = 0; 7 while (x) { 8 if (i & 1) 9 sum -= x%10; 10 else 11 sum += x%10; 12 ++i; 13 x/=10; 14 } 15 return sum; 16 } 17 18 int main() { 1