#回滚莫队,链表#洛谷 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: 历史研究(回滚莫队)
传送门 这是一个叫做回滚莫队的神奇玩意儿 是询问,而且不强制在线,就决定是你了莫队 如果是每次插入一个数是不是很简单? 然而悲剧的是我们莫队的时候不仅要插入数字还要删除数字 那么把它变成只插入不就行了 ...
随机推荐
- 【Android 逆向】【攻防世界】黑客精神
1. apk 安装到手机,提示输入注册码 2. jadx打开apk MainActivity.java @Override // android.app.Activity public void on ...
- 启动HDFS伪分布式环境时报权限错误
问题描述 操作系统:Ubuntu18.04 LTS HDFS版本:hadoop-3.2.3 普通用户登录,参照官方文档在单机上安装伪分布式环境时,启动HDFS报权限错误. 具体报错信息如下: $ ./ ...
- 案例分享:Qt便携式致病菌快速检测仪(账号管理、实验过程、二维图表、历史数据、通讯管理、实验报告、中英文等等)
需求 根据提供的用户原型设计.ui设计.通讯协议研发便携式致病菌快速检测仪器软件. 100%还原ui. 基本主功能(推荐visio:★★★☆☆,前期主流程需求整理) Dem ...
- 类型判断,代码块,流程控制及循环---day05
1.类型判断isinstance 用来做判断类型 语法: 用法一: isinstance(要判断的值,要判断的类型) 返回的是真或者假 用法二: isinstance(要判断的值,(可能的类型))如果 ...
- 数据抽取平台pydatax介绍--实现和项目使用
数据抽取平台pydatax实现过程中,有2个关键点: 1.是否能在python3中调用执行datax任务,自己测试了一下可以,代码如下: 这个str1就是配置的shell文件 try: resu ...
- 【Azure Developer】使用 Azure PowerShell 执行 Azure 表存储操作时遇见的4个问题
要使用PowerShell操作Azure的表存储,需要经过以下步骤: 1:必须安装 Az 和 AzTable 模块.安装命令为: #安装 Az 模块 Install-Module -Name Az - ...
- 手把手教你蜂鸟e203协处理器的扩展
NICE协处理器 赛题要求: 对蜂鸟E203 RISC-V内核进行运算算子(譬如加解密算法.浮点运算.矢量运算等)的扩展,可通过NICE协处理器接口进行添加,也可直接实现RISC-V指令子集(譬如 ...
- python中json.dumps() 与json.dump(),json.load()与json.loads()区别?
json.dumps() 将 Python 对象转换为 JSON 字符串,并返回该字符串.而 json.dump() 将 Python 对象转换为 JSON 字符串,并将该字符串写入文件. json. ...
- C++ //list容器 构造函数 //list赋值和交换 //list容器大小操作 //list插入和删除,移除 //清空 //list数据存取back(); front() //list 反转和排序
1 //list容器 构造函数 //list赋值和交换 //list容器大小操作 2 //list插入和删除,移除 //清空 //list数据存取back(); front() 3 //list 反转 ...
- C++//queue 队列 容器 先进先出 只有队头 队尾能被外界访问 因此不允许有遍历行为
1 //queue 队列 容器 先进先出 只有队头 队尾能被外界访问 因此不允许有遍历行为 2 3 4 #include<iostream> 5 #include<queue> ...