[CF903G]Yet Another Maxflow Problem

[CF903G]Yet Another Maxflow Problem

题目大意:

\(A\)类点和\(B\)类点各\(n(n\le2\times10^5)\)个,所有\(A_i\)\(A_{i+1}\)有一条权值为\(a_i\)的有向边,所有\(B_i\)\(B_{i+1}\)有一条权值为\(b_i\)的有向边,另有\(m(m\le2\times10^5)\)条从\(A_x\)\(B_y\)的权值为有向边。连续\(q(q\le2\times10^5)\)次操作将\(A_{v_i}\)\(A_{v_i+1}\)之间的边的权值改为\(w_i\)。问每次修改完毕后的从\(A_1\)\(B_n\)的最大流。

思路:

根据最大流-最小割定理,题目所求相当于每次修改完毕后的最小割。定义\(A\)类点间的边为\(A\)类边,\(B\)类点间的边为\(B\)类边,\(AB\)类点间的边为\(C\)类边。假设两类边各\(n-1\)条之外还分别有一个边权为\(0\)的边,那么每次的最小割一定恰好包含一个\(A\)类边、一个\(B\)类边和若干\(C\)类边。由于\(B\)类边和\(C\)类边都不会被修改,则对于同一个\(A\)类边,对应的最优的\(B\)类边是固定的。方便起见,下文将\(B_i\)\(B_{i+1}\)的边记作\(b_{i+1}\),不同于题面描述。

考虑预处理每个\(A\)类边对应的最优\(B\)类边。不难发现,若我们选择了\(a_i\)\(b_j\)两条边,要使得\(A_1\)\(B_n\)不连通,则我们还需要割去所有连接\(A_x,B_y(x\le i,y\ge j)\)\(C\)类边,而这也是选择\(a_i\)\(b_j\)后的最小割。反过来说,连接\(A_x,B_y\)\(C\)类边会对\(a_i,b_j(x\le i,y\ge j)\)的选择产生影响。因此我们可以\(1\sim n\)枚举每个\(a_i\),用线段树维护对应每个\(b_j\)所需要的最小割的大小。首先将所有\(b_j\)加入到线段树中,对于当前枚举到的\(a_i\),枚举从\(A_i\)出发的所有\(C\)类边,若对应的点为\(B_j\),权值为\(w\),将区间\([1,j]\)加上\(w\),表示对于\(a_i\)\(a_i\)以后的\(A\)类边,若还要考虑\(b_j\)\(b_j\)以前的\(B\)类边作为对应边,一定要割去这条\(C\)类边。而每次插入后线段树最小元素就是对应当前\(a_i\),由一个\(B\)类边和若干\(C\)类边组成的、能与\(a_i\)构成割的边权和,记这一边权和为\(sum\),则选择\(a_i\)时的最小割为\(sum+a_i\),记作\(c_i\)

考虑修改操作,由于\(a_i\)对应的\(B\)类边和\(C\)类边已经确定,每次修改时\(a_i\)的变化也就是\(c_i\)的变化。用一些数据结构维护所有\(c_i\)的最小值即可。时间复杂度\(\mathcal O((m+q)\log n)\)

源代码:

#include<cstdio>
#include<cctype>
#include<vector>
using int64=long long;
inline int getint() {register char ch;while(!isdigit(ch=getchar()));register int x=ch^'0';while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');return x;
}
constexpr int N=2e5+1;
int64 a[N],b[N],c[N];
using Edge=std::pair<int,int>;
std::vector<Edge> e[N];
class SegmentTree {#define _left <<1#define _right <<1|1private:int64 val[N<<2],tag[N<<2];void push_up(const int &p) {val[p]=std::min(val[p _left],val[p _right]);}void push_down(const int &p) {if(!tag[p]) return;val[p _left]+=tag[p];val[p _right]+=tag[p];tag[p _left]+=tag[p];tag[p _right]+=tag[p];tag[p]=0;}public:void build(const int &p,const int &b,const int &e,const int64 arr[]) {tag[p]=0;if(b==e) {val[p]=arr[b];return;}const int mid=(b+e)>>1;build(p _left,b,mid,arr);build(p _right,mid+1,e,arr);push_up(p);}void modify(const int &p,const int &b,const int &e,const int &l,const int &r,const int64 &v) {if(b==l&&e==r) {val[p]+=v;tag[p]+=v;return;}push_down(p);const int mid=(b+e)>>1;if(l<=mid) modify(p _left,b,mid,l,std::min(mid,r),v);if(r>mid) modify(p _right,mid+1,e,std::max(mid+1,l),r,v);push_up(p);}int64 query() const {return val[1];}#undef _left#undef _right
};
SegmentTree t;
int main() {const int n=getint(),m=getint(),q=getint();for(register int i=1;i<n;i++) {a[i]=getint(),b[i+1]=getint();}t.build(1,1,n,b);for(register int i=0;i<m;i++) {const int u=getint(),v=getint(),w=getint();e[u].push_back({v,w});}for(register int x=1;x<=n;x++) {for(register auto &j:e[x]) {const int &y=j.first,&w=j.second;t.modify(1,1,n,1,y,w);}c[x]=t.query()+a[x];}t.build(1,1,n,c);printf("%lld\n",t.query());for(register int i=0;i<q;i++) {const int x=getint(),v=getint();t.modify(1,1,n,x,x,v-a[x]);a[x]=v;printf("%lld\n",t.query());}return 0;
}

转载于:https://www.cnblogs.com/skylee03/p/9087266.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P1579哥德巴赫猜想

写来自己学习用~ 题目内容&#xff1a; 1742年6月7日哥德巴赫写信给当时的大数学家欧拉&#xff0c;正式提出了以下的猜想&#xff1a;任何一个大于9的奇数都可以表示成3个质数之和。质数是指除了1和本身之外没有其他约数的数&#xff0c;如2和11都是质数&#xff0c;而6不是质…

在VSCode Remote环境下开发Teams Bot

我使用VS Code开发已经有蛮长一段时间了&#xff0c;时间长了&#xff0c;越来越喜欢VS Code&#xff0c;虽然有些时候会没有传统的VS方便&#xff0c;比如开发Azure Function时你需要编写一下launch.json&#xff0c;而且你需要手动启动StorageEmulator&#xff0c;但是也正是…

查看安卓APK源码破解

原文:查看安卓APK源码破解工具准备&#xff1a; <1>.android4me的AXMLPrinter2工具 <2>dex2jar <3>jd-gui 工具下载&#xff1a;http://download.csdn.net/detail/catshitone/8491347 开始&#xff1a; 第一步&#xff1a; 首先用解压软件&#xff08;如好…

实验六:类的封装

一、实验代码如下&#xff1a; 1 package 实验6;2 3 import java.util.Scanner;4 5 6 public class Account {7 8 public int id;9 public String name;10 public long number;11 public long time;12 public int money;13 14 //方法Account()…

Teams Bot开发系列:初识Bot

上次我们讲了Teams Bot开发的概述&#xff0c;讲了Azure Bot Service&#xff0c;Bot Framework SDK和我们自己的bot服务的概念&#xff0c;这篇文章就带大家看看Azure Bot Service和我们的bot是如何发生关系的。 我们自己开发的bot服务实际上就是一个api service&#xff0c;…

[环境搭建]SDN网络感知服务与最短路径应用

1.安装python模块networkxpip install networkx2.给Network_Awareness.py加修改权限chmod 777 Network_Awareness.py3.下载安装ryugit clone git://github.com/osrg/ryu.gitcd ryu sudo python ./setup.py install#若已安装ryu,删了再装&#xff0c; pip uninstall ryu4.修改“…

我需要别人承认才快乐吗?

关于生命的感悟两个故事第一个故事&#xff0c;一个尖子生考上了麻省理工学院&#xff0c;在那里所有同学都很优秀&#xff0c;竞争非常强烈&#xff0c;她发现再也不能出类拔萃&#xff0c;在各方面赢过别人&#xff0c;于是觉得生活看不到希望&#xff0c;郁郁寡欢&#xff0…

Teams Bot开发系列:Activity和Turn

这篇文章我们来说一下Activity和Turn这两个bot framework中最重要的两个概念&#xff0c;同时也介绍一下TurnContext和BotAdapter Activity 一个activity是聊天双方的一个信息载体&#xff0c;它可以是一条消息&#xff0c;也可以是一个动作。比如用户给bot发送一条文字消息&…

ubuntu16.04下安装opencv出现libgtk2.0-dev配置失败问题解决方法

第一次在ubuntu下安装opencv&#xff0c;遇到很多问题&#xff0c;特别是libgtk2.0-dev总是配置失败的问题&#xff0c;在网上也看到一些解决方法&#xff0c;自己也遇到一些比较奇葩的问题&#xff0c;故整理于此。 网上大部分的解决方案就是更改下载源&#xff0c;我看到一些…

03|模型I/O:输入提示、调用模型、解析输出

03&#xff5c;模型I/O&#xff1a;输入提示、调用模型、解析输出 从这节课开始&#xff0c;我们将对 LangChain 中的六大核心组件一一进行详细的剖析。 模型&#xff0c;位于 LangChain 框架的最底层&#xff0c;它是基于语言模型构建的应用的核心元素&#xff0c;因为所谓 …

selenuim自动化爬取汽车在线谷米爱车网车辆GPS数据爬虫

#为了实时获取车辆信息&#xff0c;以及为了后面进行行使轨迹绘图&#xff0c;写了一个基于selelnium的爬虫爬取了车辆gps数据。 #在这里发现selenium可以很好的实现网页解析和处理js处理 #导包 import timefrom selenium import webdriverfrom selenium.webdriver.support.wai…

Teams Bot开发系列:Activity处理流程

上篇文章介绍了什么是Activity&#xff0c;Turn&#xff0c;TurnContext和BotAdapter&#xff0c;这篇文章我们看看这些东西是如何窜起来的&#xff0c;他们是如何处理用户发给bot的消息的。 我们以一个最简单的bot&#xff0c;echo bot为例子&#xff0c;所谓的echo bot就是用…

写单元测试的好处(转)

许多开发者都有个习惯&#xff0c;常常不乐意去写个简单的单元测试程序来验证自己的代码。对自己的程序一直非常有自信&#xff0c;或存在侥幸心理每次运行通过后就直接扔给测试组测试了。然而每次测试组的BUG提交过来后就会发现自己的程序还存在许多没有想到的漏洞。但是每次修…

linux下搭建go环境--问题记录

记录自己在linux上搭建go环境的经历。&#xff08;因为各种版本&#xff0c;linux系统问题挣扎了几天&#xff09; 安装vmware-tools,把我要运行代码拷进来。这个网上方法很多&#xff0c;我的电脑抽风不能安装&#xff0c;后面重装的虚拟机确定Ubuntu版本、位数。很重要&#…

Teams Bot开发系列:Teams的Activity处理

上一篇文章讲了activity处理的流程&#xff0c;我们bot的核心处理逻辑放在ActivityHandler的子类里&#xff0c;通过重载OnMessageActivityAsync()方法来实现。 这篇文章我来讲一下对于Teams的bot来说&#xff0c;整个处理的逻辑会有哪些不同点。 通过之前的文章&#xff0c;…

取球博弈

两个人玩取球的游戏。一共有N个球&#xff0c;每人轮流取球&#xff0c;每次可取集合{n1,n2,n3}中的任何一个数目。 如果无法继续取球&#xff0c;则游戏结束。 此时&#xff0c;持有奇数个球的一方获胜。 如果两人都是奇数&#xff0c;则为平局。 假设双方都采用最聪明的取法…

MySQL修改字符集

MySQL数据库修改字符集,介绍一下修改的方法 1&#xff09;系统工具iconv #file filename #mysqldump --default-character-setutf8 >20180523xxx.sql #file 20180523xxx.sql #iconv -t utf8mb4 -c 20180523xxx.sql>20180523xxxutf8mb4.sql #file 20180523xxxutf8mb4.sql…

Teams Bot开发系列:Bot验证

我们今天来说一下authentication&#xff0c;authentication一直是一个复杂的问题。bot里的authentication也不简单。我们先来看一个概念&#xff1a;Bot Framework Token Service&#xff0c;根据官方定义&#xff0c;这个token service主要是&#xff1a; Facilitating the u…

堆排序

目录 一、定义二、算法分析三、代码地址一、定义 1.1 堆 ​ 此处的堆&#xff0c;指数据结构中的堆。而不是内存中的那种内存堆&#xff0c;内存堆是基于数据结构的一种实现。堆的数据结构是一棵完全二叉树&#xff0c;它有如下特点&#xff1a;&#xff08;具体参考下文链接&a…

Teams Bot开发系列:Middleware

middleware是目前一些framework比较流行的概念&#xff0c;通常一个开发框架需要提供一些可扩展可定制化的功能。所以middleware这种pattern就很实用。 熟悉asp.net core的开发可能第一个想到的就是asp.net core的middleware&#xff0c;如下图&#xff1a; 当一个http reques…