zoukankan      html  css  js  c++  java
  • CF903G Yet Another Maxflow Problem

    题面

    一张图分为两部分,左右都有(n)个节点,
    (A_i->A_{i+1})连边,(B_{i}->B_{i+1})连边,容量给出
    (m)(A_i->B_j)有边,容量给出
    两种操作
    1.修改某条(A_i->A_{i+1})的边的容量
    2.询问从(A_1)(B_n)的最大流
    (n,m<=100000),流量(<=10^9)

    Sol

    首先最大流等于最小割
    而且每条(A_i->A_{i+1})的边选择的最小割除了它自己以外都不会变
    处理出每条(A)的边所选的最小割,就变成了单点修改全局查询
    然后怎么处理
    枚举(A),每次把(A)连出去的到(B)的所有边的边权加到这个(B)之前的所有边
    即区间加法,因为割的话会割到连到后面的边

    # include <bits/stdc++.h>
    # define RG register
    # define IL inline
    # define Fill(a, b) memset(a, b, sizeof(a))
    using namespace std;
    typedef long long ll;
    const int _(2e5 + 5);
    
    IL int Input(){
    	RG int x = 0, z = 1; RG char c = getchar();
    	for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
    	for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
    	return x * z;
    }
    
    int n, m, q, w1[_], w2[_];
    ll mf[_], mn[_ << 2], tag[_ << 2];
    vector <int> G[_], W[_];
    
    IL void Build1(RG int x, RG int l, RG int r){
    	if(l == r){
    		mn[x] = w2[l];
    		return;
    	}
    	RG int mid = (l + r) >> 1;
    	Build1(x << 1, l, mid), Build1(x << 1 | 1, mid + 1, r);
    	mn[x] = min(mn[x << 1], mn[x << 1 | 1]);
    }
    
    IL void Modify(RG int x, RG int l, RG int r, RG int L, RG int R, RG int v){
    	if(L <= l && R >= r){
    		mn[x] += v, tag[x] += v;
    		return;
    	}
    	RG int mid = (l + r) >> 1;
    	if(L <= mid) Modify(x << 1, l, mid, L, R, v);
    	if(R > mid) Modify(x << 1 | 1, mid + 1, r, L, R, v);
    	mn[x] = min(mn[x << 1], mn[x << 1 | 1]) + tag[x];
    }
    
    IL void Build2(RG int x, RG int l, RG int r){
    	tag[x] = 0;
    	if(l == r){
    		mn[x] = w1[l] + mf[l];
    		return;
    	}
    	RG int mid = (l + r) >> 1;
    	Build2(x << 1, l, mid), Build2(x << 1 | 1, mid + 1, r);
    	mn[x] = min(mn[x << 1], mn[x << 1 | 1]);
    }
    
    int main(RG int argc, RG char *argv[]){
    	n = Input(), m = Input(), q = Input();
    	for(RG int i = 1; i < n; ++i) w1[i] = Input(), w2[i] = Input();
    	for(RG int i = 1; i <= m; ++i){
    		RG int u = Input(), v = Input(), w = Input();
    		G[u].push_back(v), W[u].push_back(w);
    	}
    	Build1(1, 0, n - 1);
    	for(RG int i = 0, l = G[1].size(); i < l; ++i)
    		Modify(1, 0, n - 1, 0, G[1][i] - 1, W[1][i]);
    	for(RG int i = 1; i < n; ++i){
    		mf[i] = mn[1];
    		for(RG int j = 0, l = G[i + 1].size(); j < l; ++j)
    			Modify(1, 0, n - 1, 0, G[i + 1][j] - 1, W[i + 1][j]);
    	}
    	mf[n] = mn[1], Build2(1, 1, n);
    	printf("%lld
    ", mn[1]);
    	for(RG int i = 1; i <= q; ++i){
    		RG int p = Input(), w = Input();
    		Modify(1, 1, n, p, p, w - w1[p]);
    		w1[p] = w;
    		printf("%lld
    ", mn[1]);
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    程序的局部性原理2
    程序的局部性原理
    ROM
    学习Spring Security OAuth认证(一)-授权码模式
    mybatis*中DefaultVFS的logger乱码问题
    maven生命周期绑定要点
    spring security antMatchers相关内容
    JSTL
    什么是CSS hack?
    Java中获得当前静态类的类名
  • 原文地址:https://www.cnblogs.com/cjoieryl/p/8591099.html
Copyright © 2011-2022 走看看