想象力惊人的想到生成树,因此对于一种 \(c\) 序列,容易求出只有根不满足要求的构造,且只有树边有权。考虑通过非树边们修改根。

对于一条非树边(都是返祖边),假如我们给它的权值 \(+1\),那么对于奇环来说,\(\Delta root=\pm 2\);偶环没有变化。

所以我们直接找到奇环,分别尝试两种情况即可。时间复杂度 \(O(n)\)。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m,dep[N],fx,fy,fb,u[N],v[N];
long long c[N],ans[N],wt[N];
struct edge{int to,id;};
vector<edge>ve[N],g[N];
void dfs1(int x){
for(auto y:ve[x]) if(!dep[y.to])
g[x].push_back(y),dep[y.to]=dep[x]+1,dfs1(y.to);
}void dfs2(int x){
wt[x]=0;for(auto y:g[x])
dfs2(y.to),wt[x]+=(ans[y.id]=c[y.to]-wt[y.to]);
}int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>c[i];
for(int i=1,x,y;i<=m;i++){
cin>>x>>y,ve[y].push_back({x,i});
ve[u[i]=x].push_back({v[i]=y,i});
}dfs1(dep[1]=1),dfs2(1);long long dt=wt[1]-c[1];
if(dt){
for(int i=1;i<=m;i++)
if(abs(dep[u[i]]-dep[v[i]])%2==0)
fx=u[i],fy=v[i],fb=i;
if(!fb) return cout<<"NO",0;
c[fx]-=dt/2,c[fy]-=dt/2,dfs2(1);
if(wt[1]!=c[1])
c[fx]+=dt,c[fy]+=dt,dfs2(1),ans[fb]=-dt/2;
else ans[fb]=dt/2;
}cout<<"YES\n";
for(int i=1;i<=m;i++)
cout<<ans[i]<<"\n";
return 0;
}

[CF901D] Weighting a Tree 题解的更多相关文章

  1. Codeforces Round #530 (Div. 2):D. Sum in the tree (题解)

    D. Sum in the tree 题目链接:https://codeforces.com/contest/1099/problem/D 题意: 给出一棵树,以及每个点的si,这里的si代表从i号结 ...

  2. POJ 1308 Is It A Tree?--题解报告

    Is It A Tree? Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 31092   Accepted: 10549 D ...

  3. C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解

    剑指offer 面试题39:判断平衡二叉树 提交网址:  http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId= ...

  4. Codeforces Round #453 (Div. 1) D. Weighting a Tree(构造)

    题意 一个 \(n\) 个点 \(m\) 条边的无向连通图中每个点都有一个权值,现在要求给每条边定一个权值,满足每个点的权值等于所有相连的边权之和,权值可负. 题解 如果图是一棵树,那么方案就是唯一的 ...

  5. 【文文殿下】CF1098C Construct a tree 题解

    题解 挺水的一道题. Rating $ \color{orange} {2300}$ 以下送命题. 首先我们知道,所有子树大小之和就是节点个数加上从根到所有节点的路径长度之和. 他要求度数尽可能小,所 ...

  6. BZOJ2588:Count on a tree——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2588 Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你 ...

  7. CC TSUBSTR:Substrings on a Tree——题解

    https://www.codechef.com/problems/TSUBSTR https://vjudge.net/problem/CodeChef-TSUBSTR 给一棵点权为字母的树,你只能 ...

  8. 【日常学习】【二叉树遍历】Uva548 - Tree题解

    这道题目本身不难,给出后序遍历和中序遍历,求到节点最小路径的叶子,同样长度就输出权值小的叶子. Uva上不去了,没法測.基本上是依照ruka的代码来的.直接上代码 //Uva548 Tree #inc ...

  9. SPOJ - QTREE Query on a tree题解

    题目大意: 一棵树,有边权,有两个操作:1.修改一条边的权值:2.询问两点间路径上的边的权值的最大值. 思路: 十分裸的树链剖分+线段树,无非是边权要放到深度大的一端的点上,但是有两个坑爹的地方,改了 ...

  10. 洛谷 P2633 Count on a tree 题解

    题面 对于每个点建立一颗主席树: 然后按照树上差分的思想统计主席树的前缀和: lca+主席树+前向星存表就可以了: #include <bits/stdc++.h> #define inc ...

随机推荐

  1. Javascript 标签的属性

    1.为HTML标签设置和添加属性 setAttribute() setAttribute()方法可以给HTML标签设置/添加属性(原生的属性或者自定义的属性都可以)添加的属性会存储在标签中 <! ...

  2. vue3笔记 - 父子组件通信

    父传子 说明:父组件将数据绑定在组件标签上:子组件props接收 父组件: <template> <Child :msg="msg" /> </tem ...

  3. Shell三元表达式

    Shell三元表达式   shell能否实现三元表达式呢?像下面这样: int a = (b == 5) ? c : d; 实现方法: a=$([ "$b" == 5 ] & ...

  4. Qt开源作品20-PNG图片警告去除工具

    一.前言 在新版的Qt5中,我们之前在Qt4中使用的png图片,到了这里经常会报一个警告,libpng warning: iCCP: known incorrect sRGB profile,尽管这种 ...

  5. 15条 Karpenter 最佳实践,轻松掌握弹性伸缩

    Karpenter 是一款高性能.灵活的开源 Kubernetes 集群自动扩展工具,目前已支持 AWS 和阿里云.它可以根据不断变化的应用负载,快速启动大小合适的计算资源,进而提升应用的可用性. 相 ...

  6. 在CLion中如何为CMakeLists.txt文件添加第三方依赖库

    cmake_minimum_required(VERSION 3.5)project(ImageBasedModellingEdu)set(CMAKE_MODULE_PATH "${CMAK ...

  7. lottie-web动画库在HTML5页面中和在vue项目中的两种使用方式

    本文主要介绍lottie-web动画库在HTML5页面中和在vue项目中的两种使用方式. 1.在HTML5页面中的使用方式 具体使用步骤详见下面的代码: <!DOCTYPE html> & ...

  8. [转]swing中如何将jtable中的数据导入到excel中?

    这个版本的代码是可以支持中文,需要导入jxl.jar包,并添加到Build Path中(自行搜索下载). 最终代码: package test; import java.awt.event.*; im ...

  9. CDS标准视图:总计应收款 I_TotalAccountsReceivables

    视图名称:总计应收款 I_TotalAccountsReceivables 视图类型:参数 视图代码: 点击查看代码 @AbapCatalog.sqlViewName: 'IFITOTALACCTRB ...

  10. ABP 系列总结

    2019年第一次接触 ABP 框架,那时候还是比较笨重的旧版本的,后来升级到 vNext 版本,我也基于 ABP 模块化的设计方式开发了一些模块用于日常工作.这个系列主要为了系统地记录一下日常工作与学 ...