Codeforces 1368E - Ski Accidents(构造+思维)
神仙构造题(不过可能我构造太烂了?)
首先考虑这个奇奇怪怪的 \(\dfrac{4}{7}\),以及这个每个点出度最多为 \(2\) 的条件有何用意。容易发现 \(4=2^2,7=1+2+4\),这启发我们通过某种方式将原图的点集分成三部分。我们考虑构造三个点集 \(A,B,C\) 满足:
- 对于 \(A\) 中的点 \(x\),要么其入度为 \(0\),要么所有连向它的边的另一个端点都属于 \(C\)
- 对于 \(B\) 中的点 \(x\),满足不存在一条边 \((y,x),s.t.y\in B\),且至少存在一条边 \((y,x),s.t.y\in A\)
- 对于 \(C\) 中的点 \(x\),满足至少存在一条边 \((y,x),s.t.y\in B\)。
显然对于任意 \(v\in V\),\(v\) 必然属于 \(A,B,C\) 之一,因此这是一个合法的划分。我们考虑一遍拓扑排序求出 \(col_x\) 表示点 \(x\) 属于 \(A,B,C\) 哪个集合(\(0\) 表示 \(A\),\(1\) 表示 \(B\),\(2\) 表示 \(C\)),然后取 \(col_x=2\) 的点作为答案即可。
为什么?首先我们要说明 \(|C|\le\dfrac{4}{7}n\),不难发现由于每个点度最多为二,因此每个 \(A\) 中的点最多可以产生 \(2\) 个 \(B\) 中的点,因此 \(|B|\le 2|A|\),每个 \(B\) 中的点也最多对应 \(2\) 个 \(C\) 中的点,因此 \(|C|\le 2|B|\),故 \(|C|\le\dfrac{4}{7}n\)。其次我们要说明删除 \(C\) 中的点之后剩余部分满足最多存在一条路径这个限制,不难发现 \(A\) 中点由于在原图中只存在 \(C\) 中点连向它们的边,现在删除了 \(C\),自然入度为 \(0\),同理 \(B\) 中点出度也为零。显然这样的图最长路径只可能是某个 \(A\) 中的点连到某个 \(B\) 中的点,长度最多为 \(1\),符合要求。
时间复杂度线性。
希望今晚 GLBR 不要在 E 放个这样的人类智慧题
const int MAXN=2e5;
const int MAXM=4e5;
int n,m,hd[MAXN+5],to[MAXM+5],nxt[MAXM+5],ec=0,deg[MAXN+5],col[MAXN+5];
void adde(int u,int v){to[++ec]=v;nxt[ec]=hd[u];hd[u]=ec;}
void clear(){for(int i=1;i<=n;i++) hd[i]=deg[i]=col[i]=0;ec=0;}
void solve(){
scanf("%d%d",&n,&m);clear();
for(int i=1,u,v;i<=m;i++) scanf("%d%d",&u,&v),adde(u,v),deg[v]++;
queue<int> q;for(int i=1;i<=n;i++) if(!deg[i]) q.push(i);
vector<int> res;
while(!q.empty()){
int x=q.front();q.pop();
for(int e=hd[x];e;e=nxt[e]){
int y=to[e];
if(col[x]==1) col[y]=2;
else if(col[x]==0&&!col[y]) col[y]=1;
if(!--deg[y]) q.push(y);
} if(col[x]==2) res.pb(x);
} printf("%d\n",res.size());
for(int x:res) printf("%d ",x);
printf("\n");
}
int main(){
int qu;scanf("%d",&qu);
while(qu--) solve();
return 0;
}
Codeforces 1368E - Ski Accidents(构造+思维)的更多相关文章
- Codeforces 755E:PolandBall and White-Red graph(构造+思维)
http://codeforces.com/contest/755/problem/E 题意:给出n个点和一个距离d,让你在这个n个点的图里面构造一个子图,使得这个子图的直径和补图的直径的较小值为d, ...
- codeforces 454 E. Little Pony and Summer Sun Celebration(构造+思维)
题目链接:http://codeforces.com/contest/454/problem/E 题意:给出n个点和m条边,要求每一个点要走指定的奇数次或者是偶数次. 构造出一种走法. 题解:可能一开 ...
- Codeforces 989 P循环节01构造 ABCD连通块构造 思维对云遮月参考系坐标轴转换
A 直接判存不存在连续的三个包含A,B,C就行 /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a ...
- Educational Codeforces Round 53C(二分,思维|构造)
#include<bits/stdc++.h>using namespace std;const int N=1e6+6;int x[N],y[N];int sx,sy,n;char s[ ...
- Codeforces 232A - Cycles (构造 + 思维)
题目链接: 232A - Cycles(点击打开) 题意: 要构成一个存在 \(k\) 个三元环的图,需要多少个点,输出顶点数 \(n\),并输出图. 题解: 题目中的任何图都可以用 \(90\)~ ...
- Codeforces Gym101503E:XOR-omania(构造+思维)
题目链接 题意 给出m个数b,这些数是由n个数a两两异或组成的,问初始的那n个数分别是多少. 思路 存在多组解的情况...原来是个构造题. 考虑这样一种情况:b1 = a1 ^ a2,b2 = a2 ...
- codeforces 389 D. Fox and Minimal path(构造+思维)
题目链接:https://vjudge.net/contest/175446#problem/J 题解:显然要用最多n个点构成的图要使的得到的最短路条数有1e9次个,显然要有几个数相乘容易想到2的几进 ...
- CF1103C Johnny Solving (Codeforces Round #534 (Div. 1)) 思维+构造
题目传送门 https://codeforces.com/contest/1103/problem/C 题解 这个题还算一个有难度的不错的题目吧. 题目给出了两种回答方式: 找出一条长度 \(\geq ...
- Codeforces Global Round 8 E. Ski Accidents(拓扑排序)
题目链接:https://codeforces.com/contest/1368/problem/E 题意 给出一个 $n$ 点 $m$ 边的有向图,每条边由编号较小的点通向编号较大的点,每个点的出度 ...
随机推荐
- 【UE4 C++】定时器 Timer 与事件绑定
概念 定时执行操作,可执行一次,或循环执行直到手动终止 定时器在全局定时器管理器(FTimerManager 类型)中管理.全局定时器管理器存在于 游戏实例 对象上以及每个 场景 中 定时器需要绑定委 ...
- 短短 29 天,应对高峰 100W+ 访问,看浙大如何交出满分答卷
疫情期间"停课不停教,停课不停学",线上开课第一天,浙江大学网上开课平台访问量即突破100 万次,访客数3万余人,最高峰达 1.1万人同时在线,发起课程直播2000余场,然而系统却 ...
- 2021.8.3考试总结[NOIP模拟29]
T1 最长不下降子序列 数据范围$1e18$很不妙,但模数$d$只有$150$,考虑从这里突破. 计算的式子是个二次函数,结果只与上一个值有关,而模$d$情况下值最多只有$150$个,就证明序列会出现 ...
- 计算机网络之网络层IP组播(IGMP、组播路由选择协议、组播地址)
文章转自:https://blog.csdn.net/weixin_43914604/article/details/105318560 学习课程:<2019王道考研计算机网络> 学习目的 ...
- 常用Java API:HashMap 和 TreeMap
摘要 本文主要介绍Map接口下的HashMap和TreeMap. HashMap HashMap是基于哈希表的 Map 接口的实现,是无序的 clear()//清空. containsKey(Obje ...
- 贪心-Saruman‘s Army POJ - 3069
万恶之源 目录 题意 思路 贪心的原则是什么呢? 错解 正解 代码实现 书上的代码 我的代码 比较一下 问题 题意 给定若干个点的坐标,与范围R.每个点可以选择是否标记,标记后这个点的左右范围R内的所 ...
- jQuery常用验证
1.文本框不能为为空 if ($("#RushStartTime").val() == "") { alert("请输入该产品.."); $ ...
- PCIE基本知识
转载:https://zhuanlan.zhihu.com/p/139656925 前言 之前主要都在做FPGA算法层面的东西,最近觉得对于接口方面的知识比较欠缺,打算以PCI-E为例来系统的学习一下 ...
- usb设备无法识别
之前用飞线用旧板子飞线连接了一个wifi模块到usb0口上,调试ok的,现在新设计的板子回来了,wifi模块是连接在usb2口上的,系统起来后发现wlan0不存在,用lsusb查看wifi模块的usb ...
- (二)lamp环境搭建之编译安装mysql
mysql 编译安装1,在网站上下载: wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.15.tar.gz 2,安装cmake ...