Codeforces Round #503 (by SIS, Div. 2) E. Sergey's problem
E. Sergey's problem
【题目描述】
给出一个n个点m条边的有向图,需要找到一个集合使得1、集合中的各点之间无无边相连2、集合外的点到集合内的点的最小距离小于等于2。
【算法】
官方题解证明的很强。对任意一个点 a(未访问过)删去其所有子节点,若剩余点组成的新图的答案集合不存在到 a 的边,则将 a 加入答案集合中;否则 删去a。一遍正向对 1~n 的每一个点遍历,保留父节点打上标记 -1,子节点打上标记 1。下一步就是删去不满足条件的点,对任意一个标有 -1 的点 i,首先应该找到剩余点的答案集合(即从 i+1 到 n 的所有满足条件的点),于是我们可以考虑从 n ~ 1 逆向遍历,这样即可满足条件。
给出一个反例(不太会用graphviz,逃。。。。):

如果正向删的话,只留下了e点显然gg。
【代码】
#include <bits/stdc++.h>
#define N 1000100
using namespace std;
int n,m,a,b,ans;
int v[N];
vector<int> head[N];
inline int read() {
int x=0,f=1; char c=getchar();
while(c<'0'||c>'9') { if(c=='-') f=-1; c=getchar(); }
while(c>='0'&&c<='9') { x=x*10+c-'0'; c=getchar(); }
return x*f;
}
int main() {
n=read(),m=read();
for(int i=1;i<=m;i++) a=read(),b=read(),head[a].push_back(b);
for(int i=1;i<=n;i++) {
if(v[i]) continue;
int sz=head[i].size();
v[i]=-1;
for(int j=0;j<sz;j++) {
if(v[head[i][j]]) continue;
v[head[i][j]]=1;
}
}
for(int i=n;i>=1;i--) {
if(v[i]==1) continue;
ans++;
int sz=head[i].size();
for(int j=0;j<sz;j++)
v[head[i][j]]=1;
}
cout<<ans<<endl;
for(int i=1;i<=n;i++)
if(v[i]==-1) cout<<i<<" ";
return 0;
}
Codeforces Round #503 (by SIS, Div. 2) E. Sergey's problem的更多相关文章
- Codeforces Round #503 (by SIS, Div. 2) Solution
从这里开始 题目列表 瞎扯 Problem A New Building for SIS Problem B Badge Problem C Elections Problem D The hat P ...
- Codeforces Round #503 (by SIS, Div. 2)
连接:http://codeforces.com/contest/1020 C.Elections 题型:你们说水题就水题吧...我没有做出来...get到了新的思路,不虚.好像还有用三分做的? KN ...
- Codeforces Round #503 (by SIS, Div. 2) C. Elections (暴力+贪心)
[题目描述] Elections are coming. You know the number of voters and the number of parties — n and m respe ...
- Codeforces Round #503 (by SIS, Div. 2)-C. Elections
枚举每个获胜的可能的票数+按照花费排序 #include<iostream> #include<stdio.h> #include<string.h> #inclu ...
- Codeforces Round #503 (by SIS, Div. 1)E. Raining season
题意:给一棵树每条边有a,b两个值,给你一个m,表示从0到m-1,假设当前为i,那么每条边的权值是a*i+b,求该树任意两点的最大权值 题解:首先我们需要维护出(a,b)的凸壳,对于每个i在上面三分即 ...
- Codeforces Round #503 (by SIS, Div. 2) D. The hat
有图可以直观发现,如果一开始的pair(1,1+n/2)和pair(x, x+n/2)大小关系不同 那么中间必然存在一个答案 简单总结就是大小关系不同,中间就有答案 所以就可以使用二分 #includ ...
- Codeforces Round #503 (by SIS, Div. 2)B 1020B Badge (拓扑)
题目大意:每个同学可以指定一个人,然后构成一个有向图.1-n次查询,从某个人开始并放入一个东西,然后循环,直到碰到一个人已经放过了,就输出. 思路:直接模拟就可以了,O(n^2) 但是O(n)也可以实 ...
- Codeforces Round #503 (by SIS, Div. 2) C. Elections(枚举,暴力)
原文地址 C. Elections time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- Codeforces Round #503 (by SIS, Div. 2) D. The hat -交互题,二分
cf1020D 题意: 交互题目,在有限的询问中找到一个x,使得数列中的第x位和第(x+n/2)位的值大小相同.数列保证相邻的两个差值为1或-1: 思路: 构造函数f(x) = a[x] - a[x ...
随机推荐
- 【BZOJ1066】 [SCOI2007]蜥蜴
Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平 ...
- WTL拖拽文件
1.对话框属性中把:Accept Files设置为TRUE,或者ModifyStyleEx(0, WS_EX_ACCEPTFILES); 2.在对话框中添加一个ListBox控件,并关联成员变量:m_ ...
- scrapy项目4:爬取当当网中机器学习的数据及价格(CrawlSpider类)
scrapy项目3中已经对网页规律作出解析,这里用crawlspider类对其内容进行爬取: 项目结构与项目3中相同如下图,唯一不同的为book.py文件 crawlspider类的爬虫文件book的 ...
- AIDL在android系统中的作用
AIDL,Android Interface definition language的缩写,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口.最近看了下AIDL在A ...
- vscode-php代码提升及函数跳转
安装插件,php intellisense 安装后还要配置一下PHP的运行路径 打开扩展 输入 PHP IntelliSense 安装 文件 - 首选项 - 设置 - 扩展 - ...
- HTTP访问控制(CORS)踩坑小记
前几天在帮后端排查一个cors的问题的时候发现的一些小坑特此记录 ** cors的本质是出于安全原因,浏览器限制从脚本内发起的跨源HTTP请求. 例如,XMLHttpRequest和FetchAPI遵 ...
- flask中request对象获取参数的方法
从当前request获取内容: method: 起始行,元数据 host: 起始行,元数据 path: 起始行,元数据 environ: 其中的 SERVER_PROTOCOL 是起始行,元数据 he ...
- jQuery-validate插件初级篇
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- SpringMVC拦截器+Spring自定义注解实现权限验证
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- 一、基础篇--1.1Java基础-String、StringBuilder、StringBuffer
String.StringBuilder.StringBuffer 主要区别在两点上: 速度效率上对比:StringBuilder>StringBuffer>String 线程安全上来说: ...