P11093 [ROI 2021 Day 2] 树制游戏 题解

news/2024/9/30 15:14:00

考虑对于一个解,将每对 \((e_1,e_2)\)\(e_1\) 的终点权值 \(+1\)\(e_2\) 的起点权值 \(-1\),那么最终每个点的权值一定是 \(0\)

考虑先将每条边的终点权值都 \(+1\),那么现在要做的就是选一些点将其起点和终点的权值都 \(-1\),使得最终每个点的权值为 \(0\),于是边的方向就不重要了。

因为是一颗树,考虑随便取一个点位根,从叶子节点开始贪心选。每次如果当前考虑的点权值 \(>0\),就从它连到父亲的边中随便选出若干个使其权值减到 \(0\),如果 \(<0\) 则无解。记录下选出的边,最终和没选择的边匹配即可。

参考代码:

#include<bits/stdc++.h>
#define mxn 300003
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define rept(i,a,b) for(int i=a;i<b;++i)
#define drep(i,a,b) for(int i=a;i>=b;--i)
using namespace std;
struct edge{int x,y;
}e[mxn];
int n,m,c[mxn];
int tot,hd[mxn],vr[mxn<<1],ed[mxn<<1],nx[mxn<<1];
bool v[mxn],b[mxn];
vector<int>s1[mxn],s2[mxn];
inline void add(int x,int y,int z){vr[++tot]=y,ed[tot]=z,nx[tot]=hd[x],hd[x]=tot;
}
void dfs(int x,int fa){v[x]=1;for(int i=hd[x],y;i;i=nx[i])if(!v[y=vr[i]]){dfs(y,x);}if(c[x]<0||c[x]>2){puts("No");exit(0);}if(!c[x])return;if(!fa){puts("No");exit(0);}vector<int>s;for(int i=hd[x],y;i;i=nx[i])if(vr[i]==fa){s.pb(ed[i]);}if(c[x]>s.size()){puts("No");exit(0);}rept(i,0,c[x]){c[fa]--,b[s[i]]=1;}
}
inline void out(int x,int y){cout<<e[x].x<<" "<<e[x].y<<" "<<e[y].x<<" "<<e[y].y<<'\n';
}
signed main(){scanf("%d%d",&n,&m);for(int i=1,x,y;i<=m;++i){scanf("%d%d",&x,&y);e[i]={x,y},c[x]++;add(x,y,i),add(y,x,i);}rep(i,1,n)if(!v[i])dfs(i,0);rep(i,1,m){if(b[i])s2[e[i].y].pb(i);else s1[e[i].x].pb(i);}puts("Yes");rep(i,1,n){rept(j,0,s1[i].size())out(s2[i][j],s1[i][j]);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/66521.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

P7730 [JDWOI-1] 蜀道难

首先,区间增加定值并且要求单调不降,很容易想到差分。 于是先把 \(h\) 数组差分一下,题目的要求即为最小代价使得 \(h\) 均为非负数。 观察一下两种操作,发现 \(n\) 的范围很小,可以枚举操作的起点 \(i\) ,然后如果操作是压低,相当于 \(h[i]--,h[i+l[i]]++\) 。而如果操…

就叫它new Star2024 的WP好了

begin WP 跟着引导走就好,这个引导做的还不错,能教人怎么用IDAbase64 WP总算知道为啥面试会问我是不是不知道base64编码,原来这个就是啊,和北邮新生赛re签到题基本一样。 看懂逻辑,经典3并4后单表替换,然后写代码解决就好

洛谷题单指南-分治与倍增-P6648 [CCC2019] Triangle: The Data Structure

原题链接:https://www.luogu.com.cn/problem/P6648 题意解读:在一个n行的数字三角形中,求所有边长为k的正三角形最大值之和。 解题思路: 1、枚举法 枚举每一个边长为k的三角形,在其中求max,然后累加,n最多3000,时间复杂度是n^4,显然超时。 2、倍增和ST思想 此题非常类…

确保上传的缩略图在 PbootCMS 中保持清晰

config/config.php 文件中的相关部分:// 缩略图配置 ico => array(max_width => 1920, // 最大宽度1920max_height => // 最大高度不填写代表不限制 ),清除缓存清除系统缓存修改完配置文件后,需要清除系统缓存,确保配置更新生效。 在后台管理中找到“缓存管…

象形闽都 数智榕城 | PostgreSQL中文社区技术沙龙 - 福州站

在数字化浪潮席卷的时代,数据已成为推动社会进步与企业发展的核心动力。福建,作为东南沿海的经济与文化重镇,正以崭新的姿态拥抱数智未来。为促进福建地区数据库技术的交流与发展,我们诚挚邀请您参加“象行闽都,数智榕城 —— PostgreSQL数据库技术沙龙”。活动主题: 象行…

SSL证书必须要买吗?

在当今数字化的时代,网络安全日益成为人们关注的焦点。SSL证书作为一种保障网络安全通信的工具,是否必须购买成为许多人心中的疑问。 对于企业和商业网站来说,购买SSL证书往往是非常必要的。 首先,从用户信任的角度来看,当用户访问一个带有SSL证书的网站时,浏览器地址栏会…

PBOOTCMS的水印功能如何使用?pbootcms设置的水印为何没生效?

在 PbootCMS 中,水印功能主要用于给新上传的图片添加水印。如果你发现开启了水印功能但前端仍然没有水印,可能是因为以下几个原因:只对新上传的图片生效:水印功能仅对新上传的图片生效,之前上传的图片不会自动加上水印。 水印配置未生效:可能是因为水印配置没有正确设置或…

prometheus学习笔记之Grafana 常用操作

一、Panel 设置 1.单位设置2.Panel名称修改3.曲线别名 修改前修改后 4.曲线排序 5.曲线复制6.曲线静默 7.Panel复制 当前dashboard中复制跨dashboard或folder在其他dashboard中操作8.设置告警线设置告警条件其他按提示填写如果触发告警规则 则页面会有提示9.row效果如下:10.自…