[bzoj4908][BeiJing2017]开车
来自FallDream的博客,未经允许,请勿转载,谢谢。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define getchar() (*S++)
#define pa pair<int,int>
#define ll long long
#define MN 50000
#define MB 400
char B[<<],*S=B;
using namespace std;
inline int read()
{
int x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
}
long long Ans,ans[MB+],F[MB+][MB*+],f[MB+][MB*+];
int n,m,l[MN*+],cnt=,pos[MB+],a[MN+],block[MN*+],v[MN*+];
int s[MN*+],b[MN+],tot=,size;
struct ques{int x,y;}q[MN+];
inline int abs(int x){return x<?-x:x;}
void Move(int x,int y)
{
Ans-=ans[x];
if(abs(y)<=MB) Ans+=(ans[x]=F[x][MB+y]);
else
{
if(y>MB) Ans+=(ans[x]=F[x][MB<<]+1LL*(y-MB)*f[x][MB<<]);
if(y<MB) Ans+=(ans[x]=F[x][]+1LL*(MB-y)*f[x][]);
}
} void Build(int x)
{
int W=;
for(int i=;i<=MB<<;++i) f[x][i]=F[x][i]=;
for(int i=(x-)*size+;block[i]==x;++i)
{
F[x][MB]+=1LL*v[i]*abs(W+=s[i]);
if(!W) f[x][+MB]+=v[i],f[x][MB-]+=v[i];
if(W>) f[x][MB+]+=v[i],W<MB?(f[x][MB-W-]+=v[i]<<):,f[x][MB-]-=v[i];
if(W<) f[x][MB+]-=v[i],f[x][MB-W+]+=v[i]<<,f[x][MB-]+=v[i];
}
for(int i=;i<=MB;++i)
F[x][MB+i]=F[x][MB+i-]+(f[x][MB+i]+=f[x][MB+i-]),
F[x][MB-i]=F[x][MB-i+]+(f[x][MB-i]+=f[x][MB-i+]);
Move(x,pos[x]);
} int main()
{
fread(B,,<<,stdin);
n=read();
for(int i=;i<=n;++i) a[i]=l[++cnt]=read();
for(int i=;i<=n;++i) b[i]=l[++cnt]=read();
m=read();
for(int i=;i<=m;++i) q[i].x=read(),q[i].y=l[++cnt]=read();
sort(l+,l+cnt+);
for(int i=;i<=cnt;++i) if(l[i]!=l[i-]) l[++tot]=l[i];
for(int i=;i<tot;++i) v[i]=l[i+]-l[i];
size=sqrt(tot);
for(int i=;i<=n;++i)
a[i]=lower_bound(l+,l+tot+,a[i])-l,
b[i]=lower_bound(l+,l+tot+,b[i])-l,
++s[a[i]],--s[b[i]];
for(int i=;i<=tot;++i) block[i]=(i-)/size+;
for(int i=,w=;i<=block[tot];++i)
{
pos[i]=w;Build(i);
for(int j=(i-)*size+;block[j]==i;++j) w+=s[j];
}
printf("%lld\n",Ans);
for(int i=;i<=m;++i)
{
q[i].y=lower_bound(l+,l+tot+,q[i].y)-l;
if(q[i].y!=a[q[i].x])
{
--s[a[q[i].x]];++s[q[i].y];
if(block[q[i].y]==block[a[q[i].x]])
Build(block[q[i].y]);
else
{
int From=min(block[a[q[i].x]],block[q[i].y]),
To=max(block[a[q[i].x]],block[q[i].y]);
for(int j=From+;j<To;++j)
Move(j,pos[j]+=(q[i].y>a[q[i].x]?-:));
if(a[q[i].x]>q[i].y) ++pos[block[a[q[i].x]]];
else --pos[block[q[i].y]];
Build(block[q[i].y]);Build(block[a[q[i].x]]);
}
}
a[q[i].x]=q[i].y;printf("%lld\n",Ans);
}
return ;
}
[bzoj4908][BeiJing2017]开车的更多相关文章
- 【BZOJ4908】[BeiJing2017]开车 分块
[BZOJ4908][BeiJing2017]开车 Description 你有n辆车,分别a1, a2, ..., an位置和n个加油站,分别在b1, b2, ... ,bn .每个加油站只能支持一 ...
- [BZOJ]4908: [BeiJing2017]开车
Time Limit: 30 Sec Memory Limit: 256 MB Description 你有n辆车,分别a1, a2, ..., an位置和n个加油站,分别在b1, b2, ... ...
- 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 ...
随机推荐
- python的Virtualenv
Virtualenv 虚拟的 Python 环境(简称 venv) 是一个能帮助你在本地目录安装不同版本的 Python 模块的 Python 环境,你可以不再需要在你系统中安装所有东西就能开发并测试 ...
- 彻底搞懂shell的高级I/O重定向
本文目录: 1.1 文件描述符(file description,fd) 1.2 文件描述符的复制 1.3 重定向顺序很重要:">file 2>&1"和&quo ...
- PHP冒泡排序、选择排序、插入排序
$arr = [1, 8, 7, 5, 4, 2, 11, 9, 20]; 冒泡排序: for ($i = 0; $i < count($arr); $i ++) { for ($j = 0; ...
- JavaScript 轮播图实例
HTML代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...
- Column Addition~DP(脑子抽了,当时没有想到)
Description A multi-digit column addition is a formula on adding two integers written like this:
- ccf认证 201709-4 通信网络 java实现
试题编号: 201709-4 试题名称: 通信网络 时间限制: 1.0s 内 ...
- leetcode算法: Find Bottom Left Tree Value
leetcode算法: Find Bottom Left Tree ValueGiven a binary tree, find the leftmost value in the last row ...
- Properties文件读写问题
项目需要在Properties配置文件中设置一些配置属性,其中包含一些中文属性.经过一上午的奋斗终于圆满解决问题. 读取Properties文件所有属性 Map<String, String&g ...
- linux centos-7.2-64bit 安装配置启动nginx
1.安装依赖包yum -y install openssl openssl-develyum install pcre*yum install openssl*yum install zlib yum ...
- A、B同时打开一个页面进行同一条数据库记录进行修改,A修改完成后提交表单,A修改的数据保存完成后;当B也修改完成后,提交数据进行数据修改。此时B修改的内容会覆盖A修改的内容,请问如何避免?
A.B同时打开一个页面进行数据中的一条数据进行修改,A修改完成后提交表单,数据修改保存完成后B开始页面也修改完成,开始提交进行修改.此时B修改的内容会覆盖A的内容,请问如何避免? 通过搜索和我个人总结 ...