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[ ...
随机推荐
- Node.js 中文学习资料和教程导航
这篇文章来自 Github 上的一位开发者收集整理的 Node.js 中文学习资料和教程导航.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念,它的目标是帮助程 ...
- javascript 完整知识点整理
by 蔡舒啸 目录 一 5种基本类型 typeof 关键字 三种强制类型转换 日期 二 if语句for语句whiledo-whileswitch-case 比较运算符 逻辑运算符 if for语句 w ...
- Java中 Character方法练习:字符串中英文字母个数 5435abc54abc3AHJ5 正则:matches("[a-zA-Z0-9]{1}")
package com.swift; public class String_Letter_Number_Test { public static void main(String[] args) { ...
- 禁止按键F5和禁止鼠标右键菜单 js代码
<script language="javascript"> //禁止按键F5 document.onkeydown = function(e){ e = window ...
- 当c++遇上音乐
运用到的函数 #include <windows.h> Beep( f, t ); Sleep( t ); eep() 函数可以让蜂鸣器发出频率为f赫兹,音长大约为 2t 毫秒的音.(注意 ...
- C#基础-判断语句
switch语句 Console.WriteLine("请输入月份"); string strInput = Console.ReadLine(); switch(strInput ...
- GoF23种设计模式之行为型模式之观察者模式
一.概述 定义对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.二.适用性1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面的时 ...
- HDU - 4763 Theme Section (KMP的next数组的应用)
给定一个字符串,求出一个前缀A,使得字符串的构成可以表示成ABABA的形式(B可以为空串). 输出这个前缀的最大长度. KMP算法Next数组的使用. 枚举中间的每个位置,可以根据Next数组求出这个 ...
- 浅谈内核的Makefile、Kconfig和.config文件
Linux内核源码文件繁多,搞不清Makefile.Kconfig..config间的关系,不了解内核编译体系,编译修改内核有问题无从下手,自己写的驱动不知道怎么编进内核,不知道怎么配置内核,这些问题 ...
- npm 安装express npm ERR! code UNABLE_TO_VERIFY_LEAF_SIGNATURE
npm安装总是报错 报错信息: 解决方案: 在命令行输入: npm config set strict-ssl false 设置之后即可安装软件: