[Codeforces 1053C] Putting Boxes Together
Link:
Solution:
先推出一个结论:
最后必有一个点不动且其为权值上最中间的一个点
证明用反证证出如果不在中间的点必有一段能用代价少的替代多的
这样问题转换为求出区间第一个大于权值和一半的点,并求结果
如果只考虑半边的结果为$\sum_{i=1}^{mid} (pos[mid]-pos[i]-(mid-i))*w[i]$
将$pos[i]$修改为$pos[i]-i$之后维护$\sum pos[i]*w[i]$的和即可
以上操作可以用两颗线段树来维护
注意:
1、维护$w[i]$时不能取模!
2、对于求权值中间点可以二分+树状数组也可以直接在线段树上二分
线段树上二分时注意如果已经在区间内查询值要不断更新
Code:
- #include <bits/stdc++.h>
- using namespace std;
- #define X first
- #define Y second
- #define pb push_back
- #define mid ((l+r)>>1)
- #define lc k<<1,l,mid
- #define rc k<<1|1,mid+1,r
- typedef double db;
- typedef long long ll;
- typedef pair<int,int> P;
- const int MAXN=5e5+,INF=<<,MOD=1e9+;
- struct SGT
- {
- ll seg[MAXN<<];
- //分清何时要取模
- void Update(int a,ll x,int f,int k,int l,int r)
- {
- if(l==r)
- {seg[k]+=x;if(f) seg[k]%=MOD;return;}
- if(a<=mid) Update(a,x,f,lc);
- else Update(a,x,f,rc);
- seg[k]=seg[k<<]+seg[k<<|];
- if(f) seg[k]%=MOD;
- }
- ll Query(int a,int b,int f,int k,int l,int r)
- {
- if(a<=l&&r<=b) return seg[k];
- ll ret=;
- if(a<=mid) ret+=Query(a,b,f,lc);
- if(b>mid) ret+=Query(a,b,f,rc);
- return f?ret%MOD:ret;
- }
- //注意线段树二分的处理及此处的引用
- int Find(int a,int b,ll &x,int k,int l,int r)
- {
- if(a<=l&&r<=b)
- {
- if(seg[k]<x){x-=seg[k];return INF;}
- if(l==r) return l;
- if(x<=seg[k<<]) return Find(a,b,x,lc);
- else{x-=seg[k<<];return Find(a,b,x,rc);}
- }
- int ret=INF;
- if(a<=mid)
- ret=min(ret,Find(a,b,x,lc));
- if(b>mid&&ret==INF)
- ret=min(ret,Find(a,b,x,rc));
- return ret;
- }
- }sw,sm;
- int n,q,x,y,pos[MAXN],w[MAXN];
- int main()
- {
- scanf("%d%d",&n,&q);
- for(int i=;i<=n;i++)
- scanf("%d",&pos[i]),pos[i]-=i;
- for(int i=;i<=n;i++)
- {
- scanf("%d",&w[i]);
- sw.Update(i,w[i],,,,n);
- sm.Update(i,1ll*w[i]*pos[i],,,,n);
- }
- while(q--)
- {
- scanf("%d%d",&x,&y);
- if(x<)
- {
- x=-x;
- sw.Update(x,-w[x],,,,n);
- sm.Update(x,-1ll*w[x]*pos[x],,,,n);
- w[x]=y;
- sw.Update(x,w[x],,,,n);
- sm.Update(x,1ll*w[x]*pos[x],,,,n);
- }
- else
- {
- //此时不能取模
- ll sum=(sw.Query(x,y,,,,n)+)/;
- int p=sw.Find(x,y,sum,,,n);
- ll t1=(sw.Query(x,p,,,,n)*pos[p]%MOD-sm.Query(x,p,,,,n)+MOD)%MOD;
- ll t2=(-sw.Query(p+,y,,,,n)*pos[p]%MOD+sm.Query(p+,y,,,,n)+MOD)%MOD;
- printf("%lld\n",(t1+t2)%MOD);
- }
- }
- return ;
- }
[Codeforces 1053C] Putting Boxes Together的更多相关文章
- Codeforces 1053C Putting Boxes Together 树状数组
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1053C.html 题目传送门 - CF1053C 题意 有 $n$ 个物品,第 $i$ 个物品在位置 $a ...
- 2018.09.24 codeforces 1053C. Putting Boxes Together(线段树)
传送门 就是让你维护动态的区间带权中位数. 然而昨晚比赛时并没有调出来. 想找到带权中位数的中点可以二分(也可以直接在线段树上找). 也就是二分出第一个断点,使得断点左边的和恰好大于或等于断点右边的和 ...
- Codeforces 1053 C - Putting Boxes Together
C - Putting Boxes Together 思路: 求带权中位数 用树状数组维护修改 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) ...
- CodeForces 1058 F Putting Boxes Together 树状数组,带权中位数
Putting Boxes Together 题意: 现在有n个物品,第i个物品他的位置在a[i],他的重量为w[i].每一个物品移动一步的代价为他的w[i].目前有2种操作: 1. x y 将第x的 ...
- Putting Boxes Together CodeForces - 1030F (带权中位数)
#include <iostream> #include <algorithm> #include <cstdio> #include <math.h> ...
- Codeforces 488B - Candy Boxes
B. Candy Boxes 题目链接:http://codeforces.com/problemset/problem/488/B time limit per test 1 second memo ...
- Educational Codeforces Round 31- D. Boxes And Balls
D. Boxes And Balls time limit per test2 seconds memory limit per test256 megabytes 题目链接:http://codef ...
- [CF1053C]Putting Boxes Together(线段树)
http://codeforces.com/blog/entry/62013 两个结论: 1.一定有一个箱子不用动. 2.不动的箱子一定是加权前缀和为S/2的那个. 1显然,2由1易得. 于是问题变为 ...
- CF1030F Putting Boxes Together
昨晚的比赛题.(像我这种蒟蒻只能打打div2) 题意 给你$n$个物品,每一个物品$i$,有一个权值$w_i$和一个位置$a_i$,定义移动一个物品$i$到位置$t$的代价为$w_i * \left ...
随机推荐
- 继承自UITableView的类自带tableView属性,不需要在创建该属性,因为父类UITableView已经创建.
继承自UITableView的类自带tableView属性,不需要在创建该属性,因为父类UITableView已经创建. https://www.evernote.com/shard/s227 ...
- Vue.js最佳实践(五招让你成为Vue.js大师)
对大部分人来说,掌握Vue.js基本的几个API后就已经能够正常地开发前端网站.但如果你想更加高效地使用Vue来开发,成为Vue.js大师,那下面我要传授的这五招你一定得认真学习一下了. 第一招:化繁 ...
- 【洛谷 P4320】 道路相遇 (圆方树,LCA)
题目链接 题意:给一张无向图和\(M\)个询问,问\(u,v\)之间的路径的必经之点的个数. 对图建出圆方树,然后必经之点就是两点路径经过的原点个数,用\((dep[u]+dep[v]-dep[LCA ...
- Python第三方库jieba(中文分词)入门与进阶(官方文档)
jieba "结巴"中文分词:做最好的 Python 中文分词组件 github:https://github.com/fxsjy/jieba 特点 支持三种分词模式: 精确模式, ...
- Python-字符串处理 str.format()
Python中内置的%操作符可用于格式化字符串操作,控制字符串的呈现格式.Python中还有其他的格式化字符串的方式,但%操作符的使用是最方便的. 另外python还有一个更强大的字符串处理函数 st ...
- [LabVIEW架构]ActorFramework(一)
前言 小黑结婚回来第二周了,每天忙于程序设计,时间比较紧张,所以文章一直没出来,也算憋大招了. 近期小黑将与大家一起认识一下ActorFramework,既是对自己一段时间写AF程序的总结,也是梳理, ...
- windows server 2012 IIS配置之FTP站点
原文地址:[原创]winserver2012IIS配置之FTP站点作者:hkmysterious 一.实验拓扑: 使server2012客户计算机通过ftp方式从FTP服务器上下载已上传并共享的文 ...
- socket编程之select(),poll(),epoll()
socket编程,通信 client端 socket() ----->connect() ------->recv() -----> close(); server端 socket ...
- jstack 命令学习笔记
大部分内容转载自:Java命令学习系列(二)--Jstack jstack - 查看堆栈信息 jstack ( Stack Trace for java ) 命令主要作用就是为了查看堆栈信息.它可以用 ...
- [设计模式-行为型]模板方法模式(Template Method)
一句话 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 概括