[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. 用户认证--------------auth模块

    一.auth模块 from django.contrib import auth 1 .authenticate()   :验证用户输入的用户名和密码是否相同 提供了用户认证,即验证用户名以及密码是否 ...

  2. java.lang.NoClassDefFoundError: org/apache/log4j/Priority的问题解决

    在pom 文件中添加 <dependency> <groupId>log4j</groupId> <artifactId>log4j</artif ...

  3. Dom4j解析

    dom4j-1.6.1.jar, 这个包提供了xml解析相关的方法. 这里做一个记录,微信公众号里需要对HttpServletRequest做解析,实际上也可以用dom4j提供的方法进行解析转换. 这 ...

  4. python爬虫之git的安装

      一.初始 1.发展历史 *最开始没有对代码的管理,导致很多东西混乱和丢失. *后来大家想了一个办法,用最简单最笨的方法,各种复制文件夹. *然后就出现了版本控制的工具. 1.单机版:RCS(198 ...

  5. 记一次tomcat7.0版本启动项目失败问题

    测试项目在tomcat7中启动失败,报错如下: @794314bc3 Error during job execution (jobs.Bootstrap) Oops: VerifyError ~ p ...

  6. 使用urllib2+re爬取web网站

    应用1,使用urllib2+re爬取淘宝网指定页面的所有图片

  7. Git官方推荐用书

    用Git看了N多的Blog, 乱七八糟. 官方的推荐用书写得最好,最权威.还可以下载pdf.记录一笔. https://git-scm.com/book/zh/v2/

  8. MSDN学习: 加密解密Config文件中的Sections( Encrypting and Decrypting Configuration Sections)

    https://msdn.microsoft.com/en-us/library/wfc2t3az(v=vs.100).aspx https://msdn.microsoft.com/en-us/li ...

  9. timestamp 与 nonce 防止重放攻击

    重放攻击是计算机世界黑客常用的攻击方式之一,所谓重放攻击就是攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程. 首先要明确一个事情,重放攻击是二次请求,黑客通过抓包获取到 ...

  10. webpack模塊打包機

    https://blog.csdn.net/qq_38277366/article/details/82907894