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$ 边的有向图,每条边由编号较小的点通向编号较大的点,每个点的出度 ...
随机推荐
- 在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务
在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务 https://procodeguide.com/programming/polly-in-aspnet-core ...
- Java:并发笔记-02
Java:并发笔记-02 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 3. 共享模型之管程-1 本章内容-1 共享问题 synchronized 线程安全分 ...
- Java:泛型小记
Java:泛型小记 对 Java 中的 泛型类,做一个微不足道的小小小小记 泛型实现 概述 开篇: List<String> l1 = new ArrayList<String> ...
- spring cloud feign的基本使用
在上一节,我们学会了如何使用ribbon进行来进行服务之间的调用,但是那种需要通过RestTemplate来进行调用而且当参数比较多时,使用起来就比较麻烦.那么有没有一种调用远程方法(别的服务)就像调 ...
- PCIE学习链接集合
<PCIE基础知识+vivado IP core设置> https://blog.csdn.net/eagle217/article/details/81736822 <一步一步开始 ...
- shell 脚本控制命令的执行顺序
&&,||,(),{},& 五个符号的运用shell脚本执行命令的时候,有时候会依赖于前一个命令是否执行成功.而&&和||就是用来判断前一个命令执行效果的. 也 ...
- Go websocket EOF bug
背景 使用的 golang.org/x/net/websocket 包,前端一发来消息就报错 if err = websocket.Message.Receive(ws, &msg); err ...
- APP 自动化之系统按键事件(五)
转载记录方便后续自己使用: 代码就一句driver.keyevent()括号内填入的是物理按键的数字代号 代号表: 电话键 KEYCODE_CALL 拨号键 5 KEYCODE_ENDCALL 挂机键 ...
- C++ 内存四区 理解总结
内存模型图(4G) 整体简单说明 32位CPU可寻址4G线性空间,每个进程都有各自独立的4G逻辑地址,其中 03G是用户空间**,**34G是内核空间即3G用户空间和1G内核空间,不同进程相同的逻辑地 ...
- Linux常用命令和快捷键整理:(2)常用快捷键
前言: Linux常用快捷键和基本命令整理,先上思维导图: linux常用命令请见:https://www.cnblogs.com/yinzuopu/p/15516499.html 基本快捷键的使用 ...