Description

n个水库,m条管道。Jester会在某些管道中间凿开一个洞,让水流出来或者用水泵把水打进去。保证这个流速是偶数。对于一条管道(u, v),如果在中间凿开了一个洞让水流出来,流速是2d m^3/s,那么水库uv失水速度为d m^3/s。同理,如果往一条管道(u, v)注水,流速为2p m^3/s,那么uv得到水的速度是p m^3/s

给定图的构造以及每个水库的水流的变化,问每条边的方案是否唯一。

Input

第一行:水库数量n,管道数量m (1 <= n <= 100 000, 1 <= m <= 500 000)下面n行:第i个水库的变化速度ci (-10^9 <= ci <= 10^9)接下来m行:(u, v),保证没有重边

Output

如果方案唯一,输出方案,每行一个数xi-10^9 <= xi <= 10^9)表示第i条管道的流量变化。放水为负数,灌水为正数。否则输出0

边看做未知数则每个点构成一个方程,保证有解,因此n<m时方案不唯一

对于一个度为1的点,与其相邻的边的答案可以被确定,因此可以以此为突破口消元,若n=m-1则最后可以全部解出,若n=m则最后剩下一个环

对于偶环,显然方案不唯一,对于奇环则可以简单地推出公式O(n)解出唯一解

  1. #include<cstdio>
  2. typedef long long i64;
  3. char buf[],*ptr=buf,*pmx=buf+;
  4. inline int g(){
  5. if(ptr==pmx)fread(ptr=buf,,,stdin);
  6. return *(ptr++);
  7. }
  8. int _(){
  9. int x=,c=g(),f=;
  10. while(c<)c=='-'&&(f=-),c=g();
  11. while(c>)x=x*+c-,c=g();
  12. return x*f;
  13. }
  14. int n,m;
  15. int et[],enx[],e0[],ep=,deg[],q[],ql=,qr=,v[],e[],p=;
  16. i64 f[],ans[],s[];
  17. void dfs(int w,int pa){
  18. deg[w]=-;
  19. v[++p]=w;
  20. for(int i=e0[w];i;i=enx[i]){
  21. int u=et[i];
  22. if(deg[u]==)e[p]=i>>,dfs(u,w);
  23. else if(u!=pa&°[u]==-)e[p]=i>>;
  24. }
  25. }
  26. int main(){
  27. n=_();m=_();
  28. if(m>n)return puts(""),;
  29. for(int i=;i<=n;++i)f[i]=_();
  30. for(int i=,a,b;i<m;++i){
  31. a=_();b=_();
  32. ++deg[a];++deg[b];
  33. et[ep]=b;enx[ep]=e0[a];e0[a]=ep++;
  34. et[ep]=a;enx[ep]=e0[b];e0[b]=ep++;
  35. }
  36. for(int i=;i<=n;++i)if(deg[i]==)q[++qr]=i;
  37. while(ql!=qr){
  38. int w=q[++ql];
  39. deg[w]=;
  40. for(int i=e0[w];i;i=enx[i]){
  41. int u=et[i];
  42. if(!deg[u])continue;
  43. ans[i>>]=f[w]*;
  44. f[u]-=f[w];
  45. if(==--deg[u])q[++qr]=u;
  46. }
  47. }
  48. for(int w=;w<=n;++w)if(deg[w]==){
  49. dfs(w,);
  50. if(p%==)return puts(""),;
  51. v[p+]=v[];
  52. for(int i=;i<=p;++i)s[i]=s[i-]+(i&?f[v[i+]]:-f[v[i+]]);
  53. for(int i=;i<=p;++i)ans[e[i]]=(s[p]-s[i-]*)*(i&?:-);
  54. break;
  55. }
  56. for(int i=;i<=m;++i)printf("%lld\n",ans[i]);
  57. return ;
  58. }

bzoj3135: [Baltic2013]pipesd的更多相关文章

  1. 【BZOJ 3136】 3136: [Baltic2013]brunhilda (数论?)

    3136: [Baltic2013]brunhilda Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 238  Solved: 73[Submit][ ...

  2. 【BZOJ 3133】 3133: [Baltic2013]ballmachine (线段树+倍增)

    3133: [Baltic2013]ballmachine Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 148  Solved: 66 Descri ...

  3. BZOJ_3133_[Baltic2013]ballmachine_堆+倍增

    BZOJ_3133_[Baltic2013]ballmachine_堆+倍增 Description 有一个装球机器,构造可以看作是一棵树.有下面两种操作: 从根放入一个球,只要下方有空位,球会沿着树 ...

  4. [BZOJ3133] [Baltic2013]ballmachine(树上倍增+堆)

    [BZOJ3133] [Baltic2013]ballmachine(树上倍增+堆) 题面 有一个装球机器,构造可以看作是一棵树.有下面两种操作: 从根放入一个球,只要下方有空位,球会沿着树滚下.如果 ...

  5. BZOJ3133[Baltic2013]ballmachine

    题目描述 https://www.lydsy.com/JudgeOnline/problem.php?id=3133 题解 还是分两个操作来说吧. 先看第一个操作,放球,可以发现,对于祖先节点和后代节 ...

  6. [Baltic2013]ballmachine BZOJ3133

    分析: 我们考虑,因为每次放置的时候,都是向子树中含有的编号最小的哪一个走,那么放置的顺序是固定的,我们将边以to的子树最小排序,之后得到的出栈序就是球的放入顺序.目测可以使用堆来实现,线段树也能实现 ...

  7. bzoj3137: [Baltic2013]tracks

    炸一看好像很神仙的样子,其实就是个sb题 万年不见的1A 但是我们可以反过来想,先选一个起点到终点的联通块,然后这联通块后面相当于就能够走了,继续找联通块 然后就能发现直接相邻的脚步相同的边权为0,否 ...

  8. bzoj3136: [Baltic2013]brunhilda

    这个题为什么会放在数据结构啊 首先因为有决策包容性,对于一个n每次必然选择一个n%p最大的p,令n减n%p 设fi表示i变成0的步数的话,同样我们可以知道f是有单调性的 假如fd能转移到fk,首先d一 ...

  9. bzoj3134: [Baltic2013]numbers

    稍微用脑子想一想,要是一个回文数,要么s[i]==s[i+1]要么s[i]==s[i+2]就可以实锤了 所以多开两维表示最近两位选的是什么数就完了 注意前导0 #include<cstdio&g ...

随机推荐

  1. github for windows 安装失败解决方案(亲测)

    早之前就有接触github,也在公司机子上装过,一路下来挺顺畅的.夏老师还纳闷他的机子装不上,我说,有鬼! 然而时隔一个月自己再来装,却在自己的本本上遇到鬼了. 然而网上论坛收了一堆,各种试.果断放弃 ...

  2. Eclipse 安装 CDT

    最近准备开始重新学C++,先从IDE开始准备起 Ubuntu下安装非常简单: 打开Eclipse: help -> Install new software ->  http://down ...

  3. Python编程感悟

    从今年起开始学习python,最开始是听得MIT的那门公开课,然后又看了一本入门的书籍.但是总是没有觉得python很好用.可能的原因现在想起来是:IDE始终找不到顺手的,另外R用得太舒服了- any ...

  4. javascript 火狐event.keyCode不能使用event is not defined

    在项目中,登录时需要enter按钮提交页面所以需要监听键盘输出 但是在火狐中不支持 event.code 所以换了中写法 1:form中加入时间传入event <form id="fr ...

  5. mysql最大连接数

    通常,mysql的最大连接数默认是100, 最大可以达到16384.1.查看最大连接数:show variables like '%max_connections%';2.修改最大连接数方法一:修改配 ...

  6. API读取和处理的文件

    1.FileList对象  FileList对象是File对象的一个集合,设置multiple就可以多文件上传.2.Blob对象 Blob对象就是一个二进制原始数据对象,它提供了slice方法可以读取 ...

  7. hive学习笔记_hive的介绍与安装

    一.什么是Hive Hive是建立在 Hadoop 上的数据仓库基础构架.它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储.查询和分析存储在 Hadoop 中的大规模数据 ...

  8. IOS中如何获取手机的当前IP

    网上有许多类似的帖子.在搜索了资料以后.觉得下面的方法是最简单的. 使用的时候直接把类方法拖到自己新建的分类中就行. .h文件 #import <Foundation/Foundation.h& ...

  9. 自我提升mysql

    1.某字段更新 自增 1 update table set a=a+1 2.修改某一字段的数据类型 alter table "tablename" modify  "co ...

  10. java多线程:并发包中ConcurrentHashMap和jdk的HashMap的对比

    一:HashMap--->底层存储的是Entry<K,V>[]数组--->Entry<K,V>的结构是一个单向的链表static class Entry<K, ...