首先可以将攻击位置整理成折线,答案不变。

对于一个长度为$k$的询问,若折线不超过两段,那么显然可以暴力贪心求解。

否则考虑折线中最短的一段$x\rightarrow y$,若其长度$\leq k$:

$1.$若$x$是第一个点,那么删除$x$后答案不变。

$2.$若$y$是最后一个点,那么删除$y$后答案不变。

$3.$否则$x\rightarrow y$位于折线中间,删除$x$和$y$后答案不变。

如此重复处理之后,每一段长度均$>k$,这说明经过第一段折线后当前询问区间必然位于折线之中,故答案为折线长度减去区间长度。

将询问按长度从小到大考虑,用链表维护折线,用堆维护最短的折线即可。

时间复杂度$O(n\log n)$。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<queue>
  4. #include<vector>
  5. using namespace std;
  6. typedef pair<int,int>P;
  7. typedef long long ll;
  8. const int N=200010,BUF=10000000,OUT=5000000;
  9. char Buf[BUF],*buf=Buf,Out[OUT],*ou=Out;int Outn[30],Outcnt;
  10. int n,_,m,i,x,b[N],pre[N],nxt[N],cnt,st;bool del[N];ll ans[N],sum;
  11. priority_queue<P,vector<P>,greater<P> >q;
  12. struct E{int x,y,p;}a[N];
  13. inline bool cmp(const E&a,const E&b){return a.y-a.x<b.y-b.x;}
  14. inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
  15. inline void write(ll x){
  16. if(!x)*ou++=48;
  17. else{
  18. for(Outcnt=0;x;x/=10)Outn[++Outcnt]=x%10+48;
  19. while(Outcnt)*ou++=Outn[Outcnt--];
  20. }
  21. }
  22. inline ll ask(int x,int y){
  23. ll ret=sum,c=cnt,k;
  24. for(int i=0,o=st;i<2&&o;o=nxt[o],i++){
  25. if(pre[o])ret-=abs(b[o]-b[pre[o]]),c--;
  26. if(y<b[o]){
  27. k=b[o]-y;
  28. ret+=k;
  29. x+=k,y+=k;
  30. }
  31. if(x>b[o]){
  32. k=x-b[o];
  33. ret+=k;
  34. x-=k,y-=k;
  35. }
  36. }
  37. return ret-c*(y-x);
  38. }
  39. inline void adjust(int lim){
  40. while(!q.empty()&&cnt>=2){
  41. P t=q.top();
  42. if(t.first>lim)return;
  43. q.pop();
  44. int x=t.second;
  45. if(del[x]||x==st)continue;
  46. int y=pre[x];
  47. if(abs(b[x]-b[y])!=t.first)continue;
  48. if(y==st){
  49. del[y]=1;
  50. pre[st=x]=0;
  51. cnt--;
  52. sum-=abs(b[x]-b[y]);
  53. continue;
  54. }
  55. if(!nxt[x]){
  56. del[x]=1;
  57. nxt[y]=0;
  58. cnt--;
  59. sum-=abs(b[x]-b[y]);
  60. continue;
  61. }
  62. int A=pre[y],B=nxt[x];
  63. cnt-=2;
  64. sum-=abs(b[A]-b[y]);
  65. sum-=abs(b[x]-b[y]);
  66. sum-=abs(b[x]-b[B]);
  67. sum+=abs(b[A]-b[B]);
  68. nxt[A]=B,pre[B]=A;
  69. del[x]=del[y]=1;
  70. q.push(P(abs(b[A]-b[B]),B));
  71. }
  72. }
  73. int main(){
  74. fread(Buf,1,BUF,stdin);read(n),read(_);
  75. for(i=1;i<=n;i++)read(a[i].x),read(a[i].y),a[i].p=i;
  76. while(_--){
  77. read(x);
  78. if(!m){b[++m]=x;continue;}
  79. if(x==b[m])continue;
  80. if(m>1&&(x<b[m])==(b[m]<b[m-1]))b[m]=x;else b[++m]=x;
  81. }
  82. for(st=i=1;i<=m;i++){
  83. if(i>1)pre[i]=i-1;
  84. if(i<m)nxt[i]=i+1;
  85. if(i>1){
  86. q.push(P(abs(b[i]-b[i-1]),i));
  87. cnt++;
  88. sum+=abs(b[i]-b[i-1]);
  89. }
  90. }
  91. sort(a+1,a+n+1,cmp);
  92. for(i=1;i<=n;i++)adjust(a[i].y-a[i].x),ans[a[i].p]=ask(a[i].x,a[i].y);
  93. for(i=1;i<=n;i++)write(ans[i]),*ou++='\n';
  94. fwrite(Out,1,ou-Out,stdout);
  95. return 0;
  96. }

  

BZOJ4249 : Walls 防壁的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. BZOJ4829: [Hnoi2017]队长快跑

    BZOJ4829: [Hnoi2017]队长快跑 Description 众所周知,在P国外不远处盘踞着巨龙大Y. 传说中,在远古时代,巨龙大Y将P国的镇国之宝窃走并藏在了其巢穴中,这吸引着整个P国的 ...

  3. [CSP-S模拟测试]:队长快跑(DP+离散化+线段树)

    题目背景 传说中,在远古时代,巨龙大$Y$将$P$国的镇国之宝窃走并藏在了其巢穴中,这吸引着整个$P$国的所有冒险家前去夺回,尤其是皇家卫士队的队长小$W$.在$P$国量子科技实验室的帮助下,队长小$ ...

  4. 阿里巴巴直播内容风险防控中的AI力量

    直播作为近来新兴的互动形态和今年阿里巴巴双十一的一大亮点,其内容风险监控是一个全新的课题,技术的挑战非常大,管控难点主要包括业界缺乏成熟方案和标准.主播行为.直播内容不可控.峰值期间数千路高并发处理. ...

  5. 【前端安全】JavaScript防http劫持与XSS

    作为前端,一直以来都知道HTTP劫持与XSS跨站脚本(Cross-site scripting).CSRF跨站请求伪造(Cross-site request forgery).但是一直都没有深入研究过 ...

  6. 使用KRPano资源分析工具强力加密KRPano项目(XML防破解,切片图保护,JS反调试)

    软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278936(软件免费版本在群内提供) 最新博客地址:blog.turenlong.com 限时下载地址:htt ...

  7. 防刷票机制研究和.NET HttpRequest Proxy

    最近应朋友之约 测试他做的投票网站 防刷票机制能力如何,下面有一些心得和体会. 朋友网站用PHP写的,走的是HttpRequest,他一开始认为IP认证应该就差不多了.但说实话这种很low,手动更换代 ...

  8. [No000080]右键解锁增强Chrome插件开发,破除防复制

    昨天用360极速(虽然我不喜欢360.)浏览器,登陆知乎查阅一些东西,突然感觉有些观点很赞同,想copy转载一下,我了个去,它丫的居然不让我复制. 地址:https://www.zhihu.com/q ...

  9. 判断来防ip是否为蜘蛛

    判断网站来防IP是否为蜘蛛,用命令查询 :     一.在windows平台 蜘蛛反查命令:nslookup IP 点击"开始"-"运行"-"cmd& ...

随机推荐

  1. How does exercise keep your brain young?

    Exercise may protect the brain from disease and dementia as we age, but the mechanisms behind its be ...

  2. 将txt文本转换为excel格式

    将txt文本转换为excel格式,中间使用的列分割为 tab 键 一.使用xlwt模块 注:Excel 2003 一个工作表行数限制65536,列数限制256 需要模块:xlwt 模块安装:xlwt ...

  3. .NET Framework 类库——C#命名空间大全

    引用地址:https://msdn.microsoft.com/zh-cn/library/gg145045.aspx C# using引用时,不知道有哪些命名空间,这下转载收集一篇,方面查找使用. ...

  4. Redis 学习手册

    一:Redis的简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,和Memcached类似,它支持存储的value类型相对更多,包 ...

  5. Visual Studio "14" CTPs

    下载地址:http://www.visualstudio.com/en-us/downloads/visual-studio-14-ctp-vs       上张有亮点的图: 实现亮点的方法(Remo ...

  6. NPOI导出Excel帮助类

    工具类 using System; using System.Collections.Generic; using System.Data; using System.IO; using System ...

  7. 牛客网练习赛t2(线段树)

    题解: 好像因为他说了 数据范围全部在ll以内 所以直接暴力就可以过了 比较正常是用线段树来维护 洛谷上有道模板题是支持加,乘,区间和 而这题还多了区间平方和的操作 按照那题的操作 我们维护的时候保证 ...

  8. BZOJ4675

    题解: 考虑这么一件事情,n个人买彩票,在不断抽走卡片的时候,他们的中奖概率是不变的 所以在这道题中,由于每个人的操作次数是确定的,所以选每k个点的概率是相同的(因为如果我们逐一考虑每一次操作这个问题 ...

  9. centos 6.9安装python 3.6

    .下载源码包在官网按照需要下载到本地 wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz .解压源码包 tar -xvf Pyt ...

  10. eclipse启动web应用

    在建好web项目的基础上: (1)配置tomcat服务器 点击window---->Preference----->Server---->Runtime Environment--- ...