Codeforces 题面传送门 & 洛谷题面传送门

神仙构造题(不过可能我构造太烂了?)

首先考虑这个奇奇怪怪的 \(\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(构造+思维)的更多相关文章

  1. Codeforces 755E:PolandBall and White-Red graph(构造+思维)

    http://codeforces.com/contest/755/problem/E 题意:给出n个点和一个距离d,让你在这个n个点的图里面构造一个子图,使得这个子图的直径和补图的直径的较小值为d, ...

  2. codeforces 454 E. Little Pony and Summer Sun Celebration(构造+思维)

    题目链接:http://codeforces.com/contest/454/problem/E 题意:给出n个点和m条边,要求每一个点要走指定的奇数次或者是偶数次. 构造出一种走法. 题解:可能一开 ...

  3. Codeforces 989 P循环节01构造 ABCD连通块构造 思维对云遮月参考系坐标轴转换

    A 直接判存不存在连续的三个包含A,B,C就行 /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a ...

  4. 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[ ...

  5. Codeforces 232A - Cycles (构造 + 思维)

    题目链接: 232A - Cycles(点击打开) 题意: 要构成一个存在 \(k\) 个三元环的图,需要多少个点,输出顶点数 \(n\),并输出图. 题解: 题目中的任何图都可以用 \(90\)~ ...

  6. Codeforces Gym101503E:XOR-omania(构造+思维)

    题目链接 题意 给出m个数b,这些数是由n个数a两两异或组成的,问初始的那n个数分别是多少. 思路 存在多组解的情况...原来是个构造题. 考虑这样一种情况:b1 = a1 ^ a2,b2 = a2 ...

  7. codeforces 389 D. Fox and Minimal path(构造+思维)

    题目链接:https://vjudge.net/contest/175446#problem/J 题解:显然要用最多n个点构成的图要使的得到的最短路条数有1e9次个,显然要有几个数相乘容易想到2的几进 ...

  8. CF1103C Johnny Solving (Codeforces Round #534 (Div. 1)) 思维+构造

    题目传送门 https://codeforces.com/contest/1103/problem/C 题解 这个题还算一个有难度的不错的题目吧. 题目给出了两种回答方式: 找出一条长度 \(\geq ...

  9. Codeforces Global Round 8 E. Ski Accidents(拓扑排序)

    题目链接:https://codeforces.com/contest/1368/problem/E 题意 给出一个 $n$ 点 $m$ 边的有向图,每条边由编号较小的点通向编号较大的点,每个点的出度 ...

随机推荐

  1. kafka生产者和消费者api的简单使用

    kafka生产者和消费者api的简单使用 一.背景 二.需要实现的功能 1.生产者实现功能 1.KafkaProducer线程安全的,可以在多线程中使用. 2.消息发送的key和value的序列化 3 ...

  2. [CSP-S 2021] 回文

    题目描述: 给定正整数 n 和整数序列 a1, a2,-,a2n,在这 2n 个数中,1, 2,-,n 分别各出现恰好 2 次.现在进行 2n 次操作,目标是创建一个长度同样为 2n 的序列 b 1, ...

  3. Spring源码解读(二):Spring AOP

    一.AOP介绍 面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP).OOP中模块化的关键单元是类,而在AOP中,模块化单元是方面.方面实现了诸如跨越多种类型和对象的事务 ...

  4. 超级好用的轻量级JSON处理命令jq

    1 简介 jq是一个轻量级的命令行工具,让你可以非常方便地处理JSON数据,如切分.过滤.映射.转化等,就像sed.awk.grep文本处理三剑客一样.jq是用C写的,没有运行时依赖,你可以直接下载可 ...

  5. P2472 [SCOI2007]蜥蜴(最大流)

    P2472 [SCOI2007]蜥蜴 自己第一道独立做题且一遍AC的网络流题纪念... 看到这道题我就想到网络流建图的方式了... 首先根据每个高度,我们将每个点拆成两个点限流.之后根据跳的最大距离, ...

  6. hdu 1709 The Balance(母函数)

    题意: 有一个天平.有N个砝码.重量分别是A1...AN. 问重量[1..S]中有多少种重量是无法利用这个天平和这些砝码称出来的. S是N个砝码的重量总和. 思路: 对于每一个砝码来说,有三种:不放, ...

  7. 近期业务大量突增微服务性能优化总结-4.增加对于同步微服务的 HTTP 请求等待队列的监控

    最近,业务增长的很迅猛,对于我们后台这块也是一个不小的挑战,这次遇到的核心业务接口的性能瓶颈,并不是单独的一个问题导致的,而是几个问题揉在一起:我们解决一个之后,发上线,之后发现还有另一个的性能瓶颈问 ...

  8. Downward API —— 在容器内部获取 Pod 信息

    我们知道,每个 Pod 在被超过创建出来之后,都会被系统分配唯一的名字.IP地址,并且处于某个 Namespace 中,那么我们如何在 Pod 的容器内获取 Pod 的这些重要信息呢? 答案就是使用 ...

  9. 【完美解决】IDEA 中 Maven 报错 Cannot resolve xxx 和 Maven 中 Dependencies 报红/报错。

    目录 前提 场景 解决办法 1.首先,清除缓存,点击之后重启IDEA. 2.关闭IDEA,打开项目文件夹 3.重新打开 IDEA,找到右边的 Maven 4.解决 Maven 中 Dependenci ...

  10. C++11 多线程同步 互斥锁 条件变量

    在多线程程序中,线程同步(多个线程访问一个资源保证顺序)是一个非常重要的问题,Linux下常见的线程同步的方法有下面几种: 互斥锁 条件变量 信号量 这篇博客只介绍互斥量和条件变量的使用. 互斥锁和条 ...