正题

题目链接:https://codeforces.com/gym/103049/problem/J


题目大意

\(n\)个点\(m\)条边的一张无向图,选出一条路径后去掉路径上的点,然后将剩下的点分成点数相等的两份使得两份之间没有边连接。

\(1\leq n,m\leq 2\times 10^5\)


解题思路

先跑出\(dfs\)树,这样就保证了所有的非树边都是返祖边。

发现如果我们选出树上一条根节点出发的路径那么其他子树之间一定是不连通的(因为要么子树之间有环,要么往上的环被删除)。

所以问题就变成了选出一条从根出发的路径然后把其他的分成大小相等的两份。

考虑贪心解决,我们走到一个点时可以把儿子的子树大小从小到大排列,然后两边那边不够就加给哪边,加剩最大的一个再继续往下分。

因为这样分的差一定不大于最大的那个,所以肯定是对的。


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=2e5+10;
int n,m,siz[N],mark[N];
vector<int> G[N],T[N],p;
void dfs(int x,int fa){
siz[x]=1;
for(int i=0;i<G[x].size();i++){
int y=G[x][i];
if(y==fa||siz[y])continue;
T[x].push_back(y);
dfs(y,x);siz[x]+=siz[y];
}
return;
}
bool cmp(int x,int y)
{return siz[x]>siz[y];}
void calc(int x,int fa,int a,int b){
sort(T[x].begin(),T[x].end(),cmp);
p.push_back(x);int lr=0;
for(int i=0;i<T[x].size();i++){
int y=T[x][i];
if(y==fa)continue;
if(!lr)lr=y;
else if(a<=b)a+=siz[y],mark[y]=1;
else b+=siz[y],mark[y]=2;
}
if(a<=b&&a+siz[lr]==b){mark[lr]=1;return;}
if(a>=b&&b+siz[lr]==a){mark[lr]=2;return;}
calc(lr,x,a,b);return;
}
void print(int x,int fa,int z){
if(!mark[x])mark[x]=mark[fa];
for(int i=0;i<T[x].size();i++)
if(T[x][i]!=fa)print(T[x][i],x,z);
if(mark[x]==z)printf("%d ",x);
return;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
}
dfs(1,0);
calc(1,1,0,0);int w=(n-p.size())/2;
printf("%d %d\n",p.size(),w);
for(int i=0;i<p.size();i++)
printf("%d ",p[i]);
mark[0]=0;
putchar('\n');
print(1,0,1);
putchar('\n');
print(1,0,2);
return 0;
}

NWERC2020J-Joint Excavation【构造,贪心】的更多相关文章

  1. LA 6979 Known Notation 构造+贪心 铜牌题

    题意:给出一个字符串,有两种操作: 1.插入一个数字  2.交换两个字符   问最少多少步可以把该字符串变为一个后缀表达式(操作符只有*) #include <cstdio> #inclu ...

  2. Codeforces 985 最短水桶分配 沙堆构造 贪心单调对列

    A B /* Huyyt */ #include <bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define mkp(a, ...

  3. 2020牛客暑期多校训练营 第二场 C Cover the Tree 构造 贪心

    LINK:Cover the Tree 最受挫的是这道题,以为很简单 当时什么都想不清楚. 先胡了一个树的直径乱搞的贪心 一直过不去.后来意识到这类似于最经典长链剖分优化贪心的做法 然后那个是求最大值 ...

  4. EC R 86 D Multiple Testcases 构造 贪心 二分

    LINK:Multiple Testcases 得到很多种做法.其中O(n)的做法值得一提. 容易想到二分答案 check的时候发现不太清楚分配的策略. 需要先考虑如何分配 容易发现大的东西会对小的产 ...

  5. Codeforces Round #650 (Div. 3) D. Task On The Board (构造,贪心)

    题意:有一个字符串和一组数,可以对字符串删去任意字符后为数组的长度,且可以随意排序,要求修改后的字符串的每个位置上的字符满足:其余大于它的字符的位置减去当前位置绝对值之和等于对应序列位置上的数. 题解 ...

  6. CF733C Epidemic in Monstropolis[模拟 构造 贪心]

    C. Epidemic in Monstropolis time limit per test 1 second memory limit per test 256 megabytes input s ...

  7. BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)

    题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...

  8. BZOJ.4319.[cerc2008]Suffix reconstruction(后缀数组 构造 贪心)

    题目链接 \(Description\) 给定SA数组,求满足SA[]的一个原字符串(每个字符为小写字母),无解输出-1. \(Solution\) 假设我们现在有suf(SA[j]),要构造suf( ...

  9. Codeforces Round #301 (Div. 2) B. School Marks 构造/贪心

    B. School Marks Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/540/probl ...

随机推荐

  1. zabbix监控rabbitmq队列消费状态

    使用rabbitmqctl 管理 mq -n 指定节点 [root@logging-master zabbix]# rabbitmqctl -n rabbit@localhost list_queue ...

  2. 从零开始实现简单 RPC 框架 5:网络通信之序列化

    我们在接下来会开始讲网络通信相关的内容了.既然是网络通信,那必然会涉及到序列化的相关技术. 下面是 ccx-rpc 序列化器的接口定义. /** * 序列化器 */ public interface ...

  3. C# 异步锁 await async锁,lock,Monitor,SemaphoreSlim

    异步方法内无法使用Monitor 和lock 所以只能用System.Threading.SemaphoreSlim了 //Semaphore (int initialCount, int maxim ...

  4. WPF---依赖属性(二)

    一.概要 我们将会通过一个简单的综合例子来阐述下依赖属性的变化. 场景:我们在一个文本框中输入一个数字,然后对应的panel中会出现对应的椭圆,椭圆的个数与输入的文本相同. 我们在MainWindow ...

  5. JAVA中多态与C++多态的区别

    原文出自:http://blog.csdn.net/hihui/article/details/8604779 #include <stdio.h> class Base { public ...

  6. ES读写数据的工作原理

    es写入数据的工作原理是什么啊?es查询数据的工作原理是什么?底层的lucence介绍一下呗?倒排索引了解吗? 一.es写数据过程 1.客户端选择一个node发送请求过去,这个node就是coordi ...

  7. lsyncd替代inotify+rsync实现实时同步

    因公司业务需要需要实时同步日志文件,刚一开始使用的是inotify+rsync来实现实时同步,但时间久而久之发现同步的速度越来越慢,往往延迟好几个小时.查了一下网上的inotify+rsync方案基本 ...

  8. spring boot 系列之七:SpringBoot整合Mybatis

    springboot已经很流行,但是它仍需要搭配一款ORM框架来实现数据的CRUD,之前已经分享过JdbcTemplete和JPA的整合,本次分享下Mybatis的整合. 对于mybatis的使用,需 ...

  9. 【数据库上】 第四讲 E-R模型基础知识

    第四讲 E-R模型基础知识 一.数据库设计过程 数据库设计的关键阶段? 各个阶段设计的主要任务? 基础条件:清楚一个应用系统的功能需求与数据需求(直接与用户交互.数据流程图示例/UML类图等) 核心阶 ...

  10. javascript对象——基本对象

    1.array对象 2.Boolean包装类对象和Date对象   3.Math对象 1到100随机数 4.RegExp对象 4.1 正则规则 如: 4.2 两种创建正则对象方式 /正则表达式/    ...