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[ ...
随机推荐
- string 空值
string str; string mystr = ""; 则 str == mystr;
- RenderBody,RenderPage和RenderSection
1. RenderBody 在Razor引擎中没有了“母版页”,取而代之的是叫做“布局”的页面(_Layout.cshtml)放在了共享视图文件夹中.在这个页面中,会看到<body>标签里 ...
- iOS开发之MVVM在项目中的应用
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- docker镜像下载
获得CentOS的Docker CE 预计阅读时间: 10分钟 要在CentOS上开始使用Docker CE,请确保 满足先决条件,然后 安装Docker. 先决条件 Docker EE客户 要安装D ...
- python-for循环与while循环
while 循环 格式: while 条件 为 True: 代码块 while True: rayn_age = 18 age = input('请输入你的年龄:') age = int(age) i ...
- 优酷项目之 ORM(数据库对象关系映射)代码重写
前言: 我们在操作数据库时候一般都是通过sql代码来操作mysql数据库中相关数据,这就需要懂得sql语句,那么怎么样才能在不懂sql语句的情况下通过我们所学的python代码来实现对mysql数据库 ...
- Python基础(五)——闭包与lambda的结合
(1)变量的域 要了解闭包需要先了解变量的域,也就是变量在哪一段“上下文”是有效的(类似局部变量和全局变量的区别),举一个很简单的例子.(例子不重要,就是涉及闭包就要时刻关注这个域) def test ...
- day 35 补充
MySQL数据库初识 MySQL数据库 本节目录 一 数据库概述 二 MySQL介绍 三 MySQL的下载安装.简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集 ...
- Tracer Deployment UVALive - 8271 二分图匹配
复习二分图又想起了这道题,裸的二分图匹配,直接匈牙利算法就可以了,mark一下这个比较好用的稠密图匈牙利算法模板 题目:题目链接 AC代码: #include <iostream> #in ...
- session工作原理
什么是Sesson? 这个是状态保持三大对象之一! 原意是会话,会议的意思! 就是你打开浏览器到关闭浏览器 这期间称为一个会话,也就是一个session, 它是保存在服务器端的. 每当客户端请求页面时 ...