题面戳这

化下题面给的式子: \(z_u+z_v=p_u+p_v-b_{u,v}\)

发现\(p_u+p_v-b_{u,v}\)是确定的,所以只要确定了一个点\(i\)的权值\(x_i\),和它在同一个联通块的所有点\(j\)的权值\(x_j\)都确定下来了,并且那些点的权值都可以用\((k_jz_i+b_j(k_j\in \{-1,1\})\)来表示。因此一个联通块的答案\(ans\)为:\[z_i\Sigma {k_j}+\Sigma{b_j}\]

然后因为限制了\(0\le z_j \le p_j\),所以把所有\(x_j\)用\(x_i\)表示出来可以得到一个不等式组。解出来\(z_i\)的极值可以对应到\(ans\)的极值了。

代码:

#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define inf 100000000
#define N 500005
using namespace std;

int p[N],b[N],k[N],cnt=0,head[N],mn,mx;
bool vis[N];
ll ans1=0,ans2=0,K,B;
struct ed{
    int v,w,nxt;
}e[N*20];
inline void add(int u,int v,int w){
    e[++cnt]=(ed){v,w,head[u]},head[u]=cnt;
    e[++cnt]=(ed){u,w,head[v]},head[v]=cnt;
}
inline void read(int &y){
    int x=0;char ch=getchar();
    while(ch<'0'||ch>'9') ch=getchar();
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    y=x;
}

void dfs(int u,int fa){
    //0<= k*x+b <=p_u
    if(k[u]<0) mn=max(mn,b[u]-p[u]), mx=min(mx,b[u]);//负数变号
    else mn=max(-b[u],mn), mx=min(p[u]-b[u],mx);
    K+=1ll*k[u], B+=1ll*b[u];
    if(mn>mx){
        puts("NIE");
        exit(0);
    }
    for(register int i=head[u];i;i=e[i].nxt){
        int to=e[i].v,wi=e[i].w;
        if(to!=fa){
            int tmp=wi-b[u];
            if(vis[to]){
                if(k[to]!=k[u] && tmp!=b[to]){//偶环判无解,k相等,b相等
                    puts("NIE");
                    exit(0);
                } else{
                    if(k[to]==k[u]){//奇环可以解出xi的值,代入看范围
                        //k1*xi+b1=k2*xi+b2
                        if((b[to]-tmp)%(-2*k[u])!=0){//权值非整数
                            puts("NIE");
                            exit(0);
                        }
                        mn=max(mn,(b[to]-tmp)/(-2*k[u]));
                        mx=min(mx,(b[to]-tmp)/(-2*k[u]));
                        if(mn>mx){
                            puts("NIE");
                            exit(0);
                        }
                    }
                }
            } else{
                vis[to]=1;
                k[to]=-k[u];
                b[to]=tmp;
                dfs(to,u);
            }
        }
    }
}

int main(){
    register int n,m,u,v,w,i;
    read(n),read(m);
    for(i=1;i<=n;++i) read(p[i]);
    for(i=1;i<=m;++i){
        read(u),read(v),read(w);
        add(u,v,p[u]+p[v]-w);
    }
    for(i=1;i<=n;++i){
        if(!vis[i]){
            vis[i]=1;
            K=B=0;
            k[i]=1,b[i]=0;
            mx=inf,mn=-inf;
            dfs(i,0);
            ans1+=min(1ll*mn*K+B,1ll*mx*K+B);
            ans2+=max(1ll*mn*K+B,1ll*mx*K+B);
        }
    }
    printf("%lld %lld",ans1,ans2);
}

BZOJ2801/洛谷P3544 [POI2012]BEZ-Minimalist Security(题目性质发掘+图的遍历+解不等式组)的更多相关文章

  1. 【题解】洛谷P1073 [NOIP2009TG] 最优贸易(SPFA+分层图)

    次元传送门:洛谷P1073 思路 一开始看题目嗅出了强连通分量的气息 但是嫌长没打 听机房做过的dalao说可以用分层图 从来没用过 就参考题解了解一下 因为每个城市可以走好几次 所以说我们可以在图上 ...

  2. 洛谷 P6776 - [NOI2020] 超现实树(找性质,神仙题)

    洛谷题面传送门 nb tea 一道! 首先考虑怎样入手分析这个看似非常不可做的问题.首先题目涉及高度无穷的树,根本枚举不了.不过我们冷静一下就会发现,如果我们记 \(mx=\max\limits_{i ...

  3. 洛谷 P3539 [POI2012]ROZ-Fibonacci Representation 解题报告

    P3539 [POI2012]ROZ-Fibonacci Representation 题意:给一个数,问最少可以用几个斐波那契数加加减减凑出来 多组数据10 数据范围1e17 第一次瞬间yy出做法, ...

  4. 洛谷P3533 [POI2012]RAN-Rendezvous

    P3533 [POI2012]RAN-Rendezvous 题目描述 Byteasar is a ranger who works in the Arrow Cave - a famous rende ...

  5. 洛谷P3538 [POI2012]OKR-A Horrible Poem [字符串hash]

    题目传送门 A Horrible Poem 题目描述 Bytie boy has to learn a fragment of a certain poem by heart. The poem, f ...

  6. 洛谷P3539 [POI2012] ROZ-Fibonacci Representation

    题目传送门 转载自:five20,转载请注明出处 本来看到这题,蒟蒻是真心没有把握的,还是five20大佬巨orz 首先由于斐波拉契数的前两项是1,1 ,所以易得对于任何整数必能写成多个斐波拉契数加减 ...

  7. 洛谷P3537 [POI2012]SZA-Cloakroom(背包)

    传送门 蠢了……还以为背包只能用来维护方案数呢……没想到背包这么神奇…… 我们用$dp[i]$表示当$c$的和为$i$时,所有的方案中使得最小的$b$最大时最小的$b$是多少 然后把所有的点按照$a$ ...

  8. 洛谷P3531 [POI2012]LIT-Letters

    题目描述 Little Johnny has a very long surname. Yet he is not the only such person in his milieu. As it ...

  9. 洛谷P3534 [POI2012] STU

    题目 二分好题 首先用二分找最小的绝对值差,对于每个a[i]都两个方向扫一遍,先都改成差满足的形式,然后再找a[k]等于0的情况,发现如果a[k]要变成0,则从他到左右两个方向上必会有两个连续的区间也 ...

随机推荐

  1. PHP之CLI模式

    转载: http://www.cnblogs.com/zcy_soft/archive/2011/12/10/2283437.html 所有的PHP发行版,不论是编译自源代码的版本还是预创建的版本,都 ...

  2. 6 基于Servlet 的分页

    实现上图的分页功能,每页显示3条数据,每页显示3页供用户访问,点击左右双箭头时,可以跳转至上一个或者下一个大页,如点击右双箭头显示如下: 1 连接数据库的工具类 package com.latiny. ...

  3. [日志]SAP S/4 HANA 启动与关闭的顺序

    注意 如果是非正式版的话 修改了日期了  需要重启一下应用和数据库才可以, S/4 HANA 启动步骤 先启动HANA: 在终端里输入 su - hdbadm HDB start 再启动S4 su - ...

  4. HDU 2459 Maximum repetition substring

    题目:Maximum repetition substring 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2459 题意:给你一个字符串,求连续重复出现 ...

  5. jQuery EasyUI window窗口使用实例

    需求:点击[增加]按钮,弹出窗口,并对所有输入项内容进行校验,校验通过就提交给后台的action处理,没有通过校验就弹窗提示.  <!DOCTYPE html> <html> ...

  6. play framework接收post请求json格式的参数

    大家在用play framework框架开发第三方调用你的接口的时候并且用json格式的参数post请求 ,参数接收是个问题 ,因为play对表单提交post请求有处理: 有两种方法: 1.直接形参列 ...

  7. class前置声明

    https://www.cnblogs.com/King-Gentleman/p/5081159.html 当两个头文件互相包含的时候,类定义会编译出错,这时需要分别添加上对应的类声明 #includ ...

  8. 一、Java多人博客系统-开篇

    作为一个程序员,工作之外的不断学习是必须的.这个项目是我个人课外学习和练手的项目.最开始是一个个人网站.当时发现京东云可以免费部署网站的,就立即写了一个网站,当时就使用jsp技术,可以实现发布博客.评 ...

  9. ubuntu终端快捷键

    ctrl+alt+t 新终端 ctrl+shift+t打开新的标签页 ctrl+d关闭终端 ctrl+s 暂停屏幕输出 ctrl+q 继续屏幕输出 ctrl+l 清屏 ctrl+alt+f1 切换到第 ...

  10. 第三十四天 UDP协议 并发编程

    一.今日内容 1.UDP协议 2.并发编程 操作系统的发展史 多道技术 进程 线程 IO模型 socketserver 案例:文件上传下载 元类 单例 logging filter 二.TCP半连接池 ...