[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 ...
随机推荐
- Computer Vision Resources
Computer Vision Resources Softwares Topic Resources References Feature Extraction SIFT [1] [Demo pro ...
- 【codeforces】【比赛题解】#855 Codefest 17
神秘比赛,以<哈利波特>为主题……有点难. C题我熬夜切终于是写出来了,可惜比赛结束了,气啊. 比赛链接:点我. [A]汤姆·里德尔的日记 题意: 哈利波特正在摧毁神秘人的分灵体(魂器). ...
- 23 The Laws of Reflection 反射定律:反射包的基本原理
The Laws of Reflection 反射定律:反射包的基本原理 6 September 2011 Introduction 介绍 Reflection in computing is th ...
- mac下PHPStorm2018.2破解教程
1.首先安装phpstorm 2.下载JetbrainsCrack-3.1-release-enc.jar然后把这个文件放入安装phpstorm/contents/lib目录下 3.用文本编辑器打开p ...
- python网络编程--线程event
一:线程event作用 Python提供了Event对象用于线程间通信,它是线程设置的信号标志,如果信号标志位真,则其他线程等待直到信号结束. Event对象实现了简单的线程通信机制,它提供了设置信号 ...
- PlantUML——4.实例演示1
给自己发消息 @startuml Alice -> Alice : This is a signal to self.\nIt also demonstrates \nmultiline tex ...
- table中的td等长(不随内容大小变化)
使用的table时候发现td的长度是随着内容的大小而变化的,但是有的时候我们不希望这样.想要td等长可以在 tbale中加上 style=“table-layout:fixed” ...
- PHP实现菜单无限极分类
菜单数据 这里我们的菜单数据是临时数据, 没有从数据库中查询处理,数据基本和数据库中的的相似. 数据如下: $items = array( 1 => array('id' => 1, 'p ...
- virtualenv,virtualenvwrapper安装及使用
1.安装 # 安装: (sudo) pip install virtualenv virtualenvwrapper # centos7下 pip install virtualenv virtual ...
- (二)Mybatis项目配置
第一节:environments Mybatis支持多个环境,可以任意配置 <environments default="development"> <envir ...