CodeForces903G Yet Another Maxflow Problem 扫描线 + 线段树 + 最小割
给定两条链\(A, B\),其中\(A\)链某些点向\(B\)链有连边,支持修改\(A\)链中的某条边权以及查询\(A_1\)到\(B_n\)的最大流
显而易见,\(A\)和\(B\)链中一定满足左部分属于\(S\)集,右部分属于\(T\)集
枚举\(A, B\)的分界点在哪里,我们就能知道哪些边需要被割掉
可以发现,对于\(A\)链上的一个点而言,割\(A,, B\)之间的边以及\(B\)边的最小值是确定的
那么,对于\(A\)链上的每个点用扫描线预处理出这个最小值
然后最后再来一个线段树来维护\(A\)链上的权值即可
复杂度\(O(n \log n)\)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long
#define ri register int
#define rep(io, st, ed) for(ri io = st; io <= ed; io ++)
#define drep(io, ed, st) for(ri io = ed; io >= st; io --)
#define gc getchar
inline int read() {
int p = 0, w = 1; char c = gc();
while(c > '9' || c < '0') { if(c == '-') w = -1; c = gc(); }
while(c >= '0' && c <= '9') p = p * 10 + c - '0', c = gc();
return p * w;
}
const int sid = 2e5 + 5;
int n, m, q;
int X[sid], Y[sid];
struct myk {
int a, b, v;
friend bool operator < (myk x, myk y)
{ return x.a < y.a; }
} Q[sid];
#define ls (o << 1)
#define rs (o << 1 | 1)
struct Kujuo_Miyako_Saiko {
ll mi[sid << 2], add[sid << 2];
inline void build(int o, int l, int r) {
if(l == r) { mi[o] = Y[l - 1]; return; }
int mid = (l + r) >> 1;
build(ls, l, mid);
build(rs, mid + 1, r);
mi[o] = min(mi[ls], mi[rs]);
}
inline void mdf(int o, int l, int r, int ml, int mr, ll v) {
if(ml > r || mr < l) return;
if(ml <= l && mr >= r) { mi[o] += v; add[o] += v; return; }
int mid = (l + r) >> 1;
mdf(ls, l, mid, ml, mr, v);
mdf(rs, mid + 1, r, ml, mr, v);
mi[o] = min(mi[ls], mi[rs]) + add[o];
}
} km;
ll V[sid];
inline void solve1() {
km.build(1, 1, n);
sort(Q + 1, Q + m + 1);
for(ri i = 1, j = 1; i <= n; i ++) {
while(Q[j].a == i && j <= m) km.mdf(1, 1, n, 1, Q[j].b, Q[j].v), j ++;
V[i] = km.mi[1];
}
}
ll mi[sid << 2];
inline void build(int o, int l, int r) {
if(l == r) { mi[o] = V[l] + X[l]; return; }
int mid = (l + r) >> 1;
build(ls, l, mid);
build(rs, mid + 1, r);
mi[o] = min(mi[ls], mi[rs]);
}
inline void mdf(int o, int l, int r, int p, int v) {
if(l == r) { mi[o] = V[l] + v; return; }
int mid = (l + r) >> 1;
if(p <= mid) mdf(ls, l, mid, p, v);
else mdf(rs, mid + 1, r, p, v);
mi[o] = min(mi[ls], mi[rs]);
}
inline void solve2() {
build(1, 1, n);
printf("%lld\n", mi[1]);
rep(i, 1, q) {
int v = read(), w = read();
mdf(1, 1, n, v, w); printf("%lld\n", mi[1]);
}
}
int main() {
n = read(); m = read(); q = read();
rep(i, 1, n - 1) X[i] = read(), Y[i] = read();
rep(i, 1, m) Q[i].a = read(), Q[i].b = read(), Q[i].v = read();
solve1(); solve2();
return 0;
}
CodeForces903G Yet Another Maxflow Problem 扫描线 + 线段树 + 最小割的更多相关文章
- bzoj 3218: a + b Problem【主席树+最小割】
直接建图比较显然,是(s,i,w),(i,t,b),(i,i',p),(i,j,inf),然而建出来之后发现边数是n方级别的,显然跑不过去,然后就有一种比较神的思路:把a离散了建一棵权值线段树,然后要 ...
- BZOJ 3218 A + B Problem (可持久化线段树+最小割)
做法见dalao博客 geng4512的博客, 思路就是用线段树上的结点来进行区间连边.因为有一个只能往前面连的限制,所以还要可持久化.(duliu) 一直以来我都是写dinicdinicdinic做 ...
- HDU 3642 - Get The Treasury - [加强版扫描线+线段树]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3642 Time Limit: 10000/5000 MS (Java/Others) Memory L ...
- BZOJ_2298_[HAOI2011]problem a_线段树
BZOJ_2298_[HAOI2011]problem a_线段树 Description 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话( ...
- 【BZOJ3958】[WF2011]Mummy Madness 二分+扫描线+线段树
[BZOJ3958][WF2011]Mummy Madness Description 在2011年ACM-ICPC World Finals上的一次游览中,你碰到了一个埃及古墓. 不幸的是,你打开了 ...
- HDU 3265/POJ 3832 Posters(扫描线+线段树)(2009 Asia Ningbo Regional)
Description Ted has a new house with a huge window. In this big summer, Ted decides to decorate the ...
- 【bzoj4491】我也不知道题目名字是什么 离线扫描线+线段树
题目描述 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 输入 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数 ...
- hdu1542 Atlantis(扫描线+线段树+离散)矩形相交面积
题目链接:点击打开链接 题目描写叙述:给定一些矩形,求这些矩形的总面积.假设有重叠.仅仅算一次 解题思路:扫描线+线段树+离散(代码从上往下扫描) 代码: #include<cstdio> ...
- P3722 [AH2017/HNOI2017]影魔(单调栈+扫描线+线段树)
题面传送门 首先我们把这两个贡献翻译成人话: 区间 \([l,r]\) 产生 \(p_1\) 的贡献当且仅当 \(a_l,a_r\) 分别为区间 \([l,r]\) 的最大值和次大值. 区间 \([l ...
随机推荐
- C++获取当前所有进程的完整路径
实现代码 #include <stdio.h> #include <windows.h> #include <tlhelp32.h> #include <st ...
- Linux 入门记录:十二、Linux 权限机制【转】
转自:https://www.cnblogs.com/mingc/p/7591287.html 一.权限 权限是操作系统用来限制资源访问的机制,权限一般分为读.写.执行. 系统中每个文件都拥有特定的权 ...
- API 开发平台 dreamfactory,参考SAWAGGER,国外厂家,开源,本地与云部署
API 开发平台,参考SAWAGGER,国外厂家,本地与云部署:参考 http://swagger.io/commercial-tools/ 1.dreamfactory 梦工厂公司 https: ...
- java中printf()方法简单用法
%n 换行 相当于 \n %c 单个字符 %d 十进制整数 %u 无符号十进制数 %f 十进制浮点数 %o 八进制数 %x 十六进制数 %s 字符串 %% 输出百分号 > 在printf()方法 ...
- oracle flashback 后主键及索引更改问题
oracle flashback 后 主键会变为bin开头,如果删除可以采用将sql复制出单独窗口,然后加上“”执行
- tomcat环境多个jdk版本自定义使用JDK版本及路径
windows环境: 多个应用使用tomcat并且有不同版本的jdk,为避免重复可以在启动文件中指定JDK的版本 如新安装的JDK6在C:\Program Files\Java\jdk1.7.0_79 ...
- IntelliJ IDEA 12:
启动参数-server -Xms1024m -Xmx1024m -XX:NewSize=128m -XX:MaxNewSize=128m -XX:PermSize=128m -XX:MaxPermSi ...
- [转]CentOS7 下安装svn
1. 安装 centos(我这里使用的是CentOS7)下yum命令即可方便的完成安装 $ sudo yum install subversion 测试安装是否成功: $ svnserve --ver ...
- VIM 键盘符号
:h key-notation //查询键盘符号说明<>> 等于shift + > % 是跳到对应的括号 x 是删除当前字符,即右括号 '' 是跳回左括号 x 删除左括号
- php中常用的正则表达式函数
php中常用的正则表达式函数 * preg_match() * preg_match_all() * preg_replace() * preg_filter() * preg_grep() * pr ...