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$ 边的有向图,每条边由编号较小的点通向编号较大的点,每个点的出度 ...
随机推荐
- logging的基本使用
logging模块打印log的时候主要有一下几个,级别顺序:CRITICAL>ERROR>WARNING>INFO>DEBUG: 1.日志输出到file: import log ...
- 【MySQL】MySQL(四)存储引擎、索引、锁、集群
MySQL存储引擎 MySQL体系结构 体系结构的概念 任何一套系统当中,每个部件都能起到一定的作用! MySQL的体系结构 体系结构详解 客户端连接 支持接口:支持的客户端连接,例如C.Java.P ...
- 【Spring】IoC容器 - 依赖查找
前言 上一篇文章已经学习了[IoC的主要实现策略]有2种: 1.依赖查找 2.依赖注入 这里稍加详细的介绍一下依赖查找 1.依赖查找的方式 依赖查找的方式可以以多种维度来划分: 1.按名称/类型/注解 ...
- [对对子队]会议记录4.20(Scrum Meeting11)
今天已完成的工作 何瑞 工作内容:搭建第三关,添加了运行指令标识 相关issue:搭建关卡2.3 相关签入:4.20签入1 4.20签入2 吴昭邦 工作内容:搭建第三关 相关iss ...
- springboot整合rabbitmq实现生产者消息确认、死信交换器、未路由到队列的消息
在上篇文章 springboot 整合 rabbitmq 中,我们实现了springboot 和rabbitmq的简单整合,这篇文章主要是对上篇文章功能的增强,主要完成如下功能. 需求: 生产者在启 ...
- 2021.9.21考试总结[NOIP模拟58]
T1 lesson5! 开始以为是个无向图,直接不懂,跳去T2了. 之后有看了一眼发现可暴力,于是有了\(80pts\). 发现这个图是有拓扑序的,于是可以用拓扑排序找最长路径.先找原图内在最长路径上 ...
- 热身训练2 GCD
题目描述 简要题意: n个数字,a1,a2,...,an m次询问(l,r),每次询问需回答 1.gcd(al,al+1,al+2,...,ar);2.gcd(ax,ax+1,ax+2,...,ay ...
- pascals-triangle leetcode C++
Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, Retu ...
- 恶意代码分析实战四:IDA Pro神器的使用
目录 恶意代码分析实战四:IDA Pro神器的使用 实验: 题目1:利用IDA Pro分析dll的入口点并显示地址 空格切换文本视图: 带地址显示图形界面 题目2:IDA Pro导入表窗口 题目3:交 ...
- k8s入坑之路(10)kubernetes coredns详解
概述 作为服务发现机制的基本功能,在集群内需要能够通过服务名对服务进行访问,那么就需要一个集群范围内的DNS服务来完成从服务名到ClusterIP的解析. DNS服务在kubernetes中经历了三个 ...