#回滚莫队,链表#洛谷 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: 历史研究(回滚莫队)
传送门 这是一个叫做回滚莫队的神奇玩意儿 是询问,而且不强制在线,就决定是你了莫队 如果是每次插入一个数是不是很简单? 然而悲剧的是我们莫队的时候不仅要插入数字还要删除数字 那么把它变成只插入不就行了 ...
随机推荐
- win32 - GetMenuBarInfo的使用
MSDN文档介绍GetMenuBarInfo是用来检索有关指定菜单栏的信息. 假如有个需求是要找到菜单下拉菜单的矩形大小,该怎么做呢? 最简单的方法就是获取菜单栏的句柄,然后将句柄作为参数传给GetM ...
- win32-制作mini dump文件
一个完整的用户模式dump是基本的用户模式转储文件. 此转储文件包括进程的整个内存空间,程序的可执行映像本身,句柄表以及其他信息,这些信息对于调试器在重建转储发生时正在使用的内存中很有用. 可以将完整 ...
- TCP Server and Client Demo
server.go package main import ( "bufio" "fmt" "io" "net" &qu ...
- 【LeetCode排序专题02】最小k个数,关于快速排序的讨论
最小k个数 https://leetcode.cn/problems/smallest-k-lcci/ 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个 ...
- 用宝塔设立分发Directory.Build.props及其Import文件的网站
新建站点 服务器名称我们约定是dev.amihome.cn 创建的默认站点有下面4个文件 把本地的文件,用宝塔上传 上图我们是把本地的Directory.Build.props文件上传到了网站的根目录 ...
- Vue源码学习(十):关于dep和watcher使用的一些思考
好家伙, 前面想了好久,都没想明白为什么要dep和watcher打配合才能实现数据-视图同步 为什么要多一个依赖管理这样的东西 给每个数据绑个watcher(xxfunction),然后,数据变了 ...
- 用 nebula_dart_gdbc 在移动设备玩图数据库,泰酷辣!
nebula_dart_gdbc,是访问 NebulaGraph 的 Dart 语言客户端,在 dart_gdbc 的规范下进行开发. dart_gdbc 是一套使用 Dart 语言定义的图数据库标准 ...
- 浅析图数据库 Nebula Graph 数据导入工具——Spark Writer
从 Hadoop 说起 近年来随着大数据的兴起,分布式计算引擎层出不穷.Hadoop 是 Apache 开源组织的一个分布式计算开源框架,在很多大型网站上都已经得到了应用.Hadoop 的设计核心思想 ...
- Java 常用类 于 StringBuffer 和 StringBuilder的使用 + String三者的异同
1 package com.bytezero.stringclass; 2 3 import org.junit.Test; 4 5 /** 6 * 关于 StringBuffer 和 StringB ...
- elementPlus使用el-icon
按着文档来撒 yarn add @element-plus/icons-vue main.ts import * as ElementIcons from '@element-plus/icons-v ...