bzoj3135: [Baltic2013]pipesd
Description
有n
个水库,m
条管道。Jester会在某些管道中间凿开一个洞,让水流出来或者用水泵把水打进去。保证这个流速是偶数。对于一条管道(u, v)
,如果在中间凿开了一个洞让水流出来,流速是2d m^3/s
,那么水库u
和v
失水速度为d m^3/s
。同理,如果往一条管道(u, v)
注水,流速为2p m^3/s
,那么u
和v
得到水的速度是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)解出唯一解
- #include<cstdio>
- typedef long long i64;
- char buf[],*ptr=buf,*pmx=buf+;
- inline int g(){
- if(ptr==pmx)fread(ptr=buf,,,stdin);
- return *(ptr++);
- }
- int _(){
- int x=,c=g(),f=;
- while(c<)c=='-'&&(f=-),c=g();
- while(c>)x=x*+c-,c=g();
- return x*f;
- }
- int n,m;
- int et[],enx[],e0[],ep=,deg[],q[],ql=,qr=,v[],e[],p=;
- i64 f[],ans[],s[];
- void dfs(int w,int pa){
- deg[w]=-;
- v[++p]=w;
- for(int i=e0[w];i;i=enx[i]){
- int u=et[i];
- if(deg[u]==)e[p]=i>>,dfs(u,w);
- else if(u!=pa&°[u]==-)e[p]=i>>;
- }
- }
- int main(){
- n=_();m=_();
- if(m>n)return puts(""),;
- for(int i=;i<=n;++i)f[i]=_();
- for(int i=,a,b;i<m;++i){
- a=_();b=_();
- ++deg[a];++deg[b];
- et[ep]=b;enx[ep]=e0[a];e0[a]=ep++;
- et[ep]=a;enx[ep]=e0[b];e0[b]=ep++;
- }
- for(int i=;i<=n;++i)if(deg[i]==)q[++qr]=i;
- while(ql!=qr){
- int w=q[++ql];
- deg[w]=;
- for(int i=e0[w];i;i=enx[i]){
- int u=et[i];
- if(!deg[u])continue;
- ans[i>>]=f[w]*;
- f[u]-=f[w];
- if(==--deg[u])q[++qr]=u;
- }
- }
- for(int w=;w<=n;++w)if(deg[w]==){
- dfs(w,);
- if(p%==)return puts(""),;
- v[p+]=v[];
- for(int i=;i<=p;++i)s[i]=s[i-]+(i&?f[v[i+]]:-f[v[i+]]);
- for(int i=;i<=p;++i)ans[e[i]]=(s[p]-s[i-]*)*(i&?:-);
- break;
- }
- for(int i=;i<=m;++i)printf("%lld\n",ans[i]);
- return ;
- }
bzoj3135: [Baltic2013]pipesd的更多相关文章
- 【BZOJ 3136】 3136: [Baltic2013]brunhilda (数论?)
3136: [Baltic2013]brunhilda Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 238 Solved: 73[Submit][ ...
- 【BZOJ 3133】 3133: [Baltic2013]ballmachine (线段树+倍增)
3133: [Baltic2013]ballmachine Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 148 Solved: 66 Descri ...
- BZOJ_3133_[Baltic2013]ballmachine_堆+倍增
BZOJ_3133_[Baltic2013]ballmachine_堆+倍增 Description 有一个装球机器,构造可以看作是一棵树.有下面两种操作: 从根放入一个球,只要下方有空位,球会沿着树 ...
- [BZOJ3133] [Baltic2013]ballmachine(树上倍增+堆)
[BZOJ3133] [Baltic2013]ballmachine(树上倍增+堆) 题面 有一个装球机器,构造可以看作是一棵树.有下面两种操作: 从根放入一个球,只要下方有空位,球会沿着树滚下.如果 ...
- BZOJ3133[Baltic2013]ballmachine
题目描述 https://www.lydsy.com/JudgeOnline/problem.php?id=3133 题解 还是分两个操作来说吧. 先看第一个操作,放球,可以发现,对于祖先节点和后代节 ...
- [Baltic2013]ballmachine BZOJ3133
分析: 我们考虑,因为每次放置的时候,都是向子树中含有的编号最小的哪一个走,那么放置的顺序是固定的,我们将边以to的子树最小排序,之后得到的出栈序就是球的放入顺序.目测可以使用堆来实现,线段树也能实现 ...
- bzoj3137: [Baltic2013]tracks
炸一看好像很神仙的样子,其实就是个sb题 万年不见的1A 但是我们可以反过来想,先选一个起点到终点的联通块,然后这联通块后面相当于就能够走了,继续找联通块 然后就能发现直接相邻的脚步相同的边权为0,否 ...
- bzoj3136: [Baltic2013]brunhilda
这个题为什么会放在数据结构啊 首先因为有决策包容性,对于一个n每次必然选择一个n%p最大的p,令n减n%p 设fi表示i变成0的步数的话,同样我们可以知道f是有单调性的 假如fd能转移到fk,首先d一 ...
- bzoj3134: [Baltic2013]numbers
稍微用脑子想一想,要是一个回文数,要么s[i]==s[i+1]要么s[i]==s[i+2]就可以实锤了 所以多开两维表示最近两位选的是什么数就完了 注意前导0 #include<cstdio&g ...
随机推荐
- github for windows 安装失败解决方案(亲测)
早之前就有接触github,也在公司机子上装过,一路下来挺顺畅的.夏老师还纳闷他的机子装不上,我说,有鬼! 然而时隔一个月自己再来装,却在自己的本本上遇到鬼了. 然而网上论坛收了一堆,各种试.果断放弃 ...
- Eclipse 安装 CDT
最近准备开始重新学C++,先从IDE开始准备起 Ubuntu下安装非常简单: 打开Eclipse: help -> Install new software -> http://down ...
- Python编程感悟
从今年起开始学习python,最开始是听得MIT的那门公开课,然后又看了一本入门的书籍.但是总是没有觉得python很好用.可能的原因现在想起来是:IDE始终找不到顺手的,另外R用得太舒服了- any ...
- javascript 火狐event.keyCode不能使用event is not defined
在项目中,登录时需要enter按钮提交页面所以需要监听键盘输出 但是在火狐中不支持 event.code 所以换了中写法 1:form中加入时间传入event <form id="fr ...
- mysql最大连接数
通常,mysql的最大连接数默认是100, 最大可以达到16384.1.查看最大连接数:show variables like '%max_connections%';2.修改最大连接数方法一:修改配 ...
- API读取和处理的文件
1.FileList对象 FileList对象是File对象的一个集合,设置multiple就可以多文件上传.2.Blob对象 Blob对象就是一个二进制原始数据对象,它提供了slice方法可以读取 ...
- hive学习笔记_hive的介绍与安装
一.什么是Hive Hive是建立在 Hadoop 上的数据仓库基础构架.它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储.查询和分析存储在 Hadoop 中的大规模数据 ...
- IOS中如何获取手机的当前IP
网上有许多类似的帖子.在搜索了资料以后.觉得下面的方法是最简单的. 使用的时候直接把类方法拖到自己新建的分类中就行. .h文件 #import <Foundation/Foundation.h& ...
- 自我提升mysql
1.某字段更新 自增 1 update table set a=a+1 2.修改某一字段的数据类型 alter table "tablename" modify "co ...
- java多线程:并发包中ConcurrentHashMap和jdk的HashMap的对比
一:HashMap--->底层存储的是Entry<K,V>[]数组--->Entry<K,V>的结构是一个单向的链表static class Entry<K, ...