题目传送门


分析

有一个很简单的做法就是处理出每个位置能够一次到达的最左边的右端点(后继)。

然后直接从 \(l\) 开始能跳就跳,这样单次询问时间复杂度是 \(O(n)\) 的。

观察到时间复杂度因为跳跃和处理右端点被浪费了。

可不可以一下子跳很多步,并且处理一堆右端点。

其实这两个需求是负相关的,需要平衡规划,那么让它们各自保持 \(\sqrt{n}\) 的复杂度就可以了。

将 \(n\) 个位置分块,维护后继、跳出块的后继、跳出块的步数(初始化为1),然后对于 \(l\) 之前的块打标记,对于 \(l\) 所在的块标记下传再修改。

询问的时候最多跳 \(\sqrt{n}\) 个块,所以总时间复杂度是 \(O(m\sqrt{n})\) 的。


代码

#include <cstdio>
#include <cctype>
#include <cmath>
using namespace std;
const int N=300011,inf=0x3f3f3f3f;
int L[N],R[N],n,m,bl,pos[N],dis[N],lazy[N],nxt[N],Nxt[N];
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
int min(int a,int b){return a<b?a:b;}
int main(){
m=iut(),n=iut(),bl=sqrt(n+1);
for (int i=1;i<=n+1;++i) pos[i]=(i-1)/bl+1;
for (int i=1;i<=n+1;++i){
if (!L[pos[i]]) L[pos[i]]=i;
R[pos[i]]=i,lazy[pos[i]]=inf;
}
for (int i=1;i<=n+1;++i) Nxt[i]=nxt[i]=inf,dis[i]=1;
for (int i=1;i<=m;++i){
int opt=iut(),l=iut(),r=iut(),t=pos[l];
if (opt==1){
for (int i=1;i<t;++i) lazy[i]=min(lazy[i],r+1);
if (lazy[t]!=inf){
for (int i=L[t];i<=R[t];++i)
if (lazy[t]<nxt[i])
nxt[i]=Nxt[i]=lazy[t],dis[i]=1;
lazy[t]=inf;
}
if (t<pos[r+1]){
for (int i=L[t];i<=l;++i)
if (r+1<nxt[i])
nxt[i]=Nxt[i]=r+1,dis[i]=1;
}else for (int i=L[t];i<=l;++i)
if (r+1<nxt[i]) nxt[i]=r+1,dis[i]=dis[nxt[i]]+1;
for (int i=R[t];i>=L[t];--i)
if (nxt[i]<=R[t])
dis[i]=dis[nxt[i]]+1,Nxt[i]=Nxt[nxt[i]];
}else{
int ans=0;
while (1){
int now=min(lazy[pos[l]],Nxt[l]);
if (now<=r+1) ans+=dis[l],l=now;
else if (nxt[l]<=r+1) ++ans,l=nxt[l];
else break;
}
print(ans),putchar(10);
}
}
return 0;
}

#分块,懒标记#LOJ 3631「2021 集训队互测」学姐买瓜的更多相关文章

  1. @loj - 2461@ 「2018 集训队互测 Day 1」完美的队列

    目录 @description@ @solution@ @part - 0@ @part - 1@ @accepted code@ @details@ @description@ 小 D 有 n 个 ...

  2. 【LOJ2461】「2018 集训队互测 Day 1」完美的队列(分块+双指针)

    点此看题面 大致题意: 让你维护\(n\)个有限定长度的队列,每次区间往队列里加数,求每次加完后的队列里剩余元素种类数. 核心思路 这道题可以用分块+双指针去搞. 考虑求出每个操作插入的元素在队列中被 ...

  3. LOJ3069. 「2019 集训队互测 Day 1」整点计数(min_25筛)

    题目链接 https://loj.ac/problem/3069 题解 复数真神奇. 一句话题意:令 \(f(x)\) 表示以原点 \((0, 0)\) 为圆心,半径为 \(x\) 的圆上的整点数量, ...

  4. LOJ2476. 「2018 集训队互测 Day 3」蒜头的奖杯 & LOJ2565. 「SDOI2018」旧试题(莫比乌斯反演)

    题目链接 LOJ2476:https://loj.ac/problem/2476 LOJ2565:https://loj.ac/problem/2565 题解 参考照搬了 wxh 的博客. 为了方便, ...

  5. [JZOJ6088] [BZOJ5376] [loj #2463]【2018集训队互测Day 1】完美的旅行【线性递推】【多项式】【FWT】

    Description Solution 我们考虑将问题一步步拆解 第一步求出\(F_{S,i}\)表示一次旅行按位与的值为S,走了i步的方案数. 第二步答案是\(F_{S,i}\)的二维重复卷积,记 ...

  6. LOJ3075 「2019 集训队互测 Day 3」组合数求和

    题意: 令 \(f(j)=\sum\limits_{i=0}^{n-1}\dbinom{id}{j}\) ,对于 \(0\le j <m\) ,分别求出 \(f(j)\) .答案对 \(M\) ...

  7. 【loj2461】【2018集训队互测Day 1】完美的队列

    #2461. 「2018 集训队互测 Day 1」完美的队列 传送门: https://loj.ac/problem/2461 题解: 直接做可能一次操作加入队列同时会弹出很多数字,无法维护:一个操作 ...

  8. [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞

    [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞 试题描述 到河北省 见斯大林 / 在月光下 你的背影 / 让我们一起跳舞吧 うそだよ~ 河北省怎么可能有 Stalin. ...

  9. Loj #2731 「JOISC 2016 Day 1」棋盘游戏

    Loj 2731 「JOISC 2016 Day 1」棋盘游戏 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少 ...

  10. 【2018集训队互测】【XSY3372】取石子

    题目来源:2018集训队互测 Round17 T2 题意: 题解: 显然我是不可能想出来的……但是觉得这题题解太神了就来搬(chao)一下……Orzpyz! 显然不会无解…… 为了方便计算石子个数,在 ...

随机推荐

  1. 图书管理系统---基于ajax删除数据

    book_list.html代码 {% load static %} <!DOCTYPE html> <html lang="en"> <head&g ...

  2. day03--实际操作演示linux系统挂载过程

    # 第一步骤: 拥有一个存储设备-光驱,使光驱加载光盘 # 第二步骤: 在linux系统中找到光驱设备 ls -l /dev/cdrom # 第三步骤: 需要将存储设备进行 挂载 挂载命令语法格式: ...

  3. 在本地搭建 SVN 教程

    SVN 使用教程 以下内容参考自:SVN使用详细教程_大梦谁先觉i的博客-CSDN博客_svn使用教程 一.SVN 安装 1.1 软件下载 服务器:Downloads | VisualSVN 客户端: ...

  4. Scala学习历险记(第一天)

    Scala学习笔记(一) 前言:由于最近要整大数据相关的东西,所以java开发的我很苦逼的来学习Scala了,为接下来的工作做知识储备,今天是2021年8月19号,是我接触scala语言的第一天,因此 ...

  5. Mybatis中没有返回值的查询方法

    最近在项目开发中发现一件非常有意思的事情,一个Mapper.java文件中有一个查询方法没有返回值,这引起了我的好奇心, 没有返回值查询还有什么用呢? 仔细去看这个Mapper.java文件对应的xm ...

  6. vscode 当做记事本,用任务 tasks 自动提交git - ctrl shift B

    vscode 当做记事本,用任务 tasks 自动提交git - ctrl shift B 起因 开始用的joplin 本地记事本挺好,唯一缺点不能同步. 用了一下,发现markdown是两栏的,变成 ...

  7. snipaste 截屏工具快捷键 alt + A 还有 Ctrl + Shift + A

    snipaste 截屏工具快捷键 alt + A 还有 Ctrl + Shift + A 因为有时候 alt 会取消右键等菜单

  8. Prompt进阶2:LangGPT(构建高性能Prompt策略和技巧)--最佳实践指南

    Prompt进阶2:LangGPT(构建高性能Prompt策略和技巧)--最佳实践指南 0.前言 左图右图 prompt 基本是一样的,差别只在提示工程这个词是否用中英文表达.我们看到,一词之差,回答 ...

  9. day01-项目介绍与环境搭建

    项目介绍与环境搭建 1.项目学习前置知识 Java基础知识 javaweb MySQL SpringBoot SSM(Spring,SpringMVC,MyBatis) Maven 2.学习收获 了解 ...

  10. 一个简单的RTMP服务器实现 --- RTMP与H264

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...