博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2018.09.24 codeforces 1053C. Putting Boxes Together(线段树)
阅读量:4652 次
发布时间:2019-06-09

本文共 2201 字,大约阅读时间需要 7 分钟。

就是让你维护动态的区间带权中位数。
然而昨晚比赛时并没有调出来。
想找到带权中位数的中点可以二分(也可以直接在线段树上找)。
也就是二分出第一个断点,使得断点左边的和恰好大于或等于断点右边的和。
现在的问题在于知道断点之后如何统计答案。
我们可以在线段树中维护当前区间全部移到区间最左端点的花费,以及当前区间全部移到区间最右端点的花费。
这样就可以简单合并并轻松统计答案了。
代码:

#include
#define ll long long#define N 200005#define mod 1000000007#define lc (p<<1)#define rc (p<<1|1)#define mid (T[p].l+T[p].r>>1)using namespace std;inline ll read(){
ll ans=0,w=1; char ch=getchar(); while(!isdigit(ch)){
if(ch=='-')w=-1;ch=getchar();} while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar(); return ans*w;}inline void write(ll x){
static int buf[66]; if(!x){
putchar('0');return;} if(x<0)putchar('-'),x=-x; while(x)buf[++buf[0]]=x%10,x/=10; while(buf[0])putchar((buf[buf[0]--])^48);}struct nd{
int l,r,cnt;ll ls,rs,s,sl,sr;}T[N<<2];int n,q;ll a[N],w[N];inline nd operator+(nd a,nd b){
return(nd){
a.l,b.r,a.cnt+b.cnt,a.ls,b.rs,a.s+b.s,(a.sl+b.sl+(b.rs-b.cnt-a.rs)*(a.s%mod)%mod),(a.sr+b.sr+(b.ls-a.ls-a.cnt)*(b.s%mod)%mod)};}inline void newnode(int p,int l,int r){
T[p]=(nd){
l,r,1,a[l],a[l],w[l],0,0};}inline void build(int p,int l,int r){
T[p].l=l,T[p].r=r; if(l==r)return newnode(p,l,r); build(lc,l,mid),build(rc,mid+1,r),T[p]=T[lc]+T[rc];}inline void update(int p,int k){
if(T[p].l==T[p].r)return newnode(p,T[p].l,T[p].r); if(k<=mid)update(lc,k); else update(rc,k); T[p]=T[lc]+T[rc];}inline ll query(int p,int ql,int qr){
if(ql>T[p].r||qr
mid)return query(rc,ql,qr); return query(lc,ql,mid)+query(rc,mid+1,qr);}inline nd ask(int p,int ql,int qr){
if(ql<=T[p].l&&T[p].r<=qr)return T[p]; if(qr<=mid)return ask(lc,ql,qr); if(ql>mid)return ask(rc,ql,qr); return ask(lc,ql,mid)+ask(rc,mid+1,qr);}int main(){
n=read(),q=read(); for(int i=1;i<=n;++i)a[i]=read(); for(int i=1;i<=n;++i)w[i]=read(); build(1,1,n); while(q--){
int x=read(),y=read(); if(x<0)w[-x]=y,update(1,-x); else{
int l=x,r=y,ans=l; while(l<=r){
int midd=l+r>>1; ll L=query(1,x,midd),R=query(1,midd+1,y); if(L>=R)ans=midd,r=midd-1; else l=midd+1; } write((ask(1,x,ans).sl+ask(1,ans,y).sr)%mod),puts(""); } } return 0;}

转载于:https://www.cnblogs.com/ldxcaicai/p/9738219.html

你可能感兴趣的文章
How to correctly use preventDefault(), stopPropagation(), or return false; on events
查看>>
How to: Update an .edmx File when the Database Changes
查看>>
纯CSS3绘制的猫咪老师——献给喜欢CSS3及《夏目友人帐》的你
查看>>
Mysql卸载
查看>>
Android事件分发机制
查看>>
linux之sleep
查看>>
JQuery绑定和注销事件
查看>>
搜索引擎易用性
查看>>
git的使用
查看>>
android手机截屏
查看>>
JAVA设计模式之观察者模式
查看>>
MySQL的循环语句使用总结
查看>>
align-conten和align-items之间的区别
查看>>
Java
查看>>
防止SQL注入的登录页面
查看>>
生成和解析txt文件
查看>>
stm32F429启动时钟配置
查看>>
正则表达式移除首部尾部多余字符
查看>>
iOS截取视频缩略图的两种方法
查看>>
柯里化函数之Javascript
查看>>