Description

定义两个区间互相匹配表示这两个区间有交集。

给出长度为N的区间序列A,M次询问,每次询问序列A中最长的连续子序列,使得子序列中的每个区间都与[L,R]互相匹配
N<=50000,M<=200000
把区间看作平面上的点(l,r)(以下均称为点以便区分)
能匹配A[a..b]的询问点在一个四分之一平面l<=min(A[a..b].r),r>=max(A[a..b].l) 上,于是可以枚举所有长度不超过sqrt(n)的子串,对每种长度的子串可以排序后和询问一起统一处理
对于更大的区间不能这样暴力处理,那么从[1,n]开始向下分治到区间[l,r],大于sqrt(n)的答案可能跨过区间中点m或在m某侧,而跨过m的可以拆成[a..m][m+1..b]两段,枚举a,b的取值,可以发现每个a或b的取值恰好使一个四分之一平面内的询问点的答案+1,排序后用树状数组处理(类似扫描线),但不同的分治区间之间答案互不影响,所以对每个分治区间要分别开一个树状数组处理。
总时间复杂度O(nsqrt(n)logn)
upd:类似http://www.cnblogs.com/ccz181078/p/6607323.html的莫队做法可以去掉一个log,实际运行效果也更好
#include<bits/stdc++.h>
const int inf=0x7fffffff;
int _(){
int x=,c=getchar();
while(c<)c=getchar();
while(c>)x=x*+c-,c=getchar();
return x;
}
int n,q,B,p2=;
int vs[][],xs[];
struct Q{
int l,r,id;
}qs[],q2[];
bool operator<(Q a,Q b){
return a.l>b.l;
}
struct Q2{
int l,r;
}q3[];
bool operator<(Q2 a,Q2 b){
return a.l>b.l;
}
int idp=,bit[][],ans[],lr[][];
void mins(int&a,int b){if(a>b)a=b;}
void maxs(int&a,int b){if(a<b)a=b;}
void calc(int l,int r){
if(r-l+<=B)return;
++idp;
int m=l+r>>;
int lmx=inf,rmn=;
for(int i=m+;i<=r;++i){
mins(lmx,vs[i][]);
maxs(rmn,vs[i][]);
q2[p2++]=(Q){lmx,rmn,idp};
}
lmx=inf,rmn=;
for(int i=m;i;--i){
mins(lmx,vs[i][]);
maxs(rmn,vs[i][]);
q2[p2++]=(Q){lmx,rmn,idp};
}
calc(l,m);
calc(m+,r);
}
void inc(int*a,int w,int mx){
for(;w<=mx;w+=w&-w)++a[w];
}
int sum(int*a,int w){
int s=;
for(;w;w-=w&-w)s+=a[w];
return s;
}
int main(){
n=_();q=_();B=sqrt(n*);
for(int i=;i<=n;++i){
xs[i]=vs[i][]=_();
vs[i][]=_();
}
std::sort(xs+,xs+n+);
for(int i=;i<=n;++i)vs[i][]=std::lower_bound(xs+,xs+n+,vs[i][])-xs;
for(int i=;i<=q;++i)qs[i].l=_(),qs[i].r=std::upper_bound(xs+,xs+n+,_())-xs-,qs[i].id=i;
std::sort(qs+,qs+q+);
calc(,n);
std::sort(q2,q2+p2);
for(int i=,p=;i<=q;++i){
for(;p<p2&&q2[p].l>=qs[i].l;++p)inc(bit[q2[p].id],q2[p].r,n+);
for(int j=;j<=idp;++j){
maxs(ans[qs[i].id],sum(bit[j],qs[i].r));
}
}
for(int i=;i<=n;++i)lr[i][]=inf;
for(int d=;d<=B;++d){
p2=;
for(int l=;l<=n;++l){
int r=l+d-;
if(r>n)break;
mins(lr[l][],vs[r][]);
maxs(lr[l][],vs[r][]);
q3[p2++]=(Q2){lr[l][],lr[l][]};
}
std::sort(q3,q3+p2);
int rmn=inf;
for(int i=,p=;i<=q;++i){
for(;p<p2&&q3[p].l>=qs[i].l;++p)mins(rmn,q3[p].r);
if(rmn<=qs[i].r)maxs(ans[qs[i].id],d);
}
}
for(int i=;i<=q;++i)printf("%d\n",ans[i]);
return ;
}

bzoj4130: [PA2011]Kangaroos的更多相关文章

  1. BZOJ4130:[PA2011]Kangaroos

    浅谈\(K-D\ Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline/pr ...

  2. 题解 洛谷 P6349 【[PA2011]Kangaroos】

    先考虑对题目进行转化,我们称两个区间有交集为这两个区间能匹配,每个询问就是在序列中最长能连续匹配的长度. 对序列中的一个区间\([l,r]\)和询问的一个区间\([L,R]\),若满足\(L \leq ...

  3. 洛谷 P6349 - [PA2011]Kangaroos(KDT+标记下放)

    洛谷题面传送门 KDT 上打标记的 hot tea. 考虑将询问 \(A,B\) 看作二维平面直角坐标系上的一个点 \((A,B)\),那么我们这样考虑,我们从左到右扫过全部 \(n\) 个区间并开一 ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. bzoj 3073: [Pa2011]Journeys -- 线段树优化最短路

    3073: [Pa2011]Journeys Time Limit: 20 Sec  Memory Limit: 512 MB Description     Seter建造了一个很大的星球,他准备建 ...

  6. 【BZOJ3073】[Pa2011]Journeys 线段树+堆优化Dijkstra

    [BZOJ3073][Pa2011]Journeys Description Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在 ...

  7. BZOJ_3073_[Pa2011]Journeys_线段树优化建图+BFS

    BZOJ_3073_[Pa2011]Journeys_线段树优化建图+BFS Description Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N ...

  8. Counting Kangaroos is Fun 求最少可见袋鼠数

    Description There are n kangaroos with pockets. Each kangaroo has a size (integer number). A kangaro ...

  9. bzoj3073: [Pa2011]Journeys 线段树优化建图

    bzoj3073: [Pa2011]Journeys 链接 BZOJ 思路 区间和区间连边.如何线段树优化建图. 和单点连区间类似的,我们新建一个点,区间->新点->区间. 又转化成了单点 ...

随机推荐

  1. win7文件夹共享(不新建账户、不带密码直接访问)

    1.右键需要共享的文件夹>共享>特定用户>选择Everyone>“添加”>“共享” 2.打开控制面板>按类别的查看方式>网络和Internet下的选择家庭组和 ...

  2. uva 1660 & poj 1966(点连通度)

    Cable TV Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4267   Accepted: 2003 ...

  3. ReferentialConstraint 中的依赖属性映射到由存储生成的列

    ReferentialConstraint 中的依赖属性映射到由存储生成的列 这个问题是由于从表中的外键关系建立错误(可能是由于误改),查看从表的所有外键关系,即可找到问题所在. 问题: 什么是从表? ...

  4. 根据ip获取用户地理位置

    各大网站都提供根据ip获取用户地理位置信息,这里以新浪的接口为例子 接口地址为:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js ...

  5. css属性选择器

    1.E[att] 选择具有attr属性的E元素.2.E[att="val"] 选择具有att属性且属性值等于val的E元素3.E[att~="val"] 选择具 ...

  6. hdu 4642 Fliping game

    http://acm.hdu.edu.cn/showproblem.php?pid=4642 对于给定的矩阵 操作步数的奇偶性是确定的 奇数步Alice赢 否则Bob赢 从左上角向右下角遍历遇到1就进 ...

  7. Mike的农场 (BZOJ 4177)

    题目大意: 给N个东西分AB类,分到A类和B类分别得到相应的钱记为A[i],B[i],然后有一些冲突关系<x,y,z>,如果物品x,y不同类需要付出z的钱.还有一些外快<S,x,y& ...

  8. SSH(2)

    1.用户登录 index页面跳转到登录页面 <% String path = request.getContextPath(); String basePath = request.getSch ...

  9. sql float 转换为 nvarchar

    INSERT INTO CC11 SELECT convert(nvarchar(30),convert(decimal(11,0),PCTID)),convert(nvarchar(30),conv ...

  10. 关于oracle的rowid

    oracle数据库中表的每一行(元组)均有一个rowid,它是数据的详细地址,通过rowid,oracle可以快速的定位某行具体的数据的位置. ROWID可以分为物理rowid和逻辑rowid两种.普 ...