2021.11.14 CF1583E Moment of Bloom(LCA+图上构造)
2021.11.14 CF1583E Moment of Bloom(LCA+图上构造)
https://www.luogu.com.cn/problem/CF1583E
题意:
She does her utmost to flawlessly carry out a person's last rites and preserve the world's balance of yin and yang.
Hu Tao, being the little prankster she is, has tried to scare you with this graph problem! You are given a connected undirected graph of n nodes with m edges. You also have q queries. Each query consists of two nodes a and b .
Initially, all edges in the graph have a weight of 00 . For each query, you must choose a simple path starting from a and ending at b . Then you add 1 to every edge along this path. Determine if it's possible, after processing all qq queries, for all edges in this graph to have an even weight. If so, output the choice of paths for each query.
If it is not possible, determine the smallest number of extra queries you could add to make it possible. It can be shown that this number will not exceed \(10^{18}\) under the given constraints.
A simple path is defined as any path that does not visit a node more than once.
An edge is said to have an even weight if its value is divisible by 2 .
分析:
https://www.luogu.com.cn/blog/dream-of-Au/solution-cf1583e
如果一条边的边权是偶数,那么这条边的边权对两端端点点权的贡献也是偶数。如果这条边的边权是奇数,那么这条边的边权对两端端点的点权的贡献也是奇数。一条路径两个端点的点权每增加1,它对路径上其他端点点权的贡献为2,毕竟一个端点连着两条边。图上最终每出现两个点权为奇数的点,想要把点权变为偶数,只需要增加1条边。根据题上要求,奇数点的个数一定为偶数。
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int N=3e5+10;
int n,m,q,fa[N][20],cnt,head[N],dep[N],val[N],belong[N],stacki[N];
struct node{
int to,next;
}a[N];
struct queryi{
int x,y;
}query[N];
struct mapii{
int u,v;
}mapi[N];
inline void add(int u,int v){
++cnt;
a[cnt].to=v;
a[cnt].next=head[u];
head[u]=cnt;
}
inline void dfs(int x,int fai){
dep[x]=dep[fai]+1;
fa[x][0]=fai;
for(int i=head[x];i;i=a[i].next){
int v=a[i].to;
if(dep[v])continue;
dfs(v,x);
}
}
inline int lca(int x,int y){
if(dep[x]<dep[y])swap(x,y);
for(int i=19;i>=0;i--)if(fa[x][i]&&dep[fa[x][i]]>=dep[y])x=fa[x][i];
if(x==y)return x;
for(int i=19;i>=0;i--)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
return fa[x][0];
}
inline int find(int x){
return belong[x]==x?x:belong[x]=find(belong[x]);
}
inline void print(int x,int y,int lcai){
int now=x;
while(now!=lcai)cout<<now<<" ",now=fa[now][0];
cout<<lcai<<" ";
now=y;
int top=0;
while(now!=lcai)stacki[++top]=now,now=fa[now][0];
for(int i=top;i>=1;i--)cout<<stacki[i]<<" ";cout<<endl;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++)cin>>mapi[i].u>>mapi[i].v;
cin>>q;
for(int i=1;i<=q;i++){
cin>>query[i].x>>query[i].y;
++val[query[i].x];++val[query[i].y];
}
int ans=0;
for(int i=1;i<=n;i++)if(val[i]%2)++ans;
if(ans)return cout<<"NO"<<endl<<ans/2,0;
cout<<"YES"<<endl;
for(int i=1;i<=n;i++)belong[i]=i;
for(int i=1;i<=m;i++){
int ui=find(mapi[i].u),vi=find(mapi[i].v);
if(ui==vi)continue;
belong[ui]=vi;
add(mapi[i].u,mapi[i].v);add(mapi[i].v,mapi[i].u);
//cout<<mapi[i].u<<" "<<mapi[i].v<<endl;//
}
//cout<<" Case 1"<<endl;
dfs(1,0);
//cout<<" Case 2"<<endl;
for(int i=1;i<=19;i++)for(int j=1;j<=n;j++)fa[j][i]=fa[fa[j][i-1]][i-1];
for(int i=1;i<=q;i++){
int x=query[i].x,y=query[i].y;
int lcai=lca(x,y);
//cout<<x<<" "<<y<<" "<<lcai<<endl;
cout<<dep[x]+dep[y]-2*dep[lcai]+1<<endl;
print(x,y,lcai);
}
return 0;
}
2021.11.14 CF1583E Moment of Bloom(LCA+图上构造)的更多相关文章
- 日常Java测试 2021/11/14
课堂测试三 package word_show; import java.io.*;import java.util.*;import java.util.Map.Entry; public clas ...
- 2021.9.14考试总结[NOIP模拟53]
T1 ZYB和售货机 容易发现把每个物品都买成$1$是没有影响的. 然后考虑最后一个物品的方案,如果从$f_i$向$i$连边,发现每个点有一个出度多个入度,可以先默认每个物品都能买且最大获利,这样可以 ...
- 日常Java 2021/11/18
用idea实现Javaweb登录页面 <%-- Created by IntelliJ IDEA. User: Tefuir Date: 2021/11/18 Time: 18:14 To ch ...
- JavaSE_ API常用对象 总目录(11~14)
JavaSE学习总结第11天_开发工具 & API常用对象111.01 常见开发工具介绍11.02 Eclipse和MyEclipse的概述11.03 Eclipse的下载安装及卸载11.04 ...
- Intel Artificial Intelligence Conference(2018.11.14)
时间:2018.11.14地点:北京国贸大酒店
- 第26次Scrum会议(11/14)【欢迎来怼】
一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/11/14 11:35~11:57,总计22min.地点:东北 ...
- Notes of Daily Scrum Meeting(11.14)
Notes of Daily Scrum Meeting(11.14) 今天是项目第三周的周五,按原计划这时我们的项目应该已经要进入尾声进行组装调试了,但由于之前放假还有队员们的 效率比较低的原因,我 ...
- C++11/14笔记
目录 语言层面 模板表达式中的空格 nullptr和std::nullptr_t 自动推导类型----auto 一致性初始化----Uniform Initialization 初始化列表(initi ...
- 基数排序的可复用实现(C++11/14/17/20)
基数排序,是对整数类型的一种排序方法,有MSD (most significant digit)和LSD (least significant digit)两种.MSD将每个数按照高位分为若干个桶(按 ...
随机推荐
- dedecms 5.7 任意前台用户修改漏洞
一. 启动环境 1.双击运行桌面phpstudy.exe软件 2.点击启动按钮,启动服务器环境 二.代码审计 1.双击启动桌面Seay源代码审计系统软件 2.点击新建项目按钮,弹出对画框中选择(C:\ ...
- RocketMq基础 看这一篇就够了
RocketMQ 编译安装 HelloWorld 官方网站 http://rocketmq.apache.org GitHub https://github.com/apache/rocketmq Q ...
- unittest 测试用例实现
unittest框架结构 test_case: 测试套件,每一个.py文件代表一个测试用例,测试用例以test开头,否则框架读取不到测试用例 __init__.py是做什么的? 要弄明白这个问题,首先 ...
- Redis数据库的初步认识(二)-C/C++连接redis数据库
1用C语言连接数据库,首先要安装c语言的数据库 在目录/redis- 4.0.1/deps下面执行sudo make/make install命令 在执行完之后可能执行ldconfig命令来更新连接符 ...
- 通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应, 请问,这个 Dao 接口的工作原理是什么?Dao 接口里的方法, 参数不同时,方法能重载吗?
Dao 接口即 Mapper 接口.接口的全限名,就是映射文件中的 namespace 的值: 接口的方法名,就是映射文件中 Mapper 的 Statement 的 id 值:接口方法内的 参数,就 ...
- IDEA 创建javaWeb以及Servlet
1.新建项目 2.Web工程设置:点击项目名称,按F4 (1)配置sources:在WEB-INF下新建两个文件夹classes和lib (2)配置path:刚刚创建的classes文件夹路径 (3) ...
- 什么是 bean 装配?
装配,或 bean 装配是指在 Spring 容器中把 bean 组装到一起,前提是容器需要 知道 bean 的依赖关系,如何通过依赖注入来把它们装配到一起.
- Elasticsearch 对于大数据量(上亿量级)的聚合如何实现?
Elasticsearch 提供的首个近似聚合是 cardinality 度量.它提供一个字段的基数, 即该字段的 distinct 或者 unique 值的数目.它是基于 HLL 算法的.HLL 会 ...
- @Qualifier 注解?
当有多个相同类型的 bean 却只有一个需要自动装配时,将@Qualifier 注解和 @Autowire 注解结合使用以消除这种混淆,指定需要装配的确切的 bean.
- C++ | 虚函数产生条件
虚函数产生的条件 能否成为虚函数主要有以下两种判断依据,如果以下两种条件均满足,则具有成为虚函数的条件. 1.虚函数机制为动多态提供支持,而虚函数表中存放着虚函数的地址.因此虚函数必须是可以取地址的函 ...