题意:

费用流,其实bushi

给你长为\(n\)的序列\(a\),\(b\)。\(a\)单增,\(b\)有正有负。

\(q\)次询问\([l,r]\),保证\(\sum\limits_{i=l}^rb_i=0\),将区间\([l,r]\)中每个值当节点,\(b_i<0\)的连S,\(b_i>0\)的连T,容量为\(abs(b_i)\)。两两点连边,容量为inf,费用为\(abs(a_i-a_j)\)。问最小费用最大流。

思路:

显然有一个感性的贪心思路:每次尽量会去抵消前面最近的需要抵消的流量,抵消后自己剩余的留量就留给后面抵消。这样就可以从前枚举\(l~r\),考虑每个点贡献对前面流单位流量贡献\(a_i\),后面\(-a_i\)

关键是前后分别流多少?

令\(s_i\)为\(b_i\)求前缀和。

  • \(b_i<0\)时

    1.\(s_{i-1}-s_{l-1}<=0\) 即 \(s_{l-1}>=s_{i-1}\) :全部贡献给后面,贡献\(-a_i*b_i\)

    2.\(0<s_{i-1}-s_{l-1}<-b_i\) 即 \(s_i<s_{l-1}<s_{i-1}\) :\((s_{i-1}+s_i-2*s_{l-1})*a_i\)

    3.\(s_{i-1}-s_{l-1}>=-b_i\) 即 \(s_{l-1}<=s_{i}\) \(a_i*b_i\)
  • \(b_i>0\)时

    第一、三种情况和前面是一样的,第二种情况变号……

发现询问跟\(i\)和\(s_{l}\)有关,如果用主席树处理好了每个\(i\)的贡献,记录一个版本,具体修改三次区间修改即可,操作2要维护两个值(关于/不关于\(s_{l-1}\))。这样询问,直接\(rt_{l-1}\)到\(rt_r\)版本差分单点查询。

ps.不建议写,非常卡空间,官方有更好写的树状数组写法,也可以离线线段树,当然我是为了练主席树。

code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
const int M=1e7+5e6;
const int mod=1e9+7;
int m,n,rt[N],q;
ll sum[N],s[N],a[N],b[N],val[N];
struct segment {
int nd,p,q,ls[M],rs[M],va[M],vab[M];
ll w1,w2,part;
void Update(int &x,int l,int r,int lst) {
if(x<=part){x=++nd;if(lst){ls[x]=ls[lst],rs[x]=rs[lst];va[x]=va[lst],vab[x]=vab[lst];}}
if(p<=l&&r<=q) {if(w1)va[x]=(va[x]+w1)%mod;vab[x]=(vab[x]+w2)%mod;return;}
int mid=(l+r)>>1;
if(p<=mid)Update(ls[x],l,mid,ls[lst]);
if(q>mid)Update(rs[x],mid+1,r,rs[lst]);
}
void Query(int x,int y,int l,int r) {
// printf("!x=%d y=%d [%d,%d] w1=%lld w2=%lld\n",x,y,l,r,va[y]-va[x],vab[y]-vab[x]);
w1=(w1+va[y]-va[x])%mod;w2=(w2+vab[y]-vab[x])%mod;
if(l==r) {return;}
int mid=(l+r)>>1;
(p<=mid)?Query(ls[x],ls[y],l,mid):Query(rs[x],rs[y],mid+1,r);
}
void init() {
for(int i=1;i<=n;i++) {
part=nd;
// printf("i=%d ~~~\n",i);
int opt=(b[i]<0)?-1:1,l,r;
if(opt<0) {l=s[i],r=s[i-1];}
else {l=s[i-1],r=s[i];}
w1=-a[i]*b[i]%mod,w2=0,p=0,q=l,Update(rt[i],1,m,rt[i-1]);
w1=a[i]*b[i]%mod,w2=0,p=r,q=m,Update(rt[i],1,m,rt[i-1]);
if(r-l<=1)continue;
w1=-opt*(sum[i-1]+sum[i])*a[i]%mod,w2=2*opt*a[i]%mod,p=l+1,q=r-1,Update(rt[i],1,m,rt[i-1]);
}
}
}S;
void in_puts() {
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++) {scanf("%lld",&a[i]);}
for(int i=1;i<=n;i++) {scanf("%lld",&b[i]);s[i]=sum[i]=val[i]=s[i-1]+b[i];sum[i]%=mod;}
sort(val,val+1+n);
m=unique(val,val+1+n)-val;
for(int i=0;i<=n;i++) {s[i]=lower_bound(val,val+m,s[i])-val+1;}
}
int main() {
in_puts();
S.init();
for(int i=1;i<=q;i++) {
int l,r;scanf("%d%d",&l,&r);
S.w1=S.w2=0,S.p=s[l-1];S.Query(rt[l-1],rt[r],1,m);
ll ans=S.w2*sum[l-1]+S.w1;
printf("%lld\n",(ans%mod+mod)%mod);
}
return 0;
}

CF1682F MCMF?的更多相关文章

  1. UVa(1658),Admiral,海军上将,拆点,MCMF

    题目链接:https://uva.onlinejudge.org/external/16/1658.pdf 题意:求1到N的两条路(不能相交),距离和最小. 分析: 第一次做拆点,有点意思.刚开始一直 ...

  2. UVa(12821),MCMF

    题目链接:https://uva.onlinejudge.org/external/128/12821.pdf 比赛的时候,准备用最短路来做,存两张图,做两次最短路,本来还觉得第二张图的设计很好的,很 ...

  3. Poj(2135),MCMF,模板

    题目链接:http://poj.org/problem?id=2135 Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  4. bzoj 1061 [Noi2008]志愿者招募(数学模型,MCMF)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1061 [题意] 雇人满足每天至少需要的人数. [思路一] Byvoid的题解 clic ...

  5. bzoj 3171 [Tjoi2013]循环格(MCMF)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3171 [题意] 给定一个方向矩阵,要求改变最少的格子,使得任意一个点都在一个环中. [ ...

  6. bzoj 1834 [ZJOI2010]network 网络扩容(MCMF)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1834 [题意] 给定一个有向图,每条边有容量C,扩容费用W,问最大流和使容量增加K的最 ...

  7. 最小费用最大流MCMF zkw费用流

    稀疏图慢死了...但是稠密图效果还是很好的 struct MCMF{ struct tedge{int x,y,cap,w,next;}adj[maxm];int ms,fch[maxn]; int ...

  8. 最小费用最大流MCMF 最小增广

    没有写单纯性的...应该不会有卡最小增广的出题人吧...(雾) struct MCMF{ struct tedge{int x,y,cap,flow,w,next;}adj[maxm];int ms, ...

  9. Intervals POJ - 3680 (MCMF)

    给你一些区间,每个区间都有些价值.取一个区间就能获得对应的价值,并且一个点不能覆盖超过k次,问你最大的价值是多少. 我们可以把这些区间放到一维的轴上去,然后我们可以把它看成一个需要从左到右的过程,然后 ...

随机推荐

  1. hive从入门到放弃(四)——分区与分桶

    今天讲讲分区表和分桶表,前面的文章还没看的可以点击链接: hive从入门到放弃(一)--初识hive hive从入门到放弃(二)--DDL数据定义 hive从入门到放弃(三)--DML数据操作 分区 ...

  2. EF框架基础

    ORM概述: ORM全称是"对象 - 关系映射" . ORM是将关系数据库中的数据用对象的形式表现出来,并通过面向对象的方式将这些对象组织起来,实现系统业务逻辑的过程. Entit ...

  3. ssm项目框架搭建(增删改查案例实现)——(SpringMVC+Spring+mybatis项目整合)

    Spring 常用注解 内容 一.基本概念 1. Spring 2. SpringMVC 3. MyBatis 二.开发环境搭建 1. 创建 maven 项目 2. SSM整合 2.1 项目结构图 2 ...

  4. kafka生产者调优手册

    目录 第一章 kafka硬件配置选择 1.1 场景说明 1.2 服务器台数选择 1.3 磁盘选择 1.4 内存选择(堆内存,页缓存) 1.4.1 堆内存配置 1.4.2 页缓存选择 1.5 cpu选择 ...

  5. A. And Matching

    分析题目:这道题的题目是说给定一个2的幂次n,然后要求我们从0~n-1这n个数中不重复的挑选两个进行配对,要求配对后的每一对按位与之和为k: 而且k的话还是从0~n-1都有的: 既然题目都这样说了,那 ...

  6. HCIE笔记-第一节-网络的基本概念

    R&S= 路由交换 Datacom =数通 =数据通信 某个设备产生了数据之后,借助整体的网络到达目的地的过程. 网络历史 -- 数通为什么产生? 1946年:世界上第一台计算机诞生.军事 科 ...

  7. JavaScript学习高级2

    ## DOM:     * 概念: Document Object Model 文档对象模型         * 将标记语言文档的各个组成部分,封装为对象.可以使用这些对象,对标记语言文档进行CRUD ...

  8. 反射解决微信开发加解密illegal key size,不需要修改JDK jar包

    在微信开发时,消息接口时,涉及到消息加密,抛出了 java.security.InvalidKeyException: Illegal key size 的异常,异常堆栈如下: 按照网上的解决方案,都 ...

  9. 比 Navicat 还要好用、功能更强大的工具!

    DBeaver 是一个基于 Java 开发,免费开源的通用数据库管理和开发工具,使用非常友好的 ASL 协议.可以通过官方网站或者 Github 进行下载. 由于 DBeaver 基于 Java 开发 ...

  10. HMS Core 6.4.0版本发布公告

    支持转化事件回传至华为应用市场商业推广,便捷归因,实时调优: 卸载分析新增卸载前路径分析,深度剖析卸载根因. 查看详情 新增关键帧能力,通过关键帧点可实现图片.文字等位置移动.旋转等动态效果,比如文字 ...