[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 ...
随机推荐
- meterpreter使用
1.基本命令 background:将meterpreter终端隐藏在后台 sessions:查看已经成功获取的会话,想继续与某会话进行交互使用sessions –i quit:直接关闭当前meter ...
- html元素分类
目录 块级元素 内联元素 内联块级元素 总结 一.块级元素(block) 定义:默认情况下,独占一行的元素就是块级元素. 特点: 每个块级元素都从新的一行开始,并且其后的元素也另起一行.(真霸道,一 ...
- 蛮力法解决0_1背包问题新思路-——利用C语言位域类型
废话不说了,直接上代码 #include<stdio.h> #include<math.h> #define N 5 //物品种类数目 #define CAPACITY 6 / ...
- 洛谷P2149 Elaxia的路线
传送门啦 分析: 我最开始想的是跑两遍最短路,然后记录一下最短路走了哪些边(如果有两条最短路就选经过边多的),打上标记.两边之后找两次都标记的边有多少就行了. 但...我并没有实现出来. 最后让我们看 ...
- python版本共存
要玩多版本最好使用虚拟环境,避免根python切换及包误安装的麻烦 1.直接安装实现 1.1 windows下 到官网(https://www.python.org/downloads/)下载,如py ...
- Maven3核心技术(笔记三)
第一节:Maven仓库概念 Maven 远程仓库配置文件:$M2_HOME/lib/maven-model-builder-3.3.3.jar 文件:org\apache\maven\model\po ...
- sql查询与修改数据库逻辑文件名,移动数据库存储路径
USE mydb GO --1.查询当前数据库的逻辑文件名 ) ) AS 'File Name 2'; --或通过以下语句查询: --SELECT name FROM sys.database_fil ...
- (一) solr的安装与配置
载solr文件压缩包,并解压 ,要运行solr服务之前需要先安装jdk,具体安装过程可以参看下面这篇文章: http://www.cnblogs.com/xiazh/archive/2012/05/2 ...
- c++实现二叉树的非递归创建以及非递归先序、中序、后序遍历
二叉树的创建 思路:数组中从上到下依次放着二叉树中的元素,使用递归很容易实现,那么这里使用容器来存放之前的状态实现循环创建二叉树. TreeNode* createTree(int *arr, int ...
- mysql 闪回测试
由于前面出现过几个需求,或者误操作,或者测试,需要我把某张表恢复到操作之前的一个状态,前面在生产中有过几次经历,实在太痛苦了,下面是一张表被误删除了,我的步骤是: 1 用全备恢复整个库(恢复到其他环 ...