CF1019C Sergey's problem

很巧妙的构造题。

思路

首先我们可以把这题分成两个部分:

  • 解决覆盖问题
  • 解决边冲突问题

\(vis_i\) 为 \(i\) 点是否被覆盖的标记,\(cis_i\) 为 \(i\) 点是否被选的标记。

part1 覆盖问题

从小到大枚举 \(i\),对于点 \(i\) 如果它没被覆盖,那么我们把点 \(i\) 标为被覆盖并且使这个点被选中,存在有向边 \(i->j\) 的 \(j\) 标为被覆盖。

part2 冲突问题

从大到小枚举 \(i\),对于点 \(i\) 如果它被选中,那么我们把这个点 \(i\) 存在有向边 \(i->j\) 的点 \(j\) 的选中标记去掉。

这样的答案就是一组合法答案。

证明:

第一个部分,满足了被选中点存在边冲突当且仅当 \(u>v\) 且存在边 \(u->v\) 不存在边 \(v->u\)。

第二个部分,证明:一个点进行了二部分的操作后一定会被留下。

设点 \(u\) 进行完二部分操作后被删除,不妨设删除 \(u\) 的点为 \(v\),那么肯定有 \(u>v\) 且存在边 \(v->u\),与第一部分保证的情况产生冲突,故得证。

\(u\) 删除产生冲突的点后,对于产生冲突的点所覆盖的点,\(u\) 一定可以覆盖到(覆盖距离是 \(2\))。

易得经过一部分后所有的点都已处于被覆盖或被选中的状态,所有经过操作二后,所有的点亦处于被选中或被覆盖的状态。

得证。

CODE

#include<bits/stdc++.h>
using namespace std; const int maxn=1e6+5; struct Edge
{
int tot;
int head[maxn];
struct edgenode{int to,nxt;}edge[maxn*2];
inline void add(int x,int y)
{
tot++;
edge[tot].to=y;
edge[tot].nxt=head[x];
head[x]=tot;
}
}G; int n,m,tot; bool vis[maxn],cis[maxn]; inline void solve1(int u)
{
vis[u]=true;cis[u]=true;
for(int i=G.head[u];i;i=G.edge[i].nxt)
{
int v=G.edge[i].to;
vis[v]=true;
}
}
inline void solve2(int u)
{
for(int i=G.head[u];i;i=G.edge[i].nxt)
{
int v=G.edge[i].to;
cis[v]=false;
}
} int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
G.add(x,y);
}
for(int i=1;i<=n;i++) if(!vis[i]) solve1(i);
for(int i=n;i;i--) if(cis[i]) solve2(i);
for(int i=1;i<=n;i++) if(cis[i]) tot++;
printf("%d\n",tot);
for(int i=1;i<=n;i++) if(cis[i]) printf("%d ",i);
}

CF1019C Sergey's problem的更多相关文章

  1. [CF1019C]Sergey's problem[构造]

    题意 找出一个集合 \(Q\),使得其中的点两两之间没有连边,且集合中的点可以走不超过两步到达其他所有不在集合中的点.输出任意一组解. \(n\leq 10^6\) 分析 考虑构造,先从 \(1\) ...

  2. CF1019C Sergey's problem (图上构造)

    题目大意:给你一个有向连通图,让你找出一个点集,保证点集内的点之间没有直接连边,且集合中存在一点,到一个 非点集中的点的距离小于等于2 思路很清奇 首先编号从小到大遍历每个点,如果这个点没有被访问过, ...

  3. Codeforces Round #503 (by SIS, Div. 2) E. Sergey's problem

    E. Sergey's problem [题目描述] 给出一个n个点m条边的有向图,需要找到一个集合使得1.集合中的各点之间无无边相连2.集合外的点到集合内的点的最小距离小于等于2. [算法] 官方题 ...

  4. Codeforces 1019C Sergey's problem 构造

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF1019C.html 题目传送门 - CF1019C 题意 给定一个有 $n$ 个节点 . $m$ 条边的有向 ...

  5. 【CF1020E】Sergey's problem(构造)

    题意: 思路:这是一道论文题 https://link.springer.com/content/pdf/10.1007/BFb0066192.pdf From http://www.cnblogs. ...

  6. 1019C Sergey's problem(思维)

    题意: 找出来一个点集S  使得S中的点不能互相通过一步到达 并且S中的点 可以在小于等于2的步数下到达所有的点 要父结点 不要子结点 这样就求出来一个点集S‘  而S'中可能存在 v -> u ...

  7. Sergey's problem CodeForces - 1019C (图论,构造,神题)

    链接 大意: 给定有向图, 求选择一个点集$S$, 使得$S$任意两点不相连, 且对于不属于$S$的任意点$x$, 均存在$S$中的点$y$, 使得$d(x,y)<=2$, $d(x,y)$为从 ...

  8. 【Cf #503 C】Sergey's problem(有趣的构造)

    感觉这种构造题好妙啊,可我就是想不到诶. 给出一张无自环的有向图,回答一个独立集,使得图中任意一点都可以被独立集中的某一点两步之内走到. 具体构造方案如下: 下标从小到大枚举点,如果该点没有任何标记, ...

  9. 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 ...

  10. Codeforces Round #503 Div. 2

    时间相对来说还是比较合适的,正好放假就可以打一打啦. A. New Building for SIS:http://codeforces.com/contest/1020/problem/A 题意概述 ...

随机推荐

  1. TwinCAT3 - 实现自己的Dictionary

    目录 1,前言 2,C#的字典 3,TwinCAT3的字典 定义功能块 添加方法 4,用起来 1,前言 C#有字典,TwinCAT没字典,咋办,自己写一个咯 2,C#的字典 C#的字典使用很简单,下面 ...

  2. 【转】 Vue中import from的来源:省略后缀与加载文件夹

    原文地址 Vue中import from的来源:省略后缀与加载文件夹_超频化石鱼的博客-CSDN博客 ,原文地址排版格式可能更好,建议看原文,本文只是为了转载记录 Vue使用import ... fr ...

  3. 单 log 实现 区间加减,查询区间 gcd

    主要是查询,要将 log 个区间拿出来依次求 gcd,当然如果是 O(1) gcd 的话可以直接求就是了.

  4. ARC119F 题解

    前言 ARC119F 好厉害,是没见过的自动机 DP. 正文 [1] 分析 主要分析一下为什么这么写. [2] 状态设计 [3] 自动机状态转移 感觉状态设计中最难的就是如何处理带 \(O\) 的. ...

  5. pgsql 查询及更新json字段的某个属性

    pgsql 查询及更新json字段的某个属性 一.查询json字段中的某个属性 查询 t_user 表中json 字段 info 中的 name 属性 select info ->> 'n ...

  6. vue中如何使用JSX?

    JSX是什么? JSX 是一种 Javascript 的语法扩展,JSX = Javascript + XML,即在 Javascript 里面写 XML,因为 JSX 的这个特性,所以他即具备了 J ...

  7. 支付宝携手HarmonyOS SDK打造高效便捷的扫码支付体验

    背景 在日常的购物转账.生活缴费等在线支付中,用户在正式拉起支付界面前,均需要至少经历一次"识别"+两次"寻找",即识别归属应用.寻找应用.寻找扫码入口,才能完 ...

  8. Asp.net core 学习笔记 ( 小东西 )

    简单的为 url 添加 query var parametersToAdd = new System.Collections.Generic.Dictionary<string, string& ...

  9. 多表查询 —— 内连接&外连接&子查询

    连接查询 内连接 1.查询语法 -- 隐式内连接 select 字段列表 from 表1, 表2... where 条件; -- 显式内连接 select 字段列表 from 表1 [INNER] j ...

  10. BFS 马的遍历————洛谷p1443

    马的遍历 题目描述 有一个 \(n \times m\) 的棋盘,在某个点 \((x, y)\) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步. 输入格式 输入只有一行四个整数,分别为 ...