[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.pswp.cn/news/277950.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277950.shtml
英文地址,請注明出處:http://en.pswp.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…