#回滚莫队,链表#洛谷 6349 [PA2011] Kangaroos
分析
首先区间 \([l,r]\) 与 \([L,R]\) 相交当且仅当 \(l\leq R\) 且 \(L\leq r\)(其实就是完全覆盖或者有一端点在区间中)
而且坐标范围太大了,如果要离散的话就更容易考虑离线了(在线也许比较难写?)
如果单单莫队的话左右端点的移动会非常麻烦,考虑回滚莫队,固定左端点所在块。
询问区间分为端点同块或者不同块两种情况,对于端点同块的情况,如果给定区间完全覆盖块那么可以直接计算进去
不能完全覆盖的话其中一个端点肯定在询问区间中,直接从询问区间的左端点枚举到右端点加入新的给定区间即可。
不同块的话左端点所在块的右端点是固定的,那么完全覆盖可以先考虑覆盖左端点所在块的右端点,
那么剩下可行区间仍然其中一个端点在询问区间中,块外向右扩展端点,块内回滚即可,维护最长连续段可以用链表
代码
#include <cstdio>
#include <cctype>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=200011,M=331;
struct rec{
int l,r,rk;
bool operator <(const rec &t)const{
return r>t.r;
}
}a[N],st[N*5/2];
int n,Q,pos[N],L[M],R[M],bl,Ans[N],ans,Top,ls[N],rs[N];
pair<int,int>b[N]; vector<rec>K[M];
int iut(){
int ans=0,f=1; char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans*f;
}
void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
void Max(int &x,int y){x=x>y?x:y;}
void add(int x){
if (ls[x]) return;
st[++Top]=(rec){x,0,ans},ls[x]=rs[x]=x,Max(ans,1);
if (ls[x-1]) st[++Top]=(rec){ls[x-1],rs[ls[x-1]],ans},st[++Top]=(rec){-rs[x],ls[rs[x]],ans},rs[ls[x-1]]=rs[x],ls[rs[x]]=ls[x-1],Max(ans,rs[ls[x]]-ls[rs[x]]+1);
if (rs[x+1]) st[++Top]=(rec){-rs[x+1],ls[rs[x+1]],ans},st[++Top]=(rec){ls[x],rs[ls[x]],ans},ls[rs[x+1]]=ls[x],rs[ls[x]]=rs[x+1],Max(ans,rs[ls[x]]-ls[rs[x]]+1);
}
void BackTrace(int TOP){
for (;Top>TOP;ans=st[Top--].rk)
if (st[Top].l<0) ls[-st[Top].l]=st[Top].r;
else if (st[Top].r) rs[st[Top].l]=st[Top].r;
else ls[st[Top].l]=rs[st[Top].l]=0;
}
int main(){
n=iut(),Q=iut(),bl=sqrt(2*n);
for (int i=1;i<=n;++i){
int l=iut(),r=iut();
b[i*2-1]=make_pair(l,i);
b[i*2]=make_pair(r,i);
}
sort(b+1,b+1+2*n);
for (int i=1;i<=2*n;++i)
if (a[b[i].second].l) a[b[i].second].r=i;
else a[b[i].second].l=i;
for (int i=1;i<=2*n;++i) pos[i]=(i-1)/bl+1;
for (int i=1;i<=2*n;++i) if (!L[pos[i]]) L[pos[i]]=i;
for (int i=2*n;i>=1;--i) if (!R[pos[i]]) R[pos[i]]=i;
for (int i=1;i<=Q;++i){
int l=iut(),r=iut();
l=lower_bound(b+1,b+1+2*n,make_pair(l,0))-b;
r=upper_bound(b+1,b+1+2*n,make_pair(r,n+1))-b-1;
if (r<1||l>2*n) continue;
K[pos[l]].push_back((rec){l,r,i});
}
for (int i=1;i<=pos[2*n];++i) if (!K[i].empty()){
for (int j=1;j<=n;++j)
if (a[j].l<L[i]&&R[i]<a[j].r) add(j);
sort(K[i].begin(),K[i].end());
int siz=K[i].size();
for (;siz&&K[i][siz-1].r<=R[i];--siz){
int TOP=Top;
for (int j=L[i];j<=R[i];++j)
if (a[b[j].second].l<=K[i][siz-1].r&&K[i][siz-1].l<=a[b[j].second].r)
add(b[j].second);
Ans[K[i][siz-1].rk]=ans,BackTrace(TOP);
}
BackTrace(0);
if (siz){
for (int j=1;j<=n;++j)
if (a[j].l<=R[i]&&R[i]<=a[j].r) add(j);
for (int now=R[i]+1;siz;--siz){
for (;now<=K[i][siz-1].r;++now) add(b[now].second);
int TOP=Top;
for (int j=R[i];j>=K[i][siz-1].l;--j) add(b[j].second);
Ans[K[i][siz-1].rk]=ans,BackTrace(TOP);
}
BackTrace(0);
}
}
for (int i=1;i<=Q;++i) print(Ans[i]),putchar(10);
return 0;
}
···
#回滚莫队,链表#洛谷 6349 [PA2011] Kangaroos的更多相关文章
- 洛谷 P6072 -『MdOI R1』Path(回滚莫队+01-trie)
题面传送门 又是 ix35 神仙出的题,先以 mol 为敬 %%% 首先预处理出根节点到每个点路径上权值的异或和 \(dis_i\),那么两点 \(a,b\) 路径上权值的异或和显然为 \(dis_a ...
- loj#6517. 「雅礼集训 2018 Day11」字符串(回滚莫队)
传送门 模拟赛的时候纯暴力竟然骗了\(70\)分-- 首先对于一堆\(g\)怎么计算概率应该很好想,用总的区间数减去不合法的区间数就行了,简而言之对\(g\)排个序,每一段长为\(d\)的连续序列的区 ...
- [CSP-S模拟测试]:ants(回滚莫队)
题目描述 然而贪玩的$dirty$又开始了他的第三个游戏. $dirty$抓来了$n$只蚂蚁,并且赋予每只蚂蚁不同的编号,编号从$1$到$n$.最开始,它们按某个顺序排成一列.现在$dirty$想要进 ...
- LOJ.6504.[雅礼集训2018 Day5]Convex(回滚莫队)
LOJ 莫队.发现只需要维护前驱后继就可以了. 但是加入一个点需要找到它当前的前驱后继,很麻烦还带个\(\log\). 但是如果只有删除某个点,只需要更新一下它的前驱后继即可. 用回滚莫队就好惹. 撤 ...
- BZOJ.4241.历史研究(回滚莫队 分块)
题目链接 \(Description\) 长度为n的数列,m次询问,每次询问一段区间最大的 \(A_i*tm_i\) (重要度*出现次数) \(Solution\) 好像可以用莫队做,但是取max的操 ...
- 2018.09.26 bzoj5218: [Lydsy2017省队十连测]友好城市(回滚莫队)
传送门 比较简单的一道回滚莫队吧. 每次询问用bitset优化kosaraju统计答案. 就是有点难调. 然后向dzyo学长学习了回滚莫队的一种简洁的实现方式,就是直接建立一个sqrt(m)∗sqrt ...
- 2018.08.14 bzoj4241: 历史研究(回滚莫队)
传送们 简单的回滚莫队,调了半天发现排序的时候把m达成了n... 代码: #include<bits/stdc++.h> #define N 100005 #define ll long ...
- BZOJ4241:历史研究(回滚莫队)
Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. ...
- LOJ#6504. 「雅礼集训 2018 Day5」Convex(回滚莫队)
题面 传送门 题解 因为并不强制在线,我们可以考虑莫队 然而莫队的时候有个问题,删除很简单,除去它和前驱后继的贡献即可.但是插入的话却要找到前驱后继再插入,非常麻烦 那么我们把它变成只删除的回滚莫队就 ...
- bzoj4241: 历史研究(回滚莫队)
传送门 这是一个叫做回滚莫队的神奇玩意儿 是询问,而且不强制在线,就决定是你了莫队 如果是每次插入一个数是不是很简单? 然而悲剧的是我们莫队的时候不仅要插入数字还要删除数字 那么把它变成只插入不就行了 ...
随机推荐
- Go语言并发编程(3):sync包介绍和使用(上)-Mutex,RWMutex,WaitGroup,sync.Map
一.sync 包简介 在并发编程中,为了解决竞争条件问题,Go 语言提供了 sync 标准包,它提供了基本的同步原语,例如互斥锁.读写锁等. sync 包使用建议: 除了 Once 和 WaitGro ...
- 新零售SaaS架构:订单履约系统的应用架构梳理
订单履约系统的核心能力 通过分析订单履约的全流程和各个业务活动,我们可以梳理出订单履约的核心业务链路,基于业务链路,我们抽象出订单履约系统的三大系统能力,分别为履约服务表达.履约调度.物流配送. 履约 ...
- mongodb(2022)
了解 文档数据库MongoDB用于记录文档结构的数据,如JSON.XML结构的数据.一条文档就是一条记录(含数据和数据结构),一条记录里可以包含若干个键值对.键值对由键和值两部分组成,键又叫做字段.键 ...
- 【Azure App Service】通过Visual Studio部署Azure App Service 遇见 401 'Unauthorized'错误
问题描述 最近通过Visual Studio 2022部署Azure App Service的时候,突然遇见了部署失败, 401 Unauthorized错误. 错误消息: Build started ...
- 【Azure 事件中心】通过 az rest --method get 如何获得Event Hub Entity 级的统计指标
问题描述 通过 az rest --method get 如何获得Event Hub Entity 级的统计指标? 问题解答 查阅文档 https://learn.microsoft.com/en ...
- java获取kafka consumer lag、endOffsets、beginningOffsets以及 KafkaConsumer总结
一.java获取kafka consumer lag.endOffsets.beginningOffsets maven依赖: <dependency> <groupId>or ...
- 浅谈IT系统性能优化
一个刚上线的IT系统,往往负载压力不大,所以不会存在什么性能问题.这时,人们大多只关心系统的功能性和用户体验.但是,随着时间推移,用户量和数据量都比刚上线的时候要多很多,高并发和大数据场景下,系统遇到 ...
- dev-sidecar 让github 可以正常访问
dev-sidecar https://gitee.com/docmirror/dev-sidecar/releases
- 安装VMware——Unable to install all modules.See log /tmp/vmware-han/vmware-6098.log for detalls.(Exit code 1)的解决方法(模块加载失败)
这是编译失败的原因在VM社区有这样一种解决方案,亲测有效,帮助我自己解决的麻烦,所有在这分享,希望能够帮助到小伙伴:不要被接下来的代码吓倒因为这是github上项目,所以要先在ubuntu上安装git ...
- AAC音频编码之--概念介绍
一 概念 AAC,全称Advanced Audio Coding,是一种专为声音数据设计的文件压缩格式.与MP3不同,它采用了全新的算法进行编码,更加高效,具有更高的"性价比".利 ...