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

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

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

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

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

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

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

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

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

#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
typedef pair<int,int>P;
typedef long long ll;
const int N=200010,BUF=10000000,OUT=5000000;
char Buf[BUF],*buf=Buf,Out[OUT],*ou=Out;int Outn[30],Outcnt;
int n,_,m,i,x,b[N],pre[N],nxt[N],cnt,st;bool del[N];ll ans[N],sum;
priority_queue<P,vector<P>,greater<P> >q;
struct E{int x,y,p;}a[N];
inline bool cmp(const E&a,const E&b){return a.y-a.x<b.y-b.x;}
inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
inline void write(ll x){
if(!x)*ou++=48;
else{
for(Outcnt=0;x;x/=10)Outn[++Outcnt]=x%10+48;
while(Outcnt)*ou++=Outn[Outcnt--];
}
}
inline ll ask(int x,int y){
ll ret=sum,c=cnt,k;
for(int i=0,o=st;i<2&&o;o=nxt[o],i++){
if(pre[o])ret-=abs(b[o]-b[pre[o]]),c--;
if(y<b[o]){
k=b[o]-y;
ret+=k;
x+=k,y+=k;
}
if(x>b[o]){
k=x-b[o];
ret+=k;
x-=k,y-=k;
}
}
return ret-c*(y-x);
}
inline void adjust(int lim){
while(!q.empty()&&cnt>=2){
P t=q.top();
if(t.first>lim)return;
q.pop();
int x=t.second;
if(del[x]||x==st)continue;
int y=pre[x];
if(abs(b[x]-b[y])!=t.first)continue;
if(y==st){
del[y]=1;
pre[st=x]=0;
cnt--;
sum-=abs(b[x]-b[y]);
continue;
}
if(!nxt[x]){
del[x]=1;
nxt[y]=0;
cnt--;
sum-=abs(b[x]-b[y]);
continue;
}
int A=pre[y],B=nxt[x];
cnt-=2;
sum-=abs(b[A]-b[y]);
sum-=abs(b[x]-b[y]);
sum-=abs(b[x]-b[B]);
sum+=abs(b[A]-b[B]);
nxt[A]=B,pre[B]=A;
del[x]=del[y]=1;
q.push(P(abs(b[A]-b[B]),B));
}
}
int main(){
fread(Buf,1,BUF,stdin);read(n),read(_);
for(i=1;i<=n;i++)read(a[i].x),read(a[i].y),a[i].p=i;
while(_--){
read(x);
if(!m){b[++m]=x;continue;}
if(x==b[m])continue;
if(m>1&&(x<b[m])==(b[m]<b[m-1]))b[m]=x;else b[++m]=x;
}
for(st=i=1;i<=m;i++){
if(i>1)pre[i]=i-1;
if(i<m)nxt[i]=i+1;
if(i>1){
q.push(P(abs(b[i]-b[i-1]),i));
cnt++;
sum+=abs(b[i]-b[i-1]);
}
}
sort(a+1,a+n+1,cmp);
for(i=1;i<=n;i++)adjust(a[i].y-a[i].x),ans[a[i].p]=ask(a[i].x,a[i].y);
for(i=1;i<=n;i++)write(ans[i]),*ou++='\n';
fwrite(Out,1,ou-Out,stdout);
return 0;
}

  

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. java & python猜数字游戏对比

    1.java版 package day03; import java.util.Random;import java.util.Scanner; /** * 猜数字游戏 * 随机生成一个1-100之间 ...

  2. 华硕X75VB安装ubuntu12.10网卡不可用等相关问题总结

    笔记本相关信息: 电脑型号:华硕X75VB 笔记本电脑 处理器:i5-3230M 2.60GHz 双核 主板:华硕X75VB (英特尔 Ivy Bridge - HM76 Express芯片组) 内存 ...

  3. 金蝶核算项目余额表卡号余额与天财商龙CRM卡号余额对比

    金蝶核算项目余额表卡号余额与天财尚龙CRM卡号余额对比 由于历史遗留问题,财务一直不调账,修改核算科目卡号与天财商龙CRM系统一直,只能用VBA把卡号前缀修改成两边一致. 再通过,Power BI D ...

  4. 一条bash命令,清除指定的网络接口列表

    在K8S的安装配置过程, 由于不断的测试, 会不断的生成各式各样的虚拟网络接口. 那么,不重新安装之前,清除前次产生的这些垃圾接口, 不让它们影响下次的测试,是很有必要的. 如何快速删除呢? 如下命令 ...

  5. [转] Webpack-CommonsChunkPlugin

    当前项目结构   项目结构 其中 Greeter.js 引用了 config.json main.js 和 second.js 都引用了 Greeter.js main.js 还引用了 onlyfor ...

  6. 【bzoj1264】[AHOI2006]基因匹配Match 树状数组

    题解: 一道比较简单的题目 容易发现状态数只有5*n个 而转移需要满足i1<i2;j1<j2 那么很明显是二维平面数点 暴力一点就是二维树状数组+map 5nlog^3 比较卡常 但是注意 ...

  7. python之logging

    1.简单使用 # CRITICAL, ERROR, WARNING, INFO, DEBUG) cewid import logging logging.basicConfig(level=loggi ...

  8. OpenGL搭建环境-VS2012【OpenGL】

    在学习cocos2dx时,其底层就用到了OpenGL,因此,想要能够精通cocos2dx,还是需要了解OpenGL的. 本着这个目的,开始搭建OpenGL的环境,并进行学习. OpenGL环境的搭建相 ...

  9. Python_logging模块

    日志:方便用户了解系统.软件或应用的运行情况,及时发现问题并快速定位.解决问题. 一个日志信息对应的是一个事件的发生,而一个事件需要包括的几个内容: 事件发生时间 事件发生位置 事件发生严重程度(日志 ...

  10. Python_列表常用操作

    %d   数字 %f    浮点 %s    字符串 字符串常用功能: .strip()   默认去掉字符串两边空格#或者在括号里注明去除什么 查看列表方法:dir(列表名) .append(元素): ...