#分块,懒标记#LOJ 3631「2021 集训队互测」学姐买瓜
分析
有一个很简单的做法就是处理出每个位置能够一次到达的最左边的右端点(后继)。
然后直接从 \(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 集训队互测」学姐买瓜的更多相关文章
- @loj - 2461@ 「2018 集训队互测 Day 1」完美的队列
目录 @description@ @solution@ @part - 0@ @part - 1@ @accepted code@ @details@ @description@ 小 D 有 n 个 ...
- 【LOJ2461】「2018 集训队互测 Day 1」完美的队列(分块+双指针)
点此看题面 大致题意: 让你维护\(n\)个有限定长度的队列,每次区间往队列里加数,求每次加完后的队列里剩余元素种类数. 核心思路 这道题可以用分块+双指针去搞. 考虑求出每个操作插入的元素在队列中被 ...
- LOJ3069. 「2019 集训队互测 Day 1」整点计数(min_25筛)
题目链接 https://loj.ac/problem/3069 题解 复数真神奇. 一句话题意:令 \(f(x)\) 表示以原点 \((0, 0)\) 为圆心,半径为 \(x\) 的圆上的整点数量, ...
- LOJ2476. 「2018 集训队互测 Day 3」蒜头的奖杯 & LOJ2565. 「SDOI2018」旧试题(莫比乌斯反演)
题目链接 LOJ2476:https://loj.ac/problem/2476 LOJ2565:https://loj.ac/problem/2565 题解 参考照搬了 wxh 的博客. 为了方便, ...
- [JZOJ6088] [BZOJ5376] [loj #2463]【2018集训队互测Day 1】完美的旅行【线性递推】【多项式】【FWT】
Description Solution 我们考虑将问题一步步拆解 第一步求出\(F_{S,i}\)表示一次旅行按位与的值为S,走了i步的方案数. 第二步答案是\(F_{S,i}\)的二维重复卷积,记 ...
- LOJ3075 「2019 集训队互测 Day 3」组合数求和
题意: 令 \(f(j)=\sum\limits_{i=0}^{n-1}\dbinom{id}{j}\) ,对于 \(0\le j <m\) ,分别求出 \(f(j)\) .答案对 \(M\) ...
- 【loj2461】【2018集训队互测Day 1】完美的队列
#2461. 「2018 集训队互测 Day 1」完美的队列 传送门: https://loj.ac/problem/2461 题解: 直接做可能一次操作加入队列同时会弹出很多数字,无法维护:一个操作 ...
- [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞
[LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞 试题描述 到河北省 见斯大林 / 在月光下 你的背影 / 让我们一起跳舞吧 うそだよ~ 河北省怎么可能有 Stalin. ...
- Loj #2731 「JOISC 2016 Day 1」棋盘游戏
Loj 2731 「JOISC 2016 Day 1」棋盘游戏 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少 ...
- 【2018集训队互测】【XSY3372】取石子
题目来源:2018集训队互测 Round17 T2 题意: 题解: 显然我是不可能想出来的……但是觉得这题题解太神了就来搬(chao)一下……Orzpyz! 显然不会无解…… 为了方便计算石子个数,在 ...
随机推荐
- std::shared_ptr 和 std::vector 的结合使用
#include <iostream> #include <string> #include <vector> std::shared_ptr<std::ve ...
- win32-CreateDIBSection的使用
使用CreateDIBSection 可以创建一个设备无关位图 #include <windows.h> using namespace std; int main() { HDC hdc ...
- virtualapp 应用启动源码分析
应用启动源码分析 在HomeActvity中的OnCreate方法会调用initLaunchpad private void initLaunchpad() { mLauncherView.setHa ...
- Taro兼容h5的一些小问题
背景:先做了小程序,现在需要兼容h5 问题一:Image组件mode属性设置为aspectFill在h5上没效果 解决方法:给img加样式 object-fit: cover (例子如下) // js ...
- Swift高级进阶-Swift编译过程,”SIL代码“,“IR语法”
swift编译过程 如果不懂LLVM,Clang的同学可以去了解下它的知识点 一些文章中有详细介绍 OC 的编译过程 ,本文来探索一下 Swift 的编译过程.Swift 的编译过程中使用 Swif ...
- Java 基本数据类型之间的运算规则
1 /*** 2 * 基本数据类型之间的运算规则 3 * 4 * 前提:7中基本数据类型运算 5 * 6 * 1.自动类型提升: 7 * 当容量小的类型与容量大的数据类型的变量做运算时,结果自动提升为 ...
- linux centos文本编辑模式快速进入末尾最后一行快捷键与跳转首行、行尾和某一行快捷键
前言 使用vim的过程中想要快速移动光标至行首.行尾.第一行.最后一行或者某一行,本文对此简单介绍. 具体操作 1.快速至当前行的行首:home键最简单 (1) Home键: (2) 符号^(要按sh ...
- 9、mysql的并发参数调整
从实现上来说,MySQL Server 是多线程结构,包括后台线程和客户服务线程.多线程可以有效利用服务器资源,提高数据库的并发性能.在Mysql中,控制并发连接和线程的主要参数包括 max_conn ...
- 010 editor 文件指纹分析
1.010 Editor 介绍 16进制编辑器,支持模板和脚本操作,010编辑器支持编辑的文件类型 https://www.sweetscape.com/010editor/repository/t ...
- Java面试挂在线程创建后续,不要再被八股文误导了!创建线程的方式只有1种
写在开头 在上篇博文中我们提到小伙伴去面试,面试官让说出8种线程创建的方式,而他只说出了4种,导致面试挂掉,在博文中也给出了10种线程创建的方式,但在文章的结尾我们提出:真正创建线程的方式只有1种,剩 ...