bzoj 2801 [Poi2012]Minimalist Security 设一个,求出所有
题目大意
给出一个N个顶点、M条边的无向图,边(u,v)有权值w(u,v),顶点i也有权值p(i),
并且对于每条边(u,v)都满足p(u)+p(v)>=w(u,v)。
现在要将顶点i的权值减去z(i),其中0<=z(i)<=p(i)。
修改后设顶点i的权值p'(i)=p(i)-z(i),对于每条边(u,v)都满足p'(u)+p'(v)=w(u,v)。
求sum{z(i)}的最小值和最大值。
无解输出NIE
分析
可以搞出很多对方程组
\(A+B=C\)
\(0\le A \le p_A\)
\(0\le B \le p_B\)
之类的
由于是一幅图
对于每个连通块
我们设其中一个点为x
其它的所有点都可以用kx+b来表示,k为\(\pm1\)
正样我们可以求出x的取值范围
进而求出最大最小值
注意
x空集NIE
如果便利到一个点已经有k和b
1.k相同,b不同,NIE
2.k不同,直接将x的取值范围确定为一个定值
solution
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N=500007;
const int M=3000007;
inline int rd(){
int x=0;bool f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(;isdigit(c);c=getchar()) x=x*10+c-48;
return f?x:-x;
}
LL mn=0,mx=0;
int n,m;
LL fir[N];
int g[N],te;
struct edge{int y,next;LL d;}e[M<<1];
void addedge(int x,int y,LL d){
e[++te].y=y;e[te].d=d;e[te].next=g[x];g[x]=te;
}
int vis[N];
LL k[N],b[N];
LL n_mx,n_mn;
LL n_k,n_b;
int q[N];
void NIE(){
puts("NIE");
exit(0);
}
void bfs(int bg){
int h=0,t=1,x,p,y;
LL lf,rt;
LL kk,bb;
q[t]=bg;
vis[bg]=1;
while(h^t){
x=q[++h];
n_k+=k[x];
n_b+=b[x];
if(k[x]==-1) lf=b[x]-fir[x],rt=b[x];
else lf=-b[x],rt=fir[x]-b[x];
if(rt<n_mn) NIE();
if(lf>n_mx) NIE();
if(lf>rt) NIE();
n_mn=max(n_mn,lf);
n_mx=min(n_mx,rt);
for(p=g[x];p;p=e[p].next){
y=e[p].y;
if(!vis[y]){
k[y]=-k[x];
b[y]=e[p].d-b[x];
q[++t]=y;
vis[y]=1;
}
else{
kk=-k[x];
bb=e[p].d-b[x];
if(kk==k[y]){
if(bb!=b[y]) NIE();
}
else{
bool rev=0;
if(kk==-1) swap(kk,k[y]),swap(bb,b[y]),rev=1;
if(b[y]-bb<0) NIE();
if((b[y]-bb)&1) NIE();
lf=rt=(b[y]-bb)/2;
if(rt<n_mn) NIE();
if(lf>n_mx) NIE();
if(lf>rt) NIE();
n_mn=max(n_mn,lf);
n_mx=min(n_mx,rt);
if(rev) k[y]=kk,b[y]=bb;
}
}
}
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("my.out","w",stdout);
#endif
int i,x,y,z;
n=rd(),m=rd();
for(i=1;i<=n;i++) fir[i]=rd();
for(i=1;i<=m;i++){
x=rd(),y=rd(),z=rd();
z=fir[x]+fir[y]-z;
addedge(x,y,z);
addedge(y,x,z);
}
for(i=1;i<=n;i++)
if(!vis[i]){
n_mn=0;
n_mx=fir[i];
n_k=0;
n_b=0;
k[i]=1;
b[i]=0;
bfs(i);
if(n_k<0){
mn+=n_mx*n_k+n_b;
mx+=n_mn*n_k+n_b;
}
else{
mn+=n_mn*n_k+n_b;
mx+=n_mx*n_k+n_b;
}
}
printf("%lld %lld\n",mn,mx);
return 0;
}
bzoj 2801 [Poi2012]Minimalist Security 设一个,求出所有的更多相关文章
- 【BZOJ2801】[Poi2012]Minimalist Security BFS
[BZOJ2801][Poi2012]Minimalist Security Description 给出一个N个顶点.M条边的无向图,边(u,v)有权值w(u,v),顶点i也有权值p(i),并且对于 ...
- bzoj 2797 [Poi2012]Squarks 枚举一个,推出所有
题目大意 设有n个互不相同的正整数{X1,X2,...Xn},任取两个Xi,Xj(i≠j),能算出Xi+Xj. 现在所有取法共n*(n-1)/2个和,要你求出X1,X2,...Xn. 输出所有满足条件 ...
- BZOJ_2801_[Poi2012]Minimalist Security_dfs树+特判+乱搞
BZOJ_2801_[Poi2012]Minimalist Security_dfs树+特判+乱搞 Description 给出一个N个顶点.M条边的无向图,边(u,v)有权值w(u,v),顶点i也有 ...
- [POI2012] BEZ-Minimalist Security
一张n个点m条边的无向图,有点权有边权都是非负,且每条边的权值小于等于两个顶点的权值和,现在要将每个点减一个非负整数使得每条边权等于两个顶点的点权和,问最大修改代价和最小修改代价 思路神的一匹,完全想 ...
- 一个字符串中可能包含a~z中的多个字符,如有重复,如String data="aavzcadfdsfsdhshgWasdfasdf",求出现次数最多的那个字母及次数,如有多个重复的则都求出。
主要掌握String中的方法 char[] toCharArray() 将此字符串转换为一个新的字符数组. int indexOf(String str) 返回 ...
- 已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2)位的整数,则求出w的后n-1位的数。
描述 已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2)位的整数,则求出w的后n-1位的数. 输入 第一行为M,表示测试数据组数.接下来M行,每行包含一个测试数据. 输出 ...
- python练习题,写一个方法 传进去列表和预期的value 求出所有变量得取值可能性(例如list为[1,2,3,4,5,6,12,19],value为20,结果是19+1==20只有一种可能性),要求时间复杂度为O(n)
题目:(来自光荣之路老师)a+b==valuea+b+c=valuea+b+c+d==valuea+b+c+d+...=valuea和b....取值范围都在0-value写一个方法 传进去列表和预期得 ...
- 【BZOJ 4555】[Tjoi2016&Heoi2016]求和 多项式求逆/NTT+第二类斯特林数
出处0.0用到第二类斯特林数的性质,做法好像很多,我打的是直接ntt,由第二类斯特林数的容斥公式可以推出,我们可以对于每一个i,来一次ntt求出他与所有j组成的第二类斯特林数的值,这个时候我们是O(n ...
- 黑马基础阶段测试题:定义一个int类型的数组,数组中元素为{5,7,3,9,4}。求出数组中的最小值,并判断最小值是否为偶数,如果是偶数则输出“最小值为偶数”,如果不是偶数则输出“最小值为奇数”。打印如下:
package com.swift; import java.util.Arrays; public class ArrayTest { public static void main(String[ ...
随机推荐
- 字符编码:WideCharToMultiByte
WideCharToMultiByte 编辑 目录 1基本介绍及功能 2相关变量 1基本介绍及功能编辑 WideCharToMultiByte 函数功能:该函数映射一个unicode字符串 ...
- java子父类初始化顺序 (1)父类静态代码块(2)父类静态变量初始化(3)子类静态代码块(4)子类静态变量初始化(5)main(6)有对象开辟空间都为0(7)父类显示初始化(8)父类构造(9)子类显示初始化(10)子类构造
标题 静态代码块与静态成员变量还要看代码的先后顺序 看程序,说出结果 结果为: x=0 看程序,说出结果 结果如下: 补充 : 静态代码块:static{ } 在JVM加载时即执行,先于主方法执行,用 ...
- k8s的资源限制及资源请求
容器的资源需求及限制: 需求:requests ##定义容器运行时至少需要资源 限制:limits ##定义容器运行时最多能分配的资源 requests:pod.spec.con ...
- 好久没写了,总结一下lnux常用的命令(基础)
Linux 1.init 0 关机 2.init 6 重启 3.ls 列出当前目录下的文件 4.cd 切换目录 cd - 切换最近使用的两次目录 5.pwd 查看当前所在的路径 (“-”为用户 ...
- 能力不足之 根据时序图转化为Verilog代码
不能够把时序图看的非常透彻,然后把时序图写成Verilog代码,有时候甚至搞不清楚信号之间的时序关系.
- mysql 编程
一.存储函数 相当于php或者js中有返回值的函数 --完成一定“计算”后返回单个的数据值 定义: create function 函数名(parameter p1 value_type, param ...
- oracle如何保证读一致性 第二弹
Oracle之数据库一致性读的原理 在Oracle数据库中,undo主要有三大作用:提供一致性读(Consistent Read).回滚事务(Rollback Transaction)以及实例恢复(I ...
- Shuffle UVA - 12174 尺取法
题目:题目链接 思路:见紫书,对具体操作方式还不是很理解,代码是从一个题解里看的,以后多回顾下,需要理解 代码: #include <iostream> #include <cstr ...
- LAMP动态网站安装脚本
#!/bin/bash #auto make install LAMP #by authors zhangjianghua #httpd define path variable H_FILES=ht ...
- Linux压缩与归档
文件的压缩 aaaaaabbbbccc压缩成为6a4b3c 压缩工具: gzip/gunzip: .gz后缀 只能压缩文件,不能压缩目录,因其不具备归档功能 ...