【JZOJ 5262】 树
来源:互联网 发布:飞利浦 阿里云 编辑:程序博客网 时间:2024/06/10 02:07
Description
n<=10^6,存在m使得m<=n
Analysis
这种题看起来很难做,但是我们其实要抓住突破口——叶子结点
考虑树上每条边走的次数,正负来表示方向,那么我们可以从叶子结点一路递推到所有点
也就是,树上每条边走的次数是个定值
那么也可以顺便求出每个点作为路径起点/终点的次数
且顺带得出了一个结论:每个点要么只作为起点,要么只作为终点
这样是不是按字典序来配对就可以了呢?
很幸运,这题是的,匹配顺序不会对点权造成影响,只需要发现路径A->B,C->D与路径A->D,C->B是等价的
O(n)
Code
#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,b,a) for(int i=b;i>=a;i--)#define efo(i,v) for(int i=last[v],u=to[i];i;i=next[i],u=to[i])#define max(x,y) ((x)>(y)?(x):(y))#define min(x,y) ((x)<(y)?(x):(y))#define mset(a,x) memset(a,x,sizeof(a))using namespace std;typedef long long ll;void read(int &n){ n=0;char ch;int p=1; for(ch=getchar();ch<'0' || ch>'9';ch=getchar()) if(ch=='-') p=-1; for(;'0'<=ch && ch<='9';ch=getchar()) n=n*10+ch-'0'; n*=p;}const int N=1e6+5;int n,tot,to[N*2],next[N*2],last[N],a[N];ll f[N],g[N];void link(int u,int v){to[++tot]=v,next[tot]=last[u],last[u]=tot;}void dfs(int v,int fr){ efo(i,v) if(u!=fr) { dfs(u,v); f[u]=(u<v)?a[u]:-a[u]; g[u]+=f[u],g[v]-=f[u]; a[v]-=a[u];a[u]=0; }}int main(){ int u,v; read(n); fo(i,1,n) read(a[i]); fo(i,1,n-1) { read(u);read(v); link(u,v),link(v,u); } dfs(1,1); int ans=0; fo(i,1,n) ans+=abs(g[i]); printf("%d\n",ans/2); if(ans/2==0) return 0; for(int i=1,j=1;i<=n && j<=n;) { while(i<n && g[i]<=0) i++; while(j<n && g[j]>=0) j++; if(!g[i] || !g[j]) break; printf("%d %d\n",i,j); if(!--g[i]) i++; if(!++g[j]) j++; } return 0;}
阅读全文
0 0
- 【JZOJ 5262】 树
- JZOJ.1421. 二叉树
- 【JZOJ 5050】 颜色树
- jzoj 5050 颜色树
- JZOJ 5068.树
- 【JZOJ 5484】 快乐树
- 【JZOJ 5484】 快乐树
- [JZOJ 4503] 异或树
- 【JZOJ 4503】异或树
- 【JZOJ 4604】【BZOJ 4551】树
- JZOJ 4746 树塔狂想曲
- JZOJ 4061. 【JSOI2015】字符串树
- JZOJ 2256【ZJOI2008】树的统计
- JZOJ.1166 树中点对距离
- JZOJ 4604 树【NOIP2016模拟7.11】
- JZOJ 1166 树中点对距离
- JZOJ 4811. 排队(线段树的方法)
- JZOJ 4895 三部曲(线段树)
- 【集训Day2】字符串
- 博客启动篇
- 跳跃表的定义及实现
- 一个要做全站的男人 ---001 -- SpringBoot 搭建
- 深入理解计算机操作系统(2.3.2)
- 【JZOJ 5262】 树
- 关于树莓派控制电机--Python
- Loj#6011. 运输问题 (最最基础费用流模板题)
- Lock和synchronized比较详解
- 判断一个变量的类型
- Service的两种启动方式
- android基础-数值选择器(NumberPicker)、搜索框(SearchView)、选项卡(TabHost)、滚动视图(ScrollView)、Notification
- Ubuntu 16.04 LTS 以DaoCloud方式安装Docker
- SPFA,SLF优化