[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]开车的更多相关文章

  1. 题解 [BJOI2017]开车

    题目传送门 题目大意 有\(n\)个汽车和\(n\)个加油站,坐标分别为\(a_{1,2,...,n}\)和\(b_{1,2,...,n}\).每辆汽车会到一个加油站,求出最小移动距离之和.有\(m\ ...

  2. vijos P1780 【NOIP2012】 开车旅行

    描述 小\(A\)和小\(B\)决定利用假期外出旅行,他们将想去的城市从\(1\)到\(N\)编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市\(i\)的海拔高度为 ...

  3. [NOIP2012] 提高组 洛谷P1081 开车旅行

    题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...

  4. 豆制品厂开车超市送货智能手持PDA POS打票机-手持票据打印机

    豆制品厂开车拉着豆腐到某一个超市送货,到达后秤出斤数后就用票据打印机开单 能直接开单,单子一式两份,一张给客户一张留底,到月底时客户要根据客户的量返点的,单子统计.能现场开单,单子上显示哪个超市,豆制 ...

  5. 在包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 ...

  6. 【noip2012】开车旅行

    题意: 给n个点的海拔h[i](不同点海拔不同) 两点的距离为abs(h[i]-h[j]) 有a.b两人轮流开车(只能往下标大的地方开) a每次会开到里当前点第二近的点 b每次会开到离当前点最近的点( ...

  7. 【NOIP 2012 开车旅行】***

    题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...

  8. javascript 老王开车去东北

    [Decode error - output not utf-8] 魔女 飞 奔驰 去 华南 [Finished in 1.1s] 需要变化的对象进行隔离.正是编程的乐趣之处 /** * by Jac ...

  9. 【NOIP2012】开车旅行(倍增)

    题面 Description 小A 和小B决定利用假期外出旅行,他们将想去的城市从1到N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i的海拔高度为Hi,城市 ...

随机推荐

  1. 50分钟学会Laravel 50个小技巧(基于laravel5.2,仅供参考)

    转载请注明:转载自 Yuansir-web菜鸟 | LAMP学习笔记 本文链接地址: 50分钟学会Laravel 50个小技巧 原文链接:< 50 Laravel Tricks in 50 Mi ...

  2. C# Note28: Dispatcher类

    在项目中也是经常用到: 刚见到它时,你会想:为什么不直接使用System.Windows命名空间下的MessageBox类,何必要这么麻烦?(认真分析看它做了什么,具体原因下面解释) 主要介绍的方法: ...

  3. Spring boot 全局配置文件application.properties

    #更改Tomcat端口号 server.port=8090 #修改进入DispatcherServlet的规则为:*.htmlserver.servlet-path=*.html#这里要注意高版本的s ...

  4. HDU 5025 Saving Tang Monk

    Problem Description <Journey to the West>(also <Monkey>) is one of the Four Great Classi ...

  5. cefSharp 开发随笔

    最近用cefSharp开发一点简单的东西.记录一点随笔,不定时更新. 1.用nuget安装完之后,架构要选择x86或者x64,否则编译会报错(截止到Chrome 55版本) 2.向Chrome注册C# ...

  6. 百度编辑器UEditor使用方法

    http://www.cnblogs.com/lionden/archive/2012/07/13/ueditor.html 介绍图片上传:http://uikoo9.com/blog/detail/ ...

  7. Spring Boot 构建电商基础秒杀项目 (十一) 秒杀

    SpringBoot构建电商基础秒杀项目 学习笔记 新建表 create table if not exists promo ( id int not null auto_increment, pro ...

  8. javascript帧动画

    前面的话 帧动画就是在“连续的关键帧”中分解动画动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成的动画.由于是一帧一帧的画,所以帧动画具有非常大的灵活性,几乎可以表现任何想表现的内容. ...

  9. 保密工作与linux系统的发展

    保密工作从性质上可以分成商业方面的保密和国家安全方面的保密.由于自己从事的是IT方面的工作,工作中必然会接触涉及到计算机信息方面的相关文件.加上单位已近通过武器装备科研生产单位二级保密资格认证,今天就 ...

  10. python爬虫requests模块

    requests库的七个主要方法 1. requests.requests(method, url, **kwargs) 构造一个请求,支撑以下各方法的基础方法 method:请求方式,对应get/p ...