将选取的$A$看成左括号,$B$看成右括号,那么答案是一个合法的括号序列。

那么只要重复取出$k$对价值最小的左右括号,保证每时每刻都是一个合法的括号序列即可。

将$($看成$1$,$)$看成$-1$,设$s[]$为前缀和。

如果当前取出的是$()$,那么对前缀和的影响为$[A,B-1]$区间加$1$。

如果当前取出的是$)($,那么对前缀和的影响为$[B,A-1]$区间减$1$,所以这种情况需要满足区间$s$的最小值不为$0$。

考虑用线段树维护这个序列,线段树上每个节点维护以下信息:

va:$A\leq B$情况的最优解。

vb:$A>B$情况的最优解,且满足$[A,B-1]$的区间$s$最小值大于当前区间的$s$最小值。

vc:$A>B$情况的最优解。

aa:区间内代价最小的$A$。

ab:区间内代价最小的$B$。

ba:区间内代价最小的$A$,满足$[st,A-1]$的区间$s$最小值大于区间$s$最小值。

bb:区间内代价最小的$B$,满足$[B,en]$的区间$s$最小值大于区间$s$最小值。

vm:区间$s$最小值。

tag:区间增量标记。

为了方便维护,可以考虑增加第$0$项,$A[0]=B[0]=inf$。

那么$[0,n]$区间的$vb$必定满足区间最小值不为$0$,然后贪心选取$k$次即可求出最优解。

时间复杂度$O(k\log n)$。

#include<cstdio>
const int N=500010,M=1050000,inf=1000000010;
long long ans;
int n,k,i,j,A[N],B[N],aa[M],ab[M],ba[M],bb[M],vm[M],tag[M];
struct P{int x,y;P(){}P(int _x,int _y){x=_x,y=_y;}P operator+(const P&b){return A[x]+B[y]<A[b.x]+B[b.y]?*this:b;}
}va[M],vb[M],vc[M],t;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void add1(int x,int p){vm[x]+=p;tag[x]+=p;}
inline void pb(int x){if(tag[x])add1(x<<1,tag[x]),add1(x<<1|1,tag[x]),tag[x]=0;}
inline void up(int x){int l=x<<1,r=l|1;va[x]=va[l]+va[r]+P(aa[l],ab[r]);vc[x]=vc[l]+vc[r]+P(aa[r],ab[l]);vb[x]=vb[l]+vb[r];aa[x]=A[aa[l]]<A[aa[r]]?aa[l]:aa[r];ab[x]=B[ab[l]]<B[ab[r]]?ab[l]:ab[r];if(vm[l]<vm[r]){vb[x]=vb[x]+vc[r]+P(aa[r],bb[l]);ba[x]=ba[l];bb[x]=B[ab[r]]<B[bb[l]]?ab[r]:bb[l];vm[x]=vm[l];}if(vm[l]>vm[r]){vb[x]=vb[x]+vc[l]+P(ba[r],ab[l]);ba[x]=A[aa[l]]<A[ba[r]]?aa[l]:ba[r];bb[x]=bb[r];vm[x]=vm[r];}if(vm[l]==vm[r]){vb[x]=vb[x]+P(ba[r],bb[l]);ba[x]=ba[l];bb[x]=bb[r];vm[x]=vm[l];}
}
void build(int x,int a,int b){if(a==b){va[x]=vc[x]=P(a,a),vb[x]=P(0,0);aa[x]=ab[x]=ba[x]=a;return;}int mid=(a+b)>>1;build(x<<1,a,mid),build(x<<1|1,mid+1,b),up(x);
}
void add(int x,int a,int b,int c,int d,int p){if(c<=a&&b<=d){add1(x,p);return;}pb(x);int mid=(a+b)>>1;if(c<=mid)add(x<<1,a,mid,c,d,p);if(d>mid)add(x<<1|1,mid+1,b,c,d,p);up(x);
}
void change(int x,int a,int b,int c){if(a==b)return;pb(x);int mid=(a+b)>>1;if(c<=mid)change(x<<1,a,mid,c);else change(x<<1|1,mid+1,b,c);up(x);
}
int main(){read(n),read(k);for(i=1;i<=n;i++)read(A[i]);for(i=1;i<=n;i++)read(B[i]);A[0]=B[0]=inf;build(1,0,n);while(k--){t=va[1]+vb[1],i=t.x,j=t.y,ans+=A[i]+B[j];if(i<j)add(1,0,n,i,j-1,1);if(i>j)add(1,0,n,j,i-1,-1);A[i]=inf,change(1,0,n,i);B[j]=inf,change(1,0,n,j);}return printf("%lld",ans),0;
}

  

BZOJ3838 : [Pa2013]Raper相关推荐

  1. bzoj 3838: [Pa2013]Raper (线段树)

    3838: [Pa2013]Raper Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 53  Solved: 27 [Submit][Status] ...

  2. luogu P4694 [PA2013]Raper

    https://www.luogu.com.cn/problem/P4694 首先可以用wqswqswqs二分去掉KKK的那个限制 然后可以发现剩下的就是一个模拟费用流了 code: #include ...

  3. 常测长策(20180222~)

    已经很久没有写过测试总结了,主要是2月22日的测试题很有意思-- 20180222 戊戌年正月初七 THU YYR S2 这套题目,嗯-- T1是一道很好的DP.需要充分了解凸包的构建过程.仔细一番考 ...

  4. 【BZOJ3837】[Pa2013]Filary 随机化神题

    [BZOJ3837][Pa2013]Filary Description 给定n个正整数,从中挑出k个数,满足:存在某一个m(m>=2),使得这k个数模m的余数相等. 求出k的最大值,并求出此时 ...

  5. LBS学习相关网址(Jonathan Raper教授整理)

    基于位置的服务(Location Based Service,LBS),它是通过电信移动运营商的无线电通讯网络(如GSM网.CDMA网)或外部定位方式(如GPS)获取移动终端用户的位置信息(地理坐标, ...

  6. BZOJ3837: [Pa2013]Filary

    当m=2时,k至少为n/2 所以序列中的每一个位置都有至少1/2的概率在k个数中 随机一个序列的位置i,计算i在k个数中时,k的最大值 计算其他n-1个数和a[i]的差b[j],另外k-1个数的b[j ...

  7. bzoj 3837 pa2013 Filary

    bzoj 先搞第一问.考虑简单情况,如果\(m=2\),那么一定有个剩余类大小\(\ge \lceil\frac{n}{2}\rceil\),同时这也是答案下界 然后我们每次随机选出一个数\(a_i\ ...

  8. [BZOJ3837][Pa2013][随机][乱搞]Filary

    然而我太懒了--没有打哈希. 直觉告诉我第二个答案是选择的k个数的差的gcd,那么对于每一个质因数,记录一下序列中能被这个质数整除的差的gcd,然后就可以了 #include <cstdio&g ...

  9. 【PA2013】【BZOJ3837】Filary

    Description 给定n个正整数,从中挑出k个数,满足:存在某一个m(m>=2),使得这k个数模m的余数相等. 求出k的最大值,并求出此时的m.如果有多组解使得k最大,你要在此基础上求出m ...

最新文章

  1. Windows XP SP3远程桌面连接支持网络级身份验证配置
  2. 等待Ajax结果 再提交表单(ajax同步)
  3. ruby + phantomjs 自动化测试 - GA
  4. 计算机考试word教程,职称计算机考试Word教程:段落格式的编辑
  5. 成都东万计算机学校,东兴区东方科技职业技术学校
  6. 关于程序员的脑筋急转弯(附答案)
  7. 解决 Azure AD 在 Azure Front Door 下登录失败的问题
  8. mysql数据压缩存储_压缩文本,然后存储在mysql数据库中
  9. 论文浅尝 | 基于知识库的神经网络问题生成方法
  10. 用友CDM系统,将货位间商品移库单(一步)修改为内调出入库单(一步)方法使用...
  11. OpenCV-图像处理(06、调整图像亮度与对比度)
  12. 兄弟j220怎么清零_BROTHER 兄弟一体机 复位清除计数器
  13. 创建一个带目录的Word模板
  14. 用Photoshop进行icon的制作或将其它格式图片转成icon
  15. cubic算法优化_安卓cpu优化 tcp拥塞算法cubic和reno怎么选择
  16. R语言运行环境安装配置
  17. 虚拟现实制陶制作方法对中学生创造力和学习参与度的影响
  18. ARM交叉编译工具链分类说明
  19. 奥格斯堡大学计算机系,奥格斯堡大学
  20. mysql中如何求出学生人数,mysql中如何查询同时参加计算机考试和英语考试的学生人数...

热门文章

  1. 为什么VDI(桌面虚拟化)对于硬核UNIX/Linux工程应用程序是有意义的?
  2. Riedel 水晶杯:葡萄酒终极发烧设备
  3. 二代测序原理(Illumina)
  4. java 字符串很长_String:java:常量字符串过长
  5. flask之修改蓝图的template_folder参数,模板路径的查找处理:
  6. java根据经纬度转地址或者根据地址转经纬度
  7. Docker 配置 国内 阿里云、网易云 镜像加速!
  8. 小想法 | 开源一个自己的Python小项目「Park at ease」停车场管理系统
  9. mysql sus bench_susbench性能测试工具
  10. 线性回归分析——高尔顿数据集更正版