[BJOI2017]开车

直接做要用栈

修改?难以直接维护

统计边的贡献!

len*abs(pre)pre表示前缀car-stop

修改时候,整个区间的pre+1或者-1

分块,块内对pre排序并打标记

二分出0的位置,再根据pre的正负和本次是+1,-1,leni贡献+1还是-1的贡献

O(nsqrt(n)logn)

  1. #include<bits/stdc++.h>
  2. #define reg register int
  3. #define il inline
  4. #define fi first
  5. #define se second
  6. #define mk(a,b) make_pair(a,b)
  7. #define numb (ch^'0')
  8. using namespace std;
  9. typedef long long ll;
  10. template<class T>il void rd(T &x){
  11. char ch;x=;bool fl=false;
  12. while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
  13. for(x=numb;isdigit(ch=getchar());x=x*+numb);
  14. (fl==true)&&(x=-x);
  15. }
  16. template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
  17. template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
  18. template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}
  19.  
  20. namespace Miracle{
  21. const int N=*5e4+;
  22. const int B=;
  23. int n,m;
  24. int L[N],R[N];
  25. struct qs{
  26. int id,x;
  27. }q[N];
  28. int c[N],cnt;
  29. int tot;
  30. int pos[N],b[N];
  31. int be[N],len[N];
  32.  
  33. vector<int>mem[B],sum[B];
  34. int tag[B];
  35. ll con[B];
  36.  
  37. int exi[N];//0: none 1:car -1:stop
  38. int pre[N];
  39. int buc[N];
  40. bool cmp(int x,int y){
  41. return pre[x]<pre[y];
  42. }
  43. int li(int x){
  44. return lower_bound(c+,c+cnt+,x)-c;
  45. }
  46. int main(){
  47. rd(n);
  48. for(reg i=;i<=n;++i) rd(pos[i]),c[++cnt]=pos[i];
  49. for(reg i=;i<=n;++i) rd(b[i]),c[++cnt]=b[i];
  50. rd(m);
  51. for(reg i=;i<=m;++i){
  52. rd(q[i].id);rd(q[i].x);
  53. c[++cnt]=q[i].x;
  54. }
  55. sort(c+,c+cnt+);
  56. cnt=unique(c+,c+cnt+)-c-;
  57.  
  58. int blo=sqrt(cnt)+;
  59. for(reg i=;i<=cnt;++i){
  60. be[i]=(i-)/blo+;
  61. if(!L[be[i]]) L[be[i]]=i;
  62. R[be[i]]=i;
  63. len[i]=c[i+]-c[i];
  64. }
  65. len[cnt]=;
  66. tot=be[cnt];
  67.  
  68. for(reg i=;i<=n;++i){
  69. int po=lower_bound(c+,c+cnt+,b[i])-c;
  70. --exi[po];
  71. po=lower_bound(c+,c+cnt+,pos[i])-c;
  72. ++exi[po];
  73. }
  74. ll ans=;
  75. for(reg i=;i<=cnt;++i){
  76. pre[i]=pre[i-]+exi[i];
  77. ans+=(ll)len[i]*abs(pre[i]);
  78. }
  79. for(reg j=;j<=tot;++j){
  80. tag[j]=;
  81. for(reg i=L[j];i<=R[j];++i){
  82. mem[j].push_back(i);
  83. con[j]+=(ll)len[i]*abs(pre[i]);
  84. }
  85. sort(mem[j].begin(),mem[j].end(),cmp);
  86. sum[j].resize(mem[j].size());
  87. for(reg i=;i<(int)mem[j].size();++i){
  88. sum[j][i]=len[mem[j][i]];
  89. if(i) sum[j][i]+=sum[j][i-];
  90. }
  91. }
  92. printf("%lld\n",ans);
  93. for(reg o=;o<=m;++o){
  94. int l=li(pos[q[o].id]),r=li(q[o].x);
  95. exi[l]--;exi[r]++;
  96.  
  97. int c=-;//l->r
  98. if(l>r) swap(l,r),c=;//r->l
  99. --r;//warinig!!!
  100. if(be[l]==be[r]){
  101. for(reg i=l;i<=r;++i) pre[i]+=c;
  102. ans-=con[be[l]];
  103. con[be[l]]=;
  104. mem[be[l]].clear();
  105. sum[be[l]].clear();
  106. int j=be[l];
  107. for(reg i=L[be[l]];i<=R[be[l]];++i){
  108. pre[i]+=tag[be[l]];
  109. mem[j].push_back(i);
  110. }
  111. sort(mem[j].begin(),mem[j].end(),cmp);
  112. sum[j].resize(mem[j].size());
  113. for(reg i=;i<(int)mem[j].size();++i){
  114. sum[j][i]=len[mem[j][i]];
  115. con[j]+=(ll)len[mem[j][i]]*abs(pre[mem[j][i]]);
  116. if(i) sum[j][i]+=sum[j][i-];
  117. }
  118. tag[be[l]]=;
  119. ans+=con[be[l]];
  120. }else{
  121. for(reg i=l;i<=R[be[l]];++i){
  122. pre[i]+=c;
  123. }
  124. int j=be[l];
  125. ans-=con[j];
  126. con[j]=;
  127. mem[j].clear();
  128. sum[j].clear();
  129. for(reg i=L[j];i<=R[j];++i){
  130. pre[i]+=tag[j];
  131. mem[j].push_back(i);
  132. }
  133. sort(mem[j].begin(),mem[j].end(),cmp);
  134. sum[j].resize(mem[j].size());
  135. for(reg i=;i<(int)mem[j].size();++i){
  136. sum[j][i]=len[mem[j][i]];
  137. con[j]+=(ll)len[mem[j][i]]*abs(pre[mem[j][i]]);
  138. if(i) sum[j][i]+=sum[j][i-];
  139. }
  140. tag[j]=;
  141. ans+=con[j];
  142.  
  143. for(reg i=L[be[r]];i<=r;++i){
  144. pre[i]+=c;
  145. }
  146. j=be[r];
  147. ans-=con[j];
  148. con[j]=;
  149. mem[j].clear();
  150. sum[j].clear();
  151. for(reg i=L[j];i<=R[j];++i){
  152. pre[i]+=tag[j];
  153. mem[j].push_back(i);
  154. }
  155. sort(mem[j].begin(),mem[j].end(),cmp);
  156. sum[j].resize(mem[j].size());
  157. for(reg i=;i<(int)mem[j].size();++i){
  158. sum[j][i]=len[mem[j][i]];
  159. con[j]+=(ll)len[mem[j][i]]*abs(pre[mem[j][i]]);
  160. if(i) sum[j][i]+=sum[j][i-];
  161. }
  162. tag[j]=;
  163. ans+=con[j];
  164.  
  165. for(reg j=be[l]+;j<=be[r]-;++j){
  166. pre[]=-tag[j];
  167. if(c==-){
  168. int lp=upper_bound(mem[j].begin(),mem[j].end(),,cmp)-mem[j].begin();
  169. --lp;//warning!! maybe -1
  170. if(lp!=-){
  171. ans+=(ll)sum[j][lp];
  172. ans-=(ll)sum[j][mem[j].size()-]-sum[j][lp];
  173. con[j]+=(ll)sum[j][lp];
  174. con[j]-=(ll)sum[j][mem[j].size()-]-sum[j][lp];
  175. }else{
  176. ans-=(ll)sum[j][mem[j].size()-];
  177. con[j]-=(ll)sum[j][mem[j].size()-];
  178. }
  179.  
  180. }else{
  181. int lp=lower_bound(mem[j].begin(),mem[j].end(),,cmp)-mem[j].begin();
  182. --lp;//warning!! maybe -1
  183. if(lp!=-){
  184. ans-=(ll)sum[j][lp];
  185. ans+=(ll)sum[j][mem[j].size()-]-sum[j][lp];
  186. con[j]-=(ll)sum[j][lp];
  187. con[j]+=(ll)sum[j][mem[j].size()-]-sum[j][lp];
  188. }else{
  189. ans+=(ll)sum[j][mem[j].size()-];
  190. con[j]+=(ll)sum[j][mem[j].size()-];
  191. }
  192. }
  193. tag[j]+=c;
  194. }
  195. pre[]=;
  196. }
  197. pos[q[o].id]=q[o].x;
  198. printf("%lld\n",ans);
  199. }
  200. return ;
  201. }
  202.  
  203. }
  204. signed main(){
  205. Miracle::main();
  206. return ;
  207. }
  208.  
  209. /*
  210. Author: *Miracle*
  211. Date: 2019/4/11 10:31:35
  212. */

[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. spring mvc常用注解总结

    1.@RequestMapping@RequestMappingRequestMapping是一个用来处理请求地址映射的注解(将请求映射到对应的控制器方法中),可用于类或方法上.用于类上,表示类中的所 ...

  2. Laravel5.5+ 区分前后端用户登录

    Laravel 的用户认证是通过 Auth Facade 门脸实现的,手动认证可是使用  Auth::login() 或 Auth::attempt() 这两个方法实现. 以下内容纯属个人实现,也许有 ...

  3. java回调机制——基本理解

    回调(diao):往回调用,反向调用. 英文 call back.call:调用,back:返回,往返. 回调的意思就是杀个回马枪...... 回调(callback),既然是往回调用,那自然有一个正 ...

  4. ajax获取值的两种方法

    详细连接https://blog.csdn.net/a1102325298/article/details/80785143 ajax获得表单值的俩种方法 2018年06月23日 17:12:02 延 ...

  5. Linux基础学习笔记6-SHELL编程

    编程基础 程序:指令+数据 程序编程风格: 过程式:以指令为中心,数据服务于指令 对象式:以数据为中心,指令服务于数据 shell程序:提供了编程能力,解释执行 编程基本概念: 顺序执行:循环执行:选 ...

  6. Delphi 工具条按钮上的下拉菜单

    制作步骤: 1.添加一个 TImageList: ImageList1, 然后载入些图标; 2.添加两个 TPopupMenu: PopupMenu1.PopupMenu2, 并分别添加些菜单项; 3 ...

  7. Python——Flask框架——数据库

    一.数据库框架 Flask-SQLAlchemy (1)安装: pip install flask-sqlalchemy (2)Flask-SQLAlchemy数据库URL 数据库引擎 URL MyS ...

  8. Lodop打印设计、维护、预览、直接打印简单介绍

    四者的区别和联系:(其中PRINT_DESIGN打印设计是提供给开发人员的,另外三个可开放给用户)PRINT_DESIGN打印设计:辅助开发人员设计,图形化拖动插入修改等,设计完成后,生成代码拷贝到程 ...

  9. oracle复习(二)

    十一.replace 替换格式:(原字符串,要查找的字符或字符串,替换的字符或字符串)select replace('hello world','o','a') from dual; //替换时区分大 ...

  10. js弹框的3种方法

    js的三种弹框的方法 1.第一种 :  alert("1"); 2.第二种 :  window.open("Tests2.html"); var r = con ...