先离线,将询问按照时间排序,维护商店出现和消失

对于每一个询问,先二分枚举答案,假设是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]新家的更多相关文章

  1. 此博客主人已搬家访问新家地址:http://write.blog.csdn.net/postlist

    此博客主人已搬家访问新家地址:http://write.blog.csdn.net/postlist

  2. BZOJ 3631 【JLOI2014】 松鼠的新家

    Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树&q ...

  3. 【BZOJ-3631】松鼠的新家 树形DP?+ 倍增LCA + 打标记

    3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1231  Solved: 620[Submit][Stat ...

  4. 【bzoj3631】[JLOI2014]松鼠的新家

    题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树"上.松 ...

  5. 【BZOJ3631】松树的新家 树链剖分

    BZOJ3631 松树的新家 Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...

  6. BZOJ 3631: [JLOI2014]松鼠的新家( 树链剖分 )

    裸树链剖分... ------------------------------------------------------------------- #include<bits/stdc++ ...

  7. 3631: [JLOI2014]松鼠的新家

    3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 707  Solved: 342[Submit][Statu ...

  8. [填坑]树上差分 例题:[JLOI2014]松鼠的新家(LCA)

    今天算是把LCA这个坑填上了一点点,又复习(其实是预习)了一下树上差分.其实普通的差分我还是会的,树上的嘛,也是懂原理的就是没怎么打过. 我们先来把树上差分能做到的看一下: 1.找所有路径公共覆盖的边 ...

  9. [JLOI2014] 松鼠的新家

    Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树&q ...

随机推荐

  1. Jave Hbase AP

    Hbase API 类和数据模型的对应关系 HBaseAdmin 类:org.apache.hadoop.hbase.client.HBaseAdmin 作用:提供了一个接口来管理 HBase 数据库 ...

  2. Python中pymongo find 遍历数据导致timeout

    背景 在读取大约200W左右的数据的时候采用游标形式进行数据遍历时,超过10分钟就报错 timeout 原因 pymongo游标会在10分钟之后被关闭 解决方案 db.find({}, no_curs ...

  3. 款阿里开源的 Java 诊断工具Arthas

    Arthas是什么鬼? Arthas是一款阿里巴巴开源的 Java 线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题. Arthas诊断使用的是命令行交互模式,支持JDK6+,Linux. ...

  4. JVM:参数调优

    JVM:参数调优 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 前言 查看 JVM 系统默认值:使用 jps 和 jinfo 进行查看 -Xms:初始堆空间 - ...

  5. MacOS安装使用Kettle

    一.环境说明 操作系统版本:macOS Big Sur 11.6.1 机型:Intel版本 JDK版本:Amazon Corretto-openjdk8 Kettle版本:Kettle8.9 二.问题 ...

  6. netty入门实现简单的echo程序

    最近看以往在程序中编写的代码,发现有一个功能是使用socket通讯来实现的,而那个时候使用的是基于bio的阻塞io来实现的,最近在看netty,发现可以使用netty来使用nio的方式来实现,此博客记 ...

  7. 2021.9.12考试总结[NOIP模拟51]

    T1 茅山道术 仔细观察发现对于每个点只考虑它前面第一个与它颜色相同的点即可. 又仔细观察发现对一段区间染色后以这个区间内点为端点的区间不能染色. 于是对区间右端点而言,区间染色的贡献为遍历到区间左端 ...

  8. FreeRTOS学习笔记——FreeRTOS 任务基础知识

    RTOS 系统的核心就是任务管理,FreeRTOS 也不例外,而且大多数学习RTOS 系统的工程师或者学生主要就是为了使用RTOS 的多任务处理功能,初步上手RTOS 系统首先必须掌握的也是任务的创建 ...

  9. uni-app 安卓离线打包详细教程

    借鉴 uni-app官方给出的文章http://ask.dcloud.net.cn/article/508(虽说是04年的) 预备环境 AndroidStudio开发环境,要求安装Android4.0 ...

  10. A*,IDA*—高档次的暴搜

    A*通过评价函数来判断当前状态是否可以到达最终状态(即可行性剪枝),来减少不必要的搜索. 例题--P2324 [SCOI2005]骑士精神 我们通过当前不在指定位置上的棋子个数为评价函数,\(used ...