[BJOI2017]开车
直接做要用栈
修改?难以直接维护
统计边的贡献!
len*abs(pre)pre表示前缀car-stop
修改时候,整个区间的pre+1或者-1
分块,块内对pre排序并打标记
二分出0的位置,再根据pre的正负和本次是+1,-1,leni贡献+1还是-1的贡献
O(nsqrt(n)logn)
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');} namespace Miracle{
const int N=*5e4+;
const int B=;
int n,m;
int L[N],R[N];
struct qs{
int id,x;
}q[N];
int c[N],cnt;
int tot;
int pos[N],b[N];
int be[N],len[N]; vector<int>mem[B],sum[B];
int tag[B];
ll con[B]; int exi[N];//0: none 1:car -1:stop
int pre[N];
int buc[N];
bool cmp(int x,int y){
return pre[x]<pre[y];
}
int li(int x){
return lower_bound(c+,c+cnt+,x)-c;
}
int main(){
rd(n);
for(reg i=;i<=n;++i) rd(pos[i]),c[++cnt]=pos[i];
for(reg i=;i<=n;++i) rd(b[i]),c[++cnt]=b[i];
rd(m);
for(reg i=;i<=m;++i){
rd(q[i].id);rd(q[i].x);
c[++cnt]=q[i].x;
}
sort(c+,c+cnt+);
cnt=unique(c+,c+cnt+)-c-; int blo=sqrt(cnt)+;
for(reg i=;i<=cnt;++i){
be[i]=(i-)/blo+;
if(!L[be[i]]) L[be[i]]=i;
R[be[i]]=i;
len[i]=c[i+]-c[i];
}
len[cnt]=;
tot=be[cnt]; for(reg i=;i<=n;++i){
int po=lower_bound(c+,c+cnt+,b[i])-c;
--exi[po];
po=lower_bound(c+,c+cnt+,pos[i])-c;
++exi[po];
}
ll ans=;
for(reg i=;i<=cnt;++i){
pre[i]=pre[i-]+exi[i];
ans+=(ll)len[i]*abs(pre[i]);
}
for(reg j=;j<=tot;++j){
tag[j]=;
for(reg i=L[j];i<=R[j];++i){
mem[j].push_back(i);
con[j]+=(ll)len[i]*abs(pre[i]);
}
sort(mem[j].begin(),mem[j].end(),cmp);
sum[j].resize(mem[j].size());
for(reg i=;i<(int)mem[j].size();++i){
sum[j][i]=len[mem[j][i]];
if(i) sum[j][i]+=sum[j][i-];
}
}
printf("%lld\n",ans);
for(reg o=;o<=m;++o){
int l=li(pos[q[o].id]),r=li(q[o].x);
exi[l]--;exi[r]++; int c=-;//l->r
if(l>r) swap(l,r),c=;//r->l
--r;//warinig!!!
if(be[l]==be[r]){
for(reg i=l;i<=r;++i) pre[i]+=c;
ans-=con[be[l]];
con[be[l]]=;
mem[be[l]].clear();
sum[be[l]].clear();
int j=be[l];
for(reg i=L[be[l]];i<=R[be[l]];++i){
pre[i]+=tag[be[l]];
mem[j].push_back(i);
}
sort(mem[j].begin(),mem[j].end(),cmp);
sum[j].resize(mem[j].size());
for(reg i=;i<(int)mem[j].size();++i){
sum[j][i]=len[mem[j][i]];
con[j]+=(ll)len[mem[j][i]]*abs(pre[mem[j][i]]);
if(i) sum[j][i]+=sum[j][i-];
}
tag[be[l]]=;
ans+=con[be[l]];
}else{
for(reg i=l;i<=R[be[l]];++i){
pre[i]+=c;
}
int j=be[l];
ans-=con[j];
con[j]=;
mem[j].clear();
sum[j].clear();
for(reg i=L[j];i<=R[j];++i){
pre[i]+=tag[j];
mem[j].push_back(i);
}
sort(mem[j].begin(),mem[j].end(),cmp);
sum[j].resize(mem[j].size());
for(reg i=;i<(int)mem[j].size();++i){
sum[j][i]=len[mem[j][i]];
con[j]+=(ll)len[mem[j][i]]*abs(pre[mem[j][i]]);
if(i) sum[j][i]+=sum[j][i-];
}
tag[j]=;
ans+=con[j]; for(reg i=L[be[r]];i<=r;++i){
pre[i]+=c;
}
j=be[r];
ans-=con[j];
con[j]=;
mem[j].clear();
sum[j].clear();
for(reg i=L[j];i<=R[j];++i){
pre[i]+=tag[j];
mem[j].push_back(i);
}
sort(mem[j].begin(),mem[j].end(),cmp);
sum[j].resize(mem[j].size());
for(reg i=;i<(int)mem[j].size();++i){
sum[j][i]=len[mem[j][i]];
con[j]+=(ll)len[mem[j][i]]*abs(pre[mem[j][i]]);
if(i) sum[j][i]+=sum[j][i-];
}
tag[j]=;
ans+=con[j]; for(reg j=be[l]+;j<=be[r]-;++j){
pre[]=-tag[j];
if(c==-){
int lp=upper_bound(mem[j].begin(),mem[j].end(),,cmp)-mem[j].begin();
--lp;//warning!! maybe -1
if(lp!=-){
ans+=(ll)sum[j][lp];
ans-=(ll)sum[j][mem[j].size()-]-sum[j][lp];
con[j]+=(ll)sum[j][lp];
con[j]-=(ll)sum[j][mem[j].size()-]-sum[j][lp];
}else{
ans-=(ll)sum[j][mem[j].size()-];
con[j]-=(ll)sum[j][mem[j].size()-];
} }else{
int lp=lower_bound(mem[j].begin(),mem[j].end(),,cmp)-mem[j].begin();
--lp;//warning!! maybe -1
if(lp!=-){
ans-=(ll)sum[j][lp];
ans+=(ll)sum[j][mem[j].size()-]-sum[j][lp];
con[j]-=(ll)sum[j][lp];
con[j]+=(ll)sum[j][mem[j].size()-]-sum[j][lp];
}else{
ans+=(ll)sum[j][mem[j].size()-];
con[j]+=(ll)sum[j][mem[j].size()-];
}
}
tag[j]+=c;
}
pre[]=;
}
pos[q[o].id]=q[o].x;
printf("%lld\n",ans);
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/4/11 10:31:35
*/
[BJOI2017]开车的更多相关文章
- 题解 [BJOI2017]开车
题目传送门 题目大意 有\(n\)个汽车和\(n\)个加油站,坐标分别为\(a_{1,2,...,n}\)和\(b_{1,2,...,n}\).每辆汽车会到一个加油站,求出最小移动距离之和.有\(m\ ...
- vijos P1780 【NOIP2012】 开车旅行
描述 小\(A\)和小\(B\)决定利用假期外出旅行,他们将想去的城市从\(1\)到\(N\)编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市\(i\)的海拔高度为 ...
- [NOIP2012] 提高组 洛谷P1081 开车旅行
题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...
- 豆制品厂开车超市送货智能手持PDA POS打票机-手持票据打印机
豆制品厂开车拉着豆腐到某一个超市送货,到达后秤出斤数后就用票据打印机开单 能直接开单,单子一式两份,一张给客户一张留底,到月底时客户要根据客户的量返点的,单子统计.能现场开单,单子上显示哪个超市,豆制 ...
- 在包a中编写一个类Father,具有属性:年龄(私有)、姓名(公有); 具有功能:工作(公有)、开车(公有)。 在包a中编写一个子类Son,具有属性:年龄(受保护的)、姓名; 具有功能:玩(私有)、学习(公有)。 最后在包b中编写主类Test,在主类的main方法中测试类Father与类Son。
package a; public class Father { public String name; private int age; public Father(String name) { t ...
- 【noip2012】开车旅行
题意: 给n个点的海拔h[i](不同点海拔不同) 两点的距离为abs(h[i]-h[j]) 有a.b两人轮流开车(只能往下标大的地方开) a每次会开到里当前点第二近的点 b每次会开到离当前点最近的点( ...
- 【NOIP 2012 开车旅行】***
题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...
- javascript 老王开车去东北
[Decode error - output not utf-8] 魔女 飞 奔驰 去 华南 [Finished in 1.1s] 需要变化的对象进行隔离.正是编程的乐趣之处 /** * by Jac ...
- 【NOIP2012】开车旅行(倍增)
题面 Description 小A 和小B决定利用假期外出旅行,他们将想去的城市从1到N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i的海拔高度为Hi,城市 ...
随机推荐
- MyBatis映射文件2(不支持自增的数据库解决方案/参数处理[单参、多参、命名参数])
针对Oracle不支持自增的解决方案 Oracle不支持自增,但是它使用序列来模拟自增,每次插入数据的主键是从序列中拿到的值,那么如何获取这个值呢? <insert id="addEm ...
- git简介及安装(win10)
一句话介绍git Git是Linus Torvalds编写,目前是世界上最先进的分布式版本控制系统. git能干什么? 代码备份.还原,版本管理,分支管理,解决冲突,协同开发... 安装git > ...
- Springboot中使用Xstream进行XML与Bean 相互转换
在现今的项目开发中,虽然数据的传输大部分都是用json格式来进行传输,但是xml毕竟也会有一些老的项目在进行使用,正常的老式方法是通过获取节点来进行一系列操作,个人感觉太过于复杂.繁琐.推荐一套简单的 ...
- nginx 卸载后重新安装/etc/nginx配置文件没了,cannot open /etc/nginx/nginx.conf (No such file or directory)
sudo apt-get --purge remove nginx-common sudo apt-get --purge remove nginx* sudo apt-get autoremove ...
- shell命令相关
1.服务端登录退出 登录服务器 ssh kayan.sjc@xx.xx.xx.67 退出登录:logout 192.168.0.10 2.目录管理 显示目录 pwd 创建目录 mkdir resour ...
- static类型的变量
c语言中变量的储存类型有以下四种 auto 如果没有定义储存类型 默认就是这个类型 比如 int a = 10; 储存类型就是 auto:编译器会跟你定义的位置,以及用途,自动帮你决定使用那 ...
- nargin
nargin 编辑 nargin为“number of input arguments”的缩写. 在matlab中定义一个函数时, 在函数体内部, nargin是用来判断输入变量个数的函数.在matl ...
- JarvisOJ Basic 熟悉的声音
两种元素,还有声音,想到了莫尔斯电码,解码得到 jbluwewnz 提交,发现不对,觉得应该是有实际意义的东西,实在想不到还能怎么解,就去看了题解. 发现这个还可以再套一个凯撒密码,就拿python写 ...
- windows新增/修改/删除系统环境变量bat示例,一键配置JAVA_HOME
setx JAVA_HOME "C:\Program Files\java\jdk1.6.0_27" /m setx classpath = ".;%JAVA_HOME% ...
- 解决面板里没有network manager图标的问题 ,也就是在桌面环境下,没有那个网络图标
在安装好了桌面之后,竟然发现没有那个连接网络的图标,本来想连接无限网络.可是.......如果去手动命令行下去配置这个连接wifi有些麻烦,所以我还是去找解决办法了 我执行了一条命令就解决了 gcon ...