[bzoj5462]新家
先离线,将询问按照时间排序,维护商店出现和消失
对于每一个询问,先二分枚举答案,假设是ans,
即要求对于区间[l-ans,l+ans],商店的种类数是k(l是询问的位置)
(当然需要先将所有位置离散一下,l-ans和l+ans找到等价的位置)
那个条件并不是很好处理,但可以转化成另一个条件:
l+ans以后的每一个商店的前驱(上一个同类型商店)都不在l-ans之前
,只需要快速求前驱和前驱的最小值就可以了,可以套数据结构
具体来说,就是维护一个线段树和一个set,分别表示:
1.商店前驱的线段树(离散,维护区间min);2.每一种类型的set(查找前驱)
(但因为这个前驱需要支持删除,线段树的叶子节点还要开一个set)
这样的复杂度是o(nlog^2n),但可以直接在线段树上二分:
线段树上二分的是l+ans(二分出来的结果再减掉ans就行了),设
答案是k,答案合法当且仅当k+k的后缀最小值<=2l(l是询问位置)
,而后缀最小值可以在递归下来的时候不断维护,因此可行
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 300005
4 #define mid (l+r>>1)
5 #define oo 0x3f3f3f3f
6 struct ji{
7 int x,k,t,p;
8 bool operator < (const ji &a)const{
9 return (t<a.t)||(t==a.t)&&(p>a.p);
10 }
11 }a[N*3];
12 map<int,int>mat;
13 multiset<int>s1[N],s2[N];
14 multiset<int>::iterator it1,it2;
15 int V,VV,n,m,k,q,r,ans[N],f[N*30],ls[N*30],rs[N*30];
16 void read(){
17 for(int i=1;i<=n;i++){
18 m++;
19 scanf("%d%d%d",&a[m].x,&a[m].k,&a[m].t);
20 a[m++].p=1;
21 a[m]=a[m-1];
22 scanf("%d",&a[m].t);
23 a[m].p=-1;
24 }
25 for(int i=1;i<=q;i++){
26 m++;
27 scanf("%d%d",&a[m].x,&a[m].t);
28 a[m].k=i;
29 }
30 sort(a+1,a+m+1);
31 }
32 void update(int &k,int l,int r,int x,int y,int z){
33 if (!k)k=++V;
34 if (l==r){
35 if (!mat[l])mat[l]=++VV;
36 l=mat[l];
37 if (y)s2[l].insert(y);
38 if (z)s2[l].erase(s2[l].lower_bound(z));
39 if (!s2[l].size())f[k]=oo;
40 else f[k]=*s2[l].begin();
41 return;
42 }
43 if (x<=mid)update(ls[k],l,mid,x,y,z);
44 else update(rs[k],mid+1,r,x,y,z);
45 f[k]=min(f[ls[k]],f[rs[k]]);
46 }
47 int query(int k,int l,int r,int x,int y){
48 if (l==r)
49 if (l==oo)return -1;
50 else return l-x;
51 if ((mid<x)||(mid+min(y,f[rs[k]])<2*x))return query(rs[k],mid+1,r,x,y);
52 return query(ls[k],l,mid,x,min(y,f[rs[k]]));
53 }
54 void add(int x,int k){
55 it1=s1[k].upper_bound(x);
56 it2=it1--;
57 update(r,1,oo,x,*it1,0);
58 update(r,1,oo,*it2,x,*it1);
59 s1[k].insert(x);
60 }
61 void del(int x,int k){
62 s1[k].erase(s1[k].lower_bound(x));
63 it1=s1[k].upper_bound(x);
64 it2=it1--;
65 update(r,1,oo,x,0,*it1);
66 update(r,1,oo,*it2,*it1,x);
67 }
68 int main(){
69 scanf("%d%d%d",&n,&k,&q);
70 read();
71 f[0]=oo;
72 for(int i=1;i<=k;i++){
73 s1[i].insert(-oo);
74 s1[i].insert(oo);
75 update(r,1,oo,oo,-oo,0);
76 }
77 for(int i=1;i<=m;i++){
78 if (a[i].p>0)add(a[i].x,a[i].k);
79 if (a[i].p<0)del(a[i].x,a[i].k);
80 if (!a[i].p)ans[a[i].k]=query(r,1,oo,a[i].x,oo);
81 }
82 for(int i=1;i<=q;i++)printf("%d\n",ans[i]);
83 }
[bzoj5462]新家的更多相关文章
- 此博客主人已搬家访问新家地址: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 ...
- 【bzoj3631】[JLOI2014]松鼠的新家
题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树"上.松 ...
- 【BZOJ3631】松树的新家 树链剖分
BZOJ3631 松树的新家 Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...
- BZOJ 3631: [JLOI2014]松鼠的新家( 树链剖分 )
裸树链剖分... ------------------------------------------------------------------- #include<bits/stdc++ ...
- 3631: [JLOI2014]松鼠的新家
3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 707 Solved: 342[Submit][Statu ...
- [填坑]树上差分 例题:[JLOI2014]松鼠的新家(LCA)
今天算是把LCA这个坑填上了一点点,又复习(其实是预习)了一下树上差分.其实普通的差分我还是会的,树上的嘛,也是懂原理的就是没怎么打过. 我们先来把树上差分能做到的看一下: 1.找所有路径公共覆盖的边 ...
- [JLOI2014] 松鼠的新家
Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树&q ...
随机推荐
- gcc、g++、gdb安装
Windows安装 有闲工夫在Windows上安装g++/gcc/gdb,还不如装个虚拟机安装Linux,在Linux上安装 但是我还是要讲的 首先,需要安装MinGW,MinGW,是Minimali ...
- logstash输出到rabbitmq
场景 将应用日志文件发送到rabbitmq. filebeat 不支持rabbitmq作为输出.因此,需要先将文件由filebeat发送到logstash ,再由logstash 输出到rabbitm ...
- javascript-原生-闭包
1.变量的作用域 前提:这里只全部都通过var创建的变量或对象 1.全局变量:函数外创建变量 var x=10; function test(){ alert("全局变量在test函数中&q ...
- javascript高级程序设计第三版书摘
在HTML 中使用JavaScript <script>元素 在使用<script>元素嵌入 JavaScript 代码时,只须为<script>指定 type 属 ...
- 【Java虚拟机3】类加载器
前言 Java虚拟机设计团队有意把类加载阶段中的"通过一个类的全限定名来获取描述该类的二进制字节流"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类. ...
- MAC 安装 apache ab 压力测试工具以及遇到的坑
ab 是apache对 http服务器进行压力测试的工具,它可以测试出服务器每秒可以处理多少请求.本文记录mac版本安装 ab 的步骤以及遇到的坑. 下载 进入 apache ab官网 下载页面. 安 ...
- Abp VNext分表分库,拒绝手动,我们要happy coding
Abp VNext 分表分库 ShardingCore ShardingCore 易用.简单.高性能.普适性,是一款扩展针对efcore生态下的分表分库的扩展解决方案,支持efcore2+的所有版本, ...
- Idea Maven auto Import
- C语言零基础入门难发愁,那就快来看看这篇基础整理资料吧
C语言程序的结构认识 用一个简单的c程序例子,介绍c语言的基本构成.格式.以及良好的书写风格,使小伙伴对c语言有个初步认识. 例1:计算两个整数之和的c程序: #include main() { in ...
- 深入理解和运用Pandas的GroupBy机制——理解篇
GroupBy是Pandas提供的强大的数据聚合处理机制,可以对大量级的多维数据进行透视,同时GroupBy还提供强大的apply函数,使得在多维数据中应用复杂函数得到复杂结果成为可能(这也是个人认为 ...