[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. Oracle pivot行转列函数案例

    with temp as( select '湖北省' province,'武汉市' city,'第一' ranking from dual union all select '湖北省' provinc ...

  2. CRM系统数据授权

    1.新建角色,华东二区 2.业务对象中找到客户管理 3.在数据范围中新建数据规则,并进行设置 4.点击授权后,生效. 另:数据权限设置

  3. 使用mysqlbinlog恢复数据

    前提:mysql数据库开启了binlog日志,并且有对应的日志文件 起因:今天由于同事对数据库的误操作不小心删除了一条数据 方法一:通过binlog日志文件恢复数据 通过mysqlbinlog恢复My ...

  4. Plugin/Preset files are not allowed to export objects,webpack报错/babel报错的解决方法

    1.为什么会报错 ? 这里抱着错误是因为 babel 的版本冲突. 多是因为你的 babel 依赖包不兼容. 可以查看你的 package.json 的依赖列表 即有 babel 7.0 版本的( @ ...

  5. Windows上安装 TensorFlow及简单命令

    1.官网及帮助文档 官网: https://www.tensorflow.org/install/install_windows 中文帮助文档:https://efeiefei.gitbooks.io ...

  6. Jira的搭建

    一.环境准备 jira7.2的运行是依赖java环境的,也就是说需要安装jdk并且要是1.8以上版本,如下: java -version 除此之外,我们还需要为jira创建对应的数据库.用户名和密码, ...

  7. jedis单机版应用

    1.pom文件添加依赖: 2.创建配置文件 创建单机版redisClient 代码: package com.skymall.rest.dao.imp; import org.springframew ...

  8. Membership 介绍

    ASP.NET成员资格为您提供了验证和存储用户凭据的内置方式.因此,ASP.NET成员可以帮助您管理网站中的用户身份验证.您可以使用ASP.NET表单身份验证使用ASP.NET成员身份,方法是使用AS ...

  9. com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1035079 -- APPARENT DEADLOCK!!! Complete Status:

    com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1035079 -- APPARENT DEADLOCK!!! C ...

  10. git使用常见问题

    1.git branch使用,创建新的分之后做修改后,其他分支也被同步修改 问题: 原项目在 master 分支,执行下面的操作:  git branch test  git checkout tes ...