BZOJ4249 : Walls 防壁
首先可以将攻击位置整理成折线,答案不变。
对于一个长度为$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 防壁的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ4829: [Hnoi2017]队长快跑
BZOJ4829: [Hnoi2017]队长快跑 Description 众所周知,在P国外不远处盘踞着巨龙大Y. 传说中,在远古时代,巨龙大Y将P国的镇国之宝窃走并藏在了其巢穴中,这吸引着整个P国的 ...
- [CSP-S模拟测试]:队长快跑(DP+离散化+线段树)
题目背景 传说中,在远古时代,巨龙大$Y$将$P$国的镇国之宝窃走并藏在了其巢穴中,这吸引着整个$P$国的所有冒险家前去夺回,尤其是皇家卫士队的队长小$W$.在$P$国量子科技实验室的帮助下,队长小$ ...
- 阿里巴巴直播内容风险防控中的AI力量
直播作为近来新兴的互动形态和今年阿里巴巴双十一的一大亮点,其内容风险监控是一个全新的课题,技术的挑战非常大,管控难点主要包括业界缺乏成熟方案和标准.主播行为.直播内容不可控.峰值期间数千路高并发处理. ...
- 【前端安全】JavaScript防http劫持与XSS
作为前端,一直以来都知道HTTP劫持与XSS跨站脚本(Cross-site scripting).CSRF跨站请求伪造(Cross-site request forgery).但是一直都没有深入研究过 ...
- 使用KRPano资源分析工具强力加密KRPano项目(XML防破解,切片图保护,JS反调试)
软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278936(软件免费版本在群内提供) 最新博客地址:blog.turenlong.com 限时下载地址:htt ...
- 防刷票机制研究和.NET HttpRequest Proxy
最近应朋友之约 测试他做的投票网站 防刷票机制能力如何,下面有一些心得和体会. 朋友网站用PHP写的,走的是HttpRequest,他一开始认为IP认证应该就差不多了.但说实话这种很low,手动更换代 ...
- [No000080]右键解锁增强Chrome插件开发,破除防复制
昨天用360极速(虽然我不喜欢360.)浏览器,登陆知乎查阅一些东西,突然感觉有些观点很赞同,想copy转载一下,我了个去,它丫的居然不让我复制. 地址:https://www.zhihu.com/q ...
- 判断来防ip是否为蜘蛛
判断网站来防IP是否为蜘蛛,用命令查询 : 一.在windows平台 蜘蛛反查命令:nslookup IP 点击"开始"-"运行"-"cmd& ...
随机推荐
- 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 ...
- 将txt文本转换为excel格式
将txt文本转换为excel格式,中间使用的列分割为 tab 键 一.使用xlwt模块 注:Excel 2003 一个工作表行数限制65536,列数限制256 需要模块:xlwt 模块安装:xlwt ...
- .NET Framework 类库——C#命名空间大全
引用地址:https://msdn.microsoft.com/zh-cn/library/gg145045.aspx C# using引用时,不知道有哪些命名空间,这下转载收集一篇,方面查找使用. ...
- Redis 学习手册
一:Redis的简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,和Memcached类似,它支持存储的value类型相对更多,包 ...
- Visual Studio "14" CTPs
下载地址:http://www.visualstudio.com/en-us/downloads/visual-studio-14-ctp-vs 上张有亮点的图: 实现亮点的方法(Remo ...
- NPOI导出Excel帮助类
工具类 using System; using System.Collections.Generic; using System.Data; using System.IO; using System ...
- 牛客网练习赛t2(线段树)
题解: 好像因为他说了 数据范围全部在ll以内 所以直接暴力就可以过了 比较正常是用线段树来维护 洛谷上有道模板题是支持加,乘,区间和 而这题还多了区间平方和的操作 按照那题的操作 我们维护的时候保证 ...
- BZOJ4675
题解: 考虑这么一件事情,n个人买彩票,在不断抽走卡片的时候,他们的中奖概率是不变的 所以在这道题中,由于每个人的操作次数是确定的,所以选每k个点的概率是相同的(因为如果我们逐一考虑每一次操作这个问题 ...
- centos 6.9安装python 3.6
.下载源码包在官网按照需要下载到本地 wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz .解压源码包 tar -xvf Pyt ...
- eclipse启动web应用
在建好web项目的基础上: (1)配置tomcat服务器 点击window---->Preference----->Server---->Runtime Environment--- ...