[CF1053C]Putting Boxes Together(线段树)
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 ;
- }
[CF1053C]Putting Boxes Together(线段树)的更多相关文章
- 洛谷CF1030F Putting Boxes Together(树状数组)
题意: 现在有n个物品,第i个物品他的位置在a[i],他的重量为w[i].每一个物品移动一步的代价为他的w[i].目前有2种操作: 1. x y 将第x的物品的重量改为y 2.l r 将编号在 [ l ...
- C. Okabe and Boxes 思维 模拟 or 线段树
C. Okabe and Boxes 这个题目是一个有点思维的模拟,当时没有想到, 思维就是这个栈的排序这里,因为每次直接排序肯定会t的,所以不可以这么写,那怎么表示排序呢? 就是直接把栈清空,如果栈 ...
- CodeForces 1058 F Putting Boxes Together 树状数组,带权中位数
Putting Boxes Together 题意: 现在有n个物品,第i个物品他的位置在a[i],他的重量为w[i].每一个物品移动一步的代价为他的w[i].目前有2种操作: 1. x y 将第x的 ...
- Codeforces 834D The Bakery【dp+线段树维护+lazy】
D. The Bakery time limit per test:2.5 seconds memory limit per test:256 megabytes input:standard inp ...
- Codeforces 626G Raffles(贪心+线段树)
G. Raffles time limit per test:5 seconds memory limit per test:256 megabytes input:standard input ou ...
- Codeforces 834D The Bakery - 动态规划 - 线段树
Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought required ingredient ...
- Codeforces 1053 C - Putting Boxes Together
C - Putting Boxes Together 思路: 求带权中位数 用树状数组维护修改 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) ...
- Codeforces Round #426 (Div. 1) B The Bakery (线段树+dp)
B. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...
- Codeforces Round #426 (Div. 2) D 线段树优化dp
D. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...
随机推荐
- git本地分支和远程分支改名
#1 将本地分支进行改名 git branch -m old_branch new_branch #2 将远程分支的老分支删除 git push origin :old_branch #3 将改名后的 ...
- 洛谷P3385负环
传送门 #include <iostream> #include <cstdio> #include <cstring> #include <algorith ...
- grail开发环境的搭建
本文参考:Grails入门指南(第二版) 1. 下载jdk和Grail http://www.oracle.com/technetwork/java/javase/downloads/ http:// ...
- django 建立一个简单的应用
本人的用的版本是python 2.7.3和django 1.10.5,Windows10系统 1.首先通过命令建立项目和app 找到django的安装路径,我的路径是:C:\Python27\Lib\ ...
- hdu 5112 (2014北京现场赛 A题)
给出某个时刻对应的速度 求出相邻时刻的平均速度 输出最大值 Sample Input23 // n2 2 //t v1 13 430 31 52 0 Sample OutputCase #1: 2.0 ...
- Spark(八)JVM调优以及GC垃圾收集器
一JVM结构 1 Java内存结构 JVM内存结构主要有三大块:堆内存.方法区和栈. 堆内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden空间.From Survivo ...
- day7 面向对象进阶
面向对象高级语法部分 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例 ...
- bash101总结
看了 bash101 ,做的一些总结吧,都是些常见用法,易错 1. 有空格会显示多行 2.contine 书里太细了,有空补起来
- js获取iframe的id
有一个需求是在iframe页面调用父页面一个方法,开始我用window.parent.length来判断页面有几个层,但是不好用,因为我的浏览器安装了一个插件,这个插件会动态向页面插入一个iframe ...
- RabbitMQ 相关理论部分
集群配置方式 RabbitMQ可以通过三种方法来部署分布式集群系统,分别是:cluster,federation,shovel cluster: 不支持跨网段,用于同一个网段内的局域网 可以随意的动态 ...