首页 > 其他分享 >[BZOJ3489] A simple rmq problem

[BZOJ3489] A simple rmq problem

时间:2024-12-19 16:43:32浏览次数:8  
标签:set rs simple mid int ls problem BZOJ3489 las

考虑当没有强制在线时,容易想到一个点 \(i\) 所影响的区间 \([l,r]\) 满足 \(pr_i<l\le i,i\le r<nx_i\)。显然可以转化为矩阵修改,单点求 \(\max\) 的问题。那扫描线 \(+\ set\) 轻松拿下。

强制在线就把线段树换成主席树就可以了。注意这里不能下传标记,所以得用标记永久化。

但是这里有一个小问题:你不能对主席树上每一个点都建立一个 \(set\),否则时空双炸。考虑到一个节点 \(y\),假如在后面的过程中出现了一个新的节点 \(x\),它们两个覆盖的区间相同,那么 \(y\) 的 \(set\) 将不再会被修改,也不再会被用来更新其他的 \(set\)。所以我们可以让 \(x\) 继承 \(y\) 的 \(set\),这样就是正确的了。至于 \(y\) 点对应的最大值,在计算中维护一下就行。

时间复杂度 \(O(n\log^2n+m\log n)\)。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,M=8e6+5;
int n,m,a[N],rt[N*2],ls[M],rs[M],k,nm[M];
set<int>st[N*4];int pr[N],tot,las,nw[M];
struct que{int x,l,r,o;}g[N*2];int cnt;
inline int cmp(que x,que y){
	return x.x<y.x;
}inline int ass(int x){
	return !st[x].size()?0:(*st[x].rbegin());
}inline void chg(int &x,int y,int l,int r,int L,int R,int id){
	nm[x=++tot]=nm[y];
	if(L<=l&&r<=R){
		if(!nm[x]) nm[x]=++cnt; 
		ls[x]=ls[y],rs[x]=rs[y];
		if(id<0) st[nm[x]].erase(-id);
		else st[nm[x]].insert(id);
		return nw[x]=ass(nm[x]),void();
	}int mid=(l+r)/2;nw[x]=ass(nm[x]);
	if(L<=mid) chg(ls[x],ls[y],l,mid,L,R,id);
	if(R>mid) chg(rs[x],rs[y],mid+1,r,L,R,id);
	if(!ls[x]) ls[x]=ls[y];
	if(!rs[x]) rs[x]=rs[y];
}inline int ans(int x,int l,int r,int k){
	if(!x) return 0;
	if(l==r) return nw[x];
	int mid=(l+r)/2;
	if(k<=mid) return max(ans(ls[x],l,mid,k),nw[x]);
	return max(ans(rs[x],mid+1,r,k),nw[x]);
}int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1,x;i<=n;i++){
		cin>>x,pr[i]=a[x];
		if(!a[x]){a[x]=i;continue;}
		g[++k]={pr[a[x]]+1,a[x],i-1,x};
		g[++k]={a[x]+1,a[x],i-1,-x},a[x]=i;
	}for(int i=1;i<=n;i++){
		if(!a[i]) continue;
		g[++k]={pr[a[i]]+1,a[i],n,i};
		g[++k]={a[i]+1,a[i],n,-i};
	}sort(g+1,g+k+1,cmp),g[k+1].x=1e9;
	for(int i=1;i<=k;i++)
		chg(rt[i],rt[i-1],1,n,g[i].l,g[i].r,g[i].o);
	while(m--){
		int x,y,l,r;cin>>x>>y;
		l=min((x+las)%n,(y+las)%n)+1;
		r=max((x+las)%n,(y+las)%n)+1;
		int lc=1,rc=k+1,as=0;
		while(lc<=rc){
			int mid=(lc+rc)/2;
			if(g[mid].x>l)
				as=mid,rc=mid-1;
			else lc=mid+1;
		}las=ans(rt[as-1],1,n,r);
		cout<<las<<"\n";
	}return 0;
} 

标签:set,rs,simple,mid,int,ls,problem,BZOJ3489,las
From: https://www.cnblogs.com/chang-an-22-lyh/p/18617536/bzoj3489-a_simple_rmq_problem-tj

相关文章

  • Hard Demon Problem
    HardDemonProblemSwingisopeningapancakefactory!Agoodpancakefactorymustbegoodatflatteningthings,soSwingisgoingtotesthisnewequipmenton2Dmatrices.Swingisgivenan$n\timesn$matrix$M$containingpositiveintegers.Hehas$q......
  • 【内向基环树】codeforces 2044 G1. Medium Demon Problem (easy version)
    前言基环树,又名环套树,是具有\(n\)个节点和\(n\)条边的图,比树多出现一个环。基环树也根据边的有向和无向分为了有向基环树和无向基环树。有向基环树又可以分为内向基环树和外向基环树。对于有向基环树,若基环树的每个节点的出度均为\(1\),则称为内向基环树;若基环树的每个节点的......
  • (补题)Codeforces Round 993 (Div. 4) E.Insane Problem
    显然不可暴力解出,因此是到数学题。已知$$y=x*k^n$$所以我们可以利用y的区间范围$$[l1,r1]$$得出x的新的区间范围$$[l2/k^n(向上取整),r2/k^n(向下取整)]$$接着与原来的范围取交集然后不断枚举n即可,注意k^n不可能超过y#include<iostream>#defineintlonglongusingnamespa......
  • Simplex Method (单纯形方法)
    学习目标:在本节中,我们将学习使用\(\textbf{单纯形法}\)解决线性规划最大化问题:(Inthissection,wewilllearntosolvelinearprogrammingmaximizationproblemsusingtheSimplexMethod:)识别并建立标准的最大化形式的线性规划(Identifyandsetupalinearprogram......
  • ALOHA:A Simple Recipe for Robot Dexterity
    摘要:模仿学习在学习端到端的机器策略中展示了好的结果,本论文的工作解决的问题是,能在多大程度上推动模仿学习来挑战灵巧的操作任务。在ALOHA2平台上,将一个简单的大规模数据收集的配方与可表达的模型(扩散的策略)相结合,可以有效地学习具有挑战性的手动操作任务,包括可变形的物体和复......
  • Insane Problem(思维)
    Waveisgivenfiveintegers\(k\),\(l_1\),\(r_1\),\(l_2\),and\(r_2\).Wavewantsyoutohelphercountthenumberoforderedpairs\((x,y)\)suchthatallofthefollowingaresatisfied:\(l_1\leqx\leqr_1\).\(l_2\leqy\leq......
  • Problem: 1338. 数组大小减半 贪心 模拟 法 简单易懂
    Problem:1338.数组大小减半思路因为要选择最小的整数集合,这里用Counter容器来统计下所有各种数字的大小,然后按照值来排序,设置target来表示要到达什么位置,这里最好不要用整除,防止要计算的大于arr,但是len(arr)是奇数,这里total表示删除到这个位置已经删除了多少数字,如果大......
  • 微软官方驱动例子SimpleAudioSample安装失败的解决
    无法编译微软有一个Bug,Spectre,现在被缓解了,但是代价是你要在VS2022中安装一大把的环境,否则此例子无法编译……无法安装devcon.exe,如图执行后得到:但是设备管理器里找得到这个设备……说明是安装了,但安装之后并没有执行起来无法安装——从devcon.exe定位devcom.exe的输出......
  • Mod segma problem
    https://atcoder.jp/contests/abc378/tasks/abc378_e#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#definelowbit(x)(x&(-x))#definepiipair<int,int>#definemkpmake_pairconstintN=2e5+10,mod=998244353;i......
  • QT日志类SimpleQtLogger的简单记录
    在现代软件开发中,日志记录是必不可少的部分。它不仅帮助开发者在调试和维护软件时了解程序的运行状态,还能提供关键的错误信息。对于使用Qt框架开发应用程序的开发者来说,选择一个合适的日志库至关重要。本文将详细介绍Qt日志库SimpleQtLogger的特点、安装方法、使用示例以及它在实......