CodeForces 1058 F Putting Boxes Together 树状数组,带权中位数
题意:
现在有n个物品,第i个物品他的位置在a[i],他的重量为w[i]。每一个物品移动一步的代价为他的w[i]。目前有2种操作:
1. x y 将第x的物品的重量改为y
2.l r 将编号在 [ l, r ]之间的所有物品移动到一起,求最小的花费是多少。
如果移动一个物品移动一步的代价是1的话,对于[1,n]来说,那么中间位置就是 a[(1+n)/2]. 也就是最中间的那个物品的位置。
现在移动一步他的代价是w[i],那么中间位置就是 sum(1,k) >= sum(k+1,n) 在满足前面的条件下,k最小。
我们可以用2分跑出最小的k,这样我们就确定了位置。
接来下我们的问题就是如何移动物品了。
我们可以把所有的物品移动到区间[1,n]上,记录下花费。
然后在把这一整段的物品整体移动到对应区间就好了。
注意的就是对于中间点来说,整体区间移动的正负是不一样的。
代码:
#include<bits/stdc++.h>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lch(x) tr[x].son[0]
#define rch(x) tr[x].son[1]
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
typedef pair<int,int> pll;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const LL mod = (int)1e9+;
const int N = 2e5 + ;
LL tree1[N], tree2[N];
int n, q;
int a[N], w[N];
inline int lowbit(int x){
return x & (-x);
}
void add1(int x, LL v){
for(int i = x; i <= n; i+=lowbit(i))
tree1[i] += v;
}
void add2(int x, LL v){
for(int i = x; i <= n; i+=lowbit(i))
tree2[i] += v;
}
LL query1(int x){
LL ret = ;
for(int i = x; i; i -= lowbit(i))
ret += tree1[i];
return ret;
}
LL query2(int x){
LL ret = ;
for(int i = x; i; i -= lowbit(i))
ret += tree2[i];
return ret % mod;
}
LL sum1(int l, int r){
if(l > r) return ;
return query1(r) - query1(l-);
}
LL sum2(int l, int r){
if(l > r) return ;
return query2(r) - query2(l-);
}
int GG(int l, int r){
if(l == r) return ;
int ll = l, rr = r, mm;
LL tot = sum1(l, r), t1 , t2;
while(ll <= rr){
mm = ll + rr >> ;
t1 = sum1(l, mm);
t2 = tot - t1;
if(t1 < t2) ll = mm + ;
else rr = mm - ;
}
LL ret = ;
ret -= sum2(l,ll-);
ret += ((sum1(l,ll-)%mod) * (a[ll]--(ll-)))%mod;
ret += sum2(ll+,r);
ret -= ((sum1(ll+,r)%mod) * (a[ll]+ -(ll+)))%mod;
return (ret%mod + mod) % mod;
}
int main(){
scanf("%d%d", &n, &q);
for(int i = ; i <= n; i++) scanf("%d", &a[i]);
for(int i = ; i <= n; i++){
scanf("%d", &w[i]);
add1(i, w[i]);
LL v = ((1ll*a[i]-i)*w[i])%mod;
add2(i, v);
}
int l, r;
for(int i = ; i <= q; i++){
scanf("%d%d", &l, &r);
if(l < ){
l = -l;
add1(l, r-w[l]);
LL v = (((1ll*a[l]-l)*r)%mod)-((1ll*a[l]-l)*w[l])%mod;
add2(l, v);
w[l] = r;
}
else printf("%d\n", GG(l,r));
}
return ;
}
CodeForces 1058 F Putting Boxes Together 树状数组,带权中位数的更多相关文章
- Codeforces 1053C Putting Boxes Together 树状数组
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1053C.html 题目传送门 - CF1053C 题意 有 $n$ 个物品,第 $i$ 个物品在位置 $a ...
- CF1093E Intersection of Permutations 树状数组套权值线段树
\(\color{#0066ff}{ 题目描述 }\) 给定整数 \(n\) 和两个 \(1,\dots,n\) 的排列 \(a,b\). \(m\) 个操作,操作有两种: \(1\ l_a\ r_a ...
- BZOJ2141排队——树状数组套权值线段树(带修改的主席树)
题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别 ...
- luogu3380/bzoj3196 二逼平衡树 (树状数组套权值线段树)
带修改区间K大值 这题有很多做法,我的做法是树状数组套权值线段树,修改查询的时候都是按着树状数组的规则找出那log(n)个线段树根,然后一起往下做 时空都是$O(nlog^2n)$的(如果离散化了的话 ...
- Dynamic Rankings(树状数组套权值线段树)
Dynamic Rankings(树状数组套权值线段树) 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[ ...
- [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)
[BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...
- codeforces 985 E. Pencils and Boxes (dp 树状数组)
E. Pencils and Boxes time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- Codeforces #528 Div2 F (1087F) Rock-Paper-Scissors Champion 树状数组+set
题意:n个人站成一排,初始时刻每个人手中都有一个图案,可能是石头,剪刀,布3个中的1种,之后会随机选取相邻的两个人玩石头剪刀布的游戏,输的人会离开(如果两个人图案相同,则随机选择一个人离开).执行(n ...
- 2018牛客网暑期ACM多校训练营(第五场) F - take - [数学期望][树状数组]
题目链接:https://www.nowcoder.com/acm/contest/143/F 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...
随机推荐
- vue 初始化table数据,数据闪现的问题
使用的iview,很简单的一个table,可以扩展显示,我这里则是更改了一下,显示的也是表格,内容为明细数据. 原以为很简单的可以直接调用方法,进行数据的渲染,但是没想到,数据只是一闪而过. 百思不得 ...
- Android Studio "cannot resolve symbol R" 问题
初接触Android Studio,又遇到了 "cannot resolve symbol R"问题(以前在 Eclipse 也遇到过),网上方法不一,后来在stackoverfl ...
- angularjs的input防抖
在开发中,遇到一个这样的需求,使用$scope.$watch()方法监听input值的改变,然后去$resource请求,但是请求过于频繁,需要做逻辑调整.代码如下: var timeout; $sc ...
- 检测人脸及眼睛【OpenCV-Python实现 源码+打包.exe文件】
之前用opencv做的一个人脸及双眼检测,在此分享给大家 链接:https://pan.baidu.com/s/1BsKBH3wOF9TmdbRlPagEVQ 提取码:cqkv 效果如下:
- Netty源码解析---服务端启动
Netty源码解析---服务端启动 一个简单的服务端代码: public class SimpleServer { public static void main(String[] args) { N ...
- bucket list 函数解析
cls_bucket_list 函数 librados::IoCtx index_ctx; // key - oid (for different shards if there is any) ...
- 夯实Java基础(五)——==与equals()
1.前言 我们在学习Java的时候,看到==.equals()就认为比较简单,随便看了一眼就过了,其实你并没有深入去了解二者的区别.这个问题在面试的时候出现的频率比较高,而且据统计有85%的人理直气壮 ...
- Redis总结(八)如何搭建高可用的Redis集群
以前总结Redis 的一些基本的安装和使用,大家可以这这里查看Redis 系列文章:https://www.cnblogs.com/zhangweizhong/category/771056.html ...
- HiveQL DDL 常用QL示例资料
hive-version2.1.1 DDL操作 Create/Drop/Alter/Use Database 创建数据库 //官方指导 CREATE (DATABASE|SCHEMA) [IF NOT ...
- Activiti6系列(2)- 运行和编译
前言 Activiti6.0在官网已经无法下载了,需要在Github上下载. 下载地址: https://github.com/Activiti/Activiti/releases/download/ ...