[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,城市 ...
随机推荐
- Oracle pivot行转列函数案例
with temp as( select '湖北省' province,'武汉市' city,'第一' ranking from dual union all select '湖北省' provinc ...
- CRM系统数据授权
1.新建角色,华东二区 2.业务对象中找到客户管理 3.在数据范围中新建数据规则,并进行设置 4.点击授权后,生效. 另:数据权限设置
- 使用mysqlbinlog恢复数据
前提:mysql数据库开启了binlog日志,并且有对应的日志文件 起因:今天由于同事对数据库的误操作不小心删除了一条数据 方法一:通过binlog日志文件恢复数据 通过mysqlbinlog恢复My ...
- Plugin/Preset files are not allowed to export objects,webpack报错/babel报错的解决方法
1.为什么会报错 ? 这里抱着错误是因为 babel 的版本冲突. 多是因为你的 babel 依赖包不兼容. 可以查看你的 package.json 的依赖列表 即有 babel 7.0 版本的( @ ...
- Windows上安装 TensorFlow及简单命令
1.官网及帮助文档 官网: https://www.tensorflow.org/install/install_windows 中文帮助文档:https://efeiefei.gitbooks.io ...
- Jira的搭建
一.环境准备 jira7.2的运行是依赖java环境的,也就是说需要安装jdk并且要是1.8以上版本,如下: java -version 除此之外,我们还需要为jira创建对应的数据库.用户名和密码, ...
- jedis单机版应用
1.pom文件添加依赖: 2.创建配置文件 创建单机版redisClient 代码: package com.skymall.rest.dao.imp; import org.springframew ...
- Membership 介绍
ASP.NET成员资格为您提供了验证和存储用户凭据的内置方式.因此,ASP.NET成员可以帮助您管理网站中的用户身份验证.您可以使用ASP.NET表单身份验证使用ASP.NET成员身份,方法是使用AS ...
- com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1035079 -- APPARENT DEADLOCK!!! Complete Status:
com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1035079 -- APPARENT DEADLOCK!!! C ...
- git使用常见问题
1.git branch使用,创建新的分之后做修改后,其他分支也被同步修改 问题: 原项目在 master 分支,执行下面的操作: git branch test git checkout tes ...