BZOJ3838 : [Pa2013]Raper
将选取的$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相关推荐
- bzoj 3838: [Pa2013]Raper (线段树)
3838: [Pa2013]Raper Time Limit: 60 Sec Memory Limit: 128 MB Submit: 53 Solved: 27 [Submit][Status] ...
- luogu P4694 [PA2013]Raper
https://www.luogu.com.cn/problem/P4694 首先可以用wqswqswqs二分去掉KKK的那个限制 然后可以发现剩下的就是一个模拟费用流了 code: #include ...
- 常测长策(20180222~)
已经很久没有写过测试总结了,主要是2月22日的测试题很有意思-- 20180222 戊戌年正月初七 THU YYR S2 这套题目,嗯-- T1是一道很好的DP.需要充分了解凸包的构建过程.仔细一番考 ...
- 【BZOJ3837】[Pa2013]Filary 随机化神题
[BZOJ3837][Pa2013]Filary Description 给定n个正整数,从中挑出k个数,满足:存在某一个m(m>=2),使得这k个数模m的余数相等. 求出k的最大值,并求出此时 ...
- LBS学习相关网址(Jonathan Raper教授整理)
基于位置的服务(Location Based Service,LBS),它是通过电信移动运营商的无线电通讯网络(如GSM网.CDMA网)或外部定位方式(如GPS)获取移动终端用户的位置信息(地理坐标, ...
- 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 ...
- bzoj 3837 pa2013 Filary
bzoj 先搞第一问.考虑简单情况,如果\(m=2\),那么一定有个剩余类大小\(\ge \lceil\frac{n}{2}\rceil\),同时这也是答案下界 然后我们每次随机选出一个数\(a_i\ ...
- [BZOJ3837][Pa2013][随机][乱搞]Filary
然而我太懒了--没有打哈希. 直觉告诉我第二个答案是选择的k个数的差的gcd,那么对于每一个质因数,记录一下序列中能被这个质数整除的差的gcd,然后就可以了 #include <cstdio&g ...
- 【PA2013】【BZOJ3837】Filary
Description 给定n个正整数,从中挑出k个数,满足:存在某一个m(m>=2),使得这k个数模m的余数相等. 求出k的最大值,并求出此时的m.如果有多组解使得k最大,你要在此基础上求出m ...
最新文章
- Windows XP SP3远程桌面连接支持网络级身份验证配置
- 等待Ajax结果 再提交表单(ajax同步)
- ruby + phantomjs 自动化测试 - GA
- 计算机考试word教程,职称计算机考试Word教程:段落格式的编辑
- 成都东万计算机学校,东兴区东方科技职业技术学校
- 关于程序员的脑筋急转弯(附答案)
- 解决 Azure AD 在 Azure Front Door 下登录失败的问题
- mysql数据压缩存储_压缩文本,然后存储在mysql数据库中
- 论文浅尝 | 基于知识库的神经网络问题生成方法
- 用友CDM系统,将货位间商品移库单(一步)修改为内调出入库单(一步)方法使用...
- OpenCV-图像处理(06、调整图像亮度与对比度)
- 兄弟j220怎么清零_BROTHER 兄弟一体机 复位清除计数器
- 创建一个带目录的Word模板
- 用Photoshop进行icon的制作或将其它格式图片转成icon
- cubic算法优化_安卓cpu优化 tcp拥塞算法cubic和reno怎么选择
- R语言运行环境安装配置
- 虚拟现实制陶制作方法对中学生创造力和学习参与度的影响
- ARM交叉编译工具链分类说明
- 奥格斯堡大学计算机系,奥格斯堡大学
- mysql中如何求出学生人数,mysql中如何查询同时参加计算机考试和英语考试的学生人数...
热门文章
- 为什么VDI(桌面虚拟化)对于硬核UNIX/Linux工程应用程序是有意义的?
- Riedel 水晶杯:葡萄酒终极发烧设备
- 二代测序原理(Illumina)
- java 字符串很长_String:java:常量字符串过长
- flask之修改蓝图的template_folder参数,模板路径的查找处理:
- java根据经纬度转地址或者根据地址转经纬度
- Docker 配置 国内 阿里云、网易云 镜像加速!
- 小想法 | 开源一个自己的Python小项目「Park at ease」停车场管理系统
- mysql sus bench_susbench性能测试工具
- 线性回归分析——高尔顿数据集更正版