[loj2585][APIO2018]新家
题目
一条街上有\(n\) 个点,坐标为\(x_i\) , 店的种类为\(t_i\) , 开业时间为 \([a_i,b_i]\) ;
定义一种类型到一个点的距离为这种类的点到这个点的最近距离 ;
定义一个点的不方便度为此时所有所有种类的店离这个点的距离的最大值(种类不足直接为-1);
给出种类总数和询问数 \(m\) , 回答在 \(y_j\) 时间下,位置 \(l_j\) 的不方便度 ;
$1 \le n , q \le 3 \times 10^5 \ , \ 1 \le k \le n $
$ 1 \le x_i,a_i,b_i \le 10^9 \ , \ 1 \le t_i \le k \ , \ a_i \le b_i $
$1 \le l_i \ , \ y_i \le 10^8 $
题解
对时间做扫描线,只需要维护支持加入和删除点的查询;
二分答案,考虑在$ [ x - mid , x + mid] $中间是否存在所有颜色的点;
用 \(set\) 维护每种颜色的前驱pre,条件转化成: \((x+mid,inf)\) 的 \(mn \{ pre \} \ge x - mid\)
为了方便你可以设置一个-inf点和inf点,并把所有颜色都先分别扔一个到inf和-inf上 ;
用线段树套堆就可以做到$n \ log^2 n $ , 在线段树里面二分 \(x+ans\) 的位置即可做到 $n log \ n $ ;
//很清新的数据结构;
#include<bits/stdc++.h>
#define inf (1e9 + 1)
using namespace std;
const int N=300010;
int n,K,q,tot,cnt,ans[N];
multiset<int>s[N],ss[N*64];
multiset<int>::iterator it,itt;
int rt,mn[N*64],ls[N*64],rs[N*64],sz;
struct data{
int x,c,t,op;
bool operator <(const data&A)const{return t==A.t?op<A.op:t<A.t;}
}A[N<<2];
char gc(){
static char*p1,*p2,S[1000000];
if(p1==p2)p2=(p1=S)+fread(S,1,1000000,stdin);
return(p1==p2)?EOF:*p1++;
}
int rd(){
int x=0;char c=gc();
while(c<'0'||c>'9')c=gc();
while(c>='0'&&c<='9')x=x*10+c-'0',c=gc();
return x;
}
void update(int&k,int l,int r,int x,int add,int del){
if(!k)k=++sz;
if(l==r){
if(~add)ss[k].insert(add);
if(~del)ss[k].erase(ss[k].find(del));
mn[k]=ss[k].empty() ? inf : *ss[k].begin();//
return ;
}
int mid=(l+r)>>1;
if(x<=mid)update(ls[k],l,mid,x,add,del);
else if(x>mid)update(rs[k],mid+1,r,x,add,del);
mn[k]=min(mn[ls[k]],mn[rs[k]]);
}
int query(int x){
int k=rt,l=1,r=inf,mnv=inf;//
while(l<r){
int mid=(l+r)>>1,tmp=min(mnv,mn[rs[k]]);
if(mid>=x&&tmp>=2*x-mid)k=ls[k],r=mid,mnv=tmp;
else k=rs[k],l=mid+1;
}
return l - x;
}
int main(){
// freopen("A.in","r",stdin);
// freopen("A.out","w",stdout);
n=rd();K=rd();q=rd();mn[0]=inf;//
for(int i=1;i<=K;++i)s[i].insert(-inf),s[i].insert(inf);//
for(int i=1;i<=n;++i){
int x=rd(),t=rd(),a=rd(),b=rd();
A[++tot]=(data){x,t,a,0};
A[++tot]=(data){x,t,b+1,1};
}
for(int i=1;i<=q;++i){
int l=rd(),y=rd();
A[++tot]=(data){l,i,y,2};
}
sort(A+1,A+tot+1);
for(int i=1;i<=K;++i)update(rt,1,inf,inf,-inf,-1);//
for(int i=1;i<=tot;++i){
int opt=A[i].op,c=A[i].c,x=A[i].x;
if(!opt){
it=itt=s[c].upper_bound(x);--itt;
update(rt,1,inf,*it,x,*itt);
update(rt,1,inf,x,*itt,-1);
if(s[c].size()==2)cnt++;
s[c].insert(x);
}else if(opt&1){
it=itt=s[c].upper_bound(x);--itt;--itt;
update(rt,1,inf,x,-1,*itt);
update(rt,1,inf,*it,*itt,x);
s[c].erase(++itt);
if(s[c].size()==2)cnt--;
}else ans[c]=cnt<K?-1:query(x);
}
for(int i=1;i<=q;++i)printf("%d\n",ans[i]);
return 0;
}
[loj2585][APIO2018]新家的更多相关文章
- 「APIO2018新家」
「APIO2018新家」 题目描述 五福街是一条笔直的道路,这条道路可以看成一个数轴,街上每个建筑物的坐标都可以用一个整数来表示.小明是一位时光旅行者,他知道在这条街上,在过去现在和未来共有 \(n\ ...
- LOJ.2585.[APIO2018]新家(二分 线段树 堆)
LOJ 洛谷 UOJ BZOJ 四OJ Rank1 hhhha 表示这个b我能装一年→_→ 首先考虑离线,将询问按时间排序.对于每个在\([l,r]\)出现的颜色,拆成在\(l\)加入和\(r+1\) ...
- BZOJ5462 APIO2018新家(线段树+堆)
一个显然的做法是二分答案后转化为查询区间颜色数,可持久化线段树记录每个位置上一个同色位置,离线后set+树状数组套线段树维护.这样是三个log的. 注意到我们要知道的其实只是是否所有颜色都在该区间出现 ...
- [BZOJ5462][APIO2018]新家(线段树+堆)
其实这个题第一反应一定是线段树分治,但是这样反而更难考虑了(实际上是可做的但很难想到),可见即使看上去最贴切的算法也未必能有效果. 考虑这个DS题,没有什么模型的转化,可能用到的无非就是线段树.平衡树 ...
- 【APIO2018】新家(线段树)
[APIO2018]新家(线段树) 题面 UOJ 洛谷 BZOJ 题解 论比赛时想不到二分的危害,就只能Cu滚粗 既然不要在线,那么考虑离线做法. 既然时间是区间,那么显然按照时间顺序处理答案. 显然 ...
- LOJ #2585. 「APIO2018」新家
#2585. 「APIO2018」新家 https://loj.ac/problem/2585 分析: 线段树+二分. 首先看怎样数颜色,正常的时候,离线扫一遍右端点,每次只记录最右边的点,然后查询左 ...
- 此博客主人已搬家访问新家地址:http://write.blog.csdn.net/postlist
此博客主人已搬家访问新家地址:http://write.blog.csdn.net/postlist
- BZOJ 3631 【JLOI2014】 松鼠的新家
Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树&q ...
- 【BZOJ-3631】松鼠的新家 树形DP?+ 倍增LCA + 打标记
3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1231 Solved: 620[Submit][Stat ...
随机推荐
- springboot+thymeleaf刨坑——首页加载js/css等失败解决方法
在使用thymeleaf加载css或js样式,当我们进入登录页的时候发现,所有的样式都是加载失败的.原因是在新版中有这样一个坑……: 当我们设置了addInterceptors-注册拦截器的时候,通常 ...
- React Native 教程:001 - 如何运行官方控件示例 App
原文发表于我的技术博客 本文主要讲解了如何运行 React Native 官方控件示例 App,包含了一些 React Native 的基础知识以及相关环境的配置. 原文发表于我的技术博客 React ...
- 暴雪《争霸艾泽拉斯》*采用自适应 SSAO
在实时渲染过程中,屏幕空间环境光遮蔽 (SSAO) 常用于打造小范围环境光效果和接触阴影效果.它用于许多现代游戏,通常占用 5% 到 10% 的帧时间.在<争霸艾泽拉斯>* 游戏开发过程中 ...
- 由一个“两次请求”引出的Web服务器跨域请求访问问题的解决方案
http://blog.csdn.net/cnhnnyzhy/article/details/53128179 (4)Access-Control-Max-Age 该字段可选,用来指定本次预检请求的有 ...
- Keepalived基础知识-运维小结
keepalived介绍keepalived观察其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,它集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防 ...
- VS2013软件的安装和单元测试
VS2013是什么? 微软在Builder 2013开发者大会上发布了Visual Studio 2013预览版,并且发布其程序组件库.NET 4.5.1的预览版.该软件已于北京时间2013年11月1 ...
- 关于第二次阅读作业中"银弹"“大泥球”等的个人理解
这几天时间比较充裕,就一点一点的借助英语翻译(毕竟英语不好)阅读了一下老师建议的论文作品.感觉他们的思维和我们的是不在一个角度上的,在我们看来,编写代码的任务仅仅就是实现了设计文档中的功能,而这些在课 ...
- 伪GZCC官网
<html class="no-js"><head> <meta charset="utf-8"> <meta htt ...
- 转角遇见——Software
第一部分:结缘计算机 从五岁开始读书,懵懵懂懂,从小就听长辈们说一定要考一个好大学,高三老师们就更是说:“过了高考,人生就无忧了”.于是似乎,高考就好像是我自出生以来这么多年的唯一愿景.高考成绩下来后 ...
- [2017BUAA软工]第零次博客作业
第一部分:结缘计算机 1. 你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢?(必答) 当年高考前在专业这件事上纠结了好久,因为我对于大学各个专业具体学什么都不甚了解,于是就迟迟没有明确的目 ...