http://codeforces.com/blog/entry/62013

两个结论:

1.一定有一个箱子不用动。

2.不动的箱子一定是加权前缀和为S/2的那个。

1显然,2由1易得。

于是问题变为:求一段区间前缀和>S/2的第一个数的位置。显然先求出S/2,再线段树上二分即可,实现过程见代码。

自定义struct比stl:pair快,注意取模和爆long long的问题。

 #include<cstdio>
#include<algorithm>
#define ls (x<<1)
#define rs (ls|1)
#define lson ls,L,mid
#define rson rs,mid+1,R
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; const int N=,inf=1e9,mod=1e9+;
int n,Q,x,y,a[N],w[N];
struct Tr{ ll s1,s2; }v[N<<];
struct P{ ll x,y; }; void upd(int x){ v[x].s1=v[ls].s1+v[rs].s1; v[x].s2=(v[ls].s2+v[rs].s2)%mod; } void build(int x,int L,int R){
if (L==R){ v[x].s1=w[L]; v[x].s2=1ll*a[L]*w[L]%mod; return; }
int mid=(L+R)>>;
build(lson); build(rson); upd(x);
} void mdf(int x,int L,int R,int pos,int k){
if (L==R){ v[x].s1=k; v[x].s2=1ll*a[pos]*k%mod; return; }
int mid=(L+R)>>;
if (pos<=mid) mdf(lson,pos,k); else mdf(rson,pos,k);
upd(x);
} P que(int x,int L,int R,int l,int r){
if (L==l && r==R) return (P){v[x].s1,v[x].s2};
int mid=(L+R)>>;
if (r<=mid) return que(lson,l,r);
else if (l>mid) return que(rson,l,r);
else{
P s1=que(lson,l,mid),s2=que(rson,mid+,r);
return (P){s1.x+s2.x,(s1.y+s2.y)%mod};
}
} P ask(int x,int L,int R,int l,int r,ll k){
if (L==l && r==R){
if (v[x].s1<=k) return (P){inf,v[x].s1};
if (L==R) return (P){l,};
}
int mid=(L+R)>>;
if (r<=mid) return ask(lson,l,r,k);
else if (l>mid) return ask(rson,l,r,k);
else{
ll sm=,res=inf;
P cur=ask(lson,l,mid,k);
res=min(res,cur.x); sm+=cur.y;
if (res<inf) return (P){res,sm};
cur=ask(rson,mid+,r,k-sm);
res=min(res,cur.x); sm+=cur.y;
return (P){res,sm};
}
} int work(int l,int r){
int k=ask(,,n,l,r,que(,,n,l,r).x/).x;
P t1=(k==l) ? (P){,} : que(,,n,l,k-),t2=que(,,n,k,r);
return ((a[k]*(t1.x%mod)-t1.y+t2.y-a[k]*(t2.x%mod))%mod+mod)%mod;
} int main(){
freopen("1058f.in","r",stdin);
freopen("1058f.out","w",stdout);
scanf("%d%d",&n,&Q);
rep(i,,n) scanf("%d",&a[i]),a[i]=a[i]-i;
rep(i,,n) scanf("%d",&w[i]);
build(,,n);
while (Q--){
scanf("%d%d",&x,&y);
if (x<) mdf(,,n,-x,y); else printf("%d\n",work(x,y));
}
return ;
}

最新文章

  1. Jetson ARM SeetaFace编译
  2. net命令
  3. use IFS in bash
  4. Posix线程编程指南(1) 线程创建与取消
  5. HTML+CSS学习笔记(5)- 与浏览者交互,表单标签
  6. L005-oldboy-mysql-dba-lesson05
  7. webkit中DOM 事件有多少
  8. struts2 package元素
  9. LoadRuner性能测试之内存分析方法及步骤(Windows)
  10. WEB-INF文件夹的位置和作用
  11. Uncle Tom&#39;s Inherited Land*
  12. Servlet-获取页面的元素的值的方式以及区别
  13. Inside JVM 内存模型
  14. hdu6330 多校3 L 画一个cube
  15. abap函数返回结构体类型
  16. 2017-2018 ACM-ICPC, NEERC, Northern Subregional ContestG - Grand Test
  17. 微信OAuth2.0网页授权接口
  18. ASP.NET MVC学习(四)之视图View
  19. 几个经典的数学库之一学习---VCGlib(3)
  20. selenium3.0 远程模式

热门文章

  1. 配置多个ssh-key
  2. UNIX环境高级编程 第16章 网络IPC:套接字
  3. Multiple HTTPS Bindings IIS 7 Using appcmd
  4. linux 配置免密码登陆
  5. C# 各种类型的转换
  6. 数据科学实战手册(R+Python)书中引用资料网址
  7. Python基础三(选择,循环)
  8. plsql中做计划任务
  9. linux c获取本地时间
  10. svn错误 svnserve.conf:12: Option expected解决办法