首页 > 其他分享 >P8996 题解

P8996 题解

时间:2024-08-13 20:06:35浏览次数:14  
标签:nxt frac int 题解 最大值 maxn 区间 P8996

P8996

思路

当有 \(a_i<a_j\) 时,先放 \(a_i\),再放 \(i\) 之后连续的 \(a_k<a_i\)。设 \(i\) 后第一个比 \(a_i\) 大的位置是 \(nxt_i\),对于一个前缀最大值位置 \(i\),合并后 \([i,nxt_i)\) 的顺序不变且依然连续。让前缀最大值 \(a_l\) 代表整个区间,可以看做合并是将两个序列的前缀最大值排序。

每次合并相当于在 \(\frac{n}{2}\) 处断开跨过序列中点的区间 \([l,r]\),生成 \([l,\frac{n}{2}]\) 和 \([\frac{n}{2}+1,nxt_{\frac{n}{2}+1}-1],[nxt_{\frac{n}{2}+1},nxt_{nxt_{\frac{n}{2}+1}}-1],\dotsb,[pos,r]\),然后再重新按区间左端点的值排序。每个区间不会扩大,只会被分割;每次操作如果没有区间跨过序列中点就不会再操作,否则区间数量至少加 \(1\)。所以最多操作 \(n\) 次,最多 \(n\) 种区间。

将询问离线,维护每次合并后的区间信息。建权值线段树表示前缀最大值 \(l\) 代表的区间长度之和。询问时线段树上二分出包含 \(p\) 的区间的最大值和 \(p\) 在区间中的位置,对应回初始时最大值的位置加 \(p\) 在区间中的位置得到 \(p\) 初始时的位置。进行合并操作时二分出包含 \(\frac{n}{2}\) 的区间的最大值 \(l\),将这个区间 \([l,l+len_l-1]\) 断开为 \([l,\frac{n}{2}]\)。从 \(\frac{n}{2}+1\) 开始不断跳 \(nxt_i\),形成新的区间加入权值线段树。

复杂度 \(O(n\log n+q\log n)\)。

code

int n,q,a[maxn];
#define mid (l+r>>1)
#define ls nd<<1
#define rs nd<<1|1
int tree[maxn<<2];
void updata(int nd,int l,int r,int p,int w){
	if(l==r){tree[nd]=w;return ;}
	if(p<=mid)updata(ls,l,mid,p,w);
	else updata(rs,mid+1,r,p,w);
	tree[nd]=tree[ls]+tree[rs];
}
pii query(int nd,int l,int r,int w){
	if(l==r){return {l,w};}
	if(tree[ls]>=w)return query(ls,l,mid,w);
	else return query(rs,mid+1,r,w-tree[ls]);
}
vector<pii> que[maxn];int ans[maxn*5];
int st[maxn],tp,nxt[maxn],len[maxn],pos[maxn];
void work(){
	n=read();q=read();
	for(int i=1;i<=n;i++)a[i]=read(),pos[a[i]]=i;
	a[n+1]=n+1;st[++tp]=n+1;
	for(int i=n;i;i--){
		while(a[st[tp]]<a[i])tp--;st[++tp]=i;
		nxt[i]=st[tp-1];
	}
	for(int i=1;i<=n/2;i=nxt[i]){
		len[i]=min(n/2,nxt[i]-1)-i+1;
		updata(1,1,n,a[i],len[i]);
	}
	for(int i=n/2+1;i<=n;i=nxt[i]){
		len[i]=nxt[i]-1-i+1;
		updata(1,1,n,a[i],len[i]);
	}
	for(int i=1;i<=q;i++){
		int t=read(),d=read();
		if(!t)ans[i]=a[d];
		else que[min(t,n)].push_back({i,d});
	}
	for(int t=1;t<=n;t++){
		for(auto[id,d]:que[t]){
			pii p=query(1,1,n,d);
			// cout<<p.fi<<" "<<p.se<<"\n";
			ans[id]=a[pos[p.fi]+p.se-1];
		}
		pii p=query(1,1,n,n/2);
		int lst=pos[p.fi],r=lst+len[lst]-1,x=lst+p.se;
		len[lst]=p.se;updata(1,1,n,p.fi,p.se);
		while(x<=r){
			len[x]=min(r,nxt[x]-1)-x+1;updata(1,1,n,a[x],len[x]);
			x=nxt[x];
		}
	}
	for(int i=1;i<=q;i++)printf("%lld\n",ans[i]);
}

标签:nxt,frac,int,题解,最大值,maxn,区间,P8996
From: https://www.cnblogs.com/yhddd/p/18357603

相关文章

  • arc182c 题解
    arc182c思路有\(6\)个小于\(14\)的质数,设这\(6\)个质数的指数分别为\(x_1,\dotsb,x_6\)。\(ans=\sum(\prod_{i=1}^d(x_i+1))\)。状压这\(6\)个数,维护\(val_s=\prod_{i=1}^6(x_i\times[s二进制第i位为1]+[s二进制第i位为0])\)。当加入一个数时,某些\(x_i\)会加......
  • CF1294F 题解
    Part.0闲话更好的观看体验目前题解区里大多数巨佬都是采用的树形dp和暴力等方法,看见没有我这种做法,欢迎指出做法问题或hack代码。Part.1题意给定一棵树,选\(3\)个点\(a,b,c\),求\(a\)到\(b\)的路径与\(a\)到\(c\)的路径与\(b\)到\(c\)的路径上一共有多少......
  • 新坑:信息学奥赛一本通题解(3001~3005)
    前言Hello,大家好我是文宇,开个新坑,是关于信息学奥赛一本通的坑,就是信奥赛题解.(这里指编程启蒙的题库)因为作者的洛谷还在写,只是信奥赛的题写的比较多,所以先做信奥赛的.信奥赛的网址是信息学奥赛一本通-编程启蒙(C++版)在线评测系统(挖坑:作者以后可能还会有信奥赛本体......
  • 生活在hzoi上 题解
    生活在hzoi上题解考虑有两棵树怎么做,显然是\(y^{n-k}=y^{n-\left\vertE_1\capE_2\right\vert}\)其中\(E_1\)和\(E_2\)是两棵树的边集发现上边那个\(k\)是两棵树边集交构成的图的连通块个数\(\left\vertE_1\capE_2\right\vert\)就是两棵树交的连通块数量......
  • 记一次NoClassDeffoundEror问题解决过程
    背景:在对某台计算服务器进行代码修改后,发现es查询报错,抛出异常如下: 思路: 1.jar包冲突   查询了对应jar的pom文件,发现只有一个es的版本jar包,不存在冲突,百思不得其解。2.本地环境问题   清理idea的缓存,发行问题仍然存在最后翻阅资料,打了断点追踪异常抛出的地方,......
  • ARC182 题解
    A-ChmaxRush!发现一个数能向哪边覆盖只由再他之后操作且\(v\)比他大的操作决定。所以扫一遍确定方向之后乘起来就好。B-|{floor(A_i/2^k)}|首先不难发现\(<2_{k-1}\)的元素是无用的,因为它们会由\(\ge2^{k-1}\)的元素除以2的幂得到。先想上界。对于\(0\l......
  • ARC182B |{floor(A_i/2^k)}| 题解
    ARC182B|{floor(A_i/2^k)}|题解题目大意定义一个长度为\(N\)的序列\(A\)的分数为能被表示成\(\lfloor{A_i\over2^k}\rfloor\)的数的个数,其中\(i=1,2,\dots,N\),\(k\)为任意自然数。给定\(N,K\),求长度为\(N\)且元素大小都在\(2^K-1\)内的所有序列的分数的最大值......
  • 【题解】 [USACO 2007 FEB] Cow Party S
    题目描述题目大意给定一个有向图,以及一个顶点。求其他所有点到给定点,再从给定点回到各自起始点的最短路中的最大值。思路本题主要考查:对单源最短路算法的熟练运用。最短路总共分为2段:其他所有点到给定点、给定点回到各自起始点。首先求第一段:可以在原图的基础上建一个反向图......
  • 洛谷 P4305 不重复数字——题解
    洛谷P4305题解传送锚点摸鱼环节[JLOI2011]不重复数字题目描述给定\(n\)个数,要求把其中重复的去掉,只保留第一次出现的数。输入格式本题有多组数据。第一行一个整数\(T\),表示数据组数。对于每组数据:第一行一个整数\(n\)。第二行\(n\)个数,表示给定的数。输出格......
  • 【题解】 热浪
    题目描述【题目描述】德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品。FarmerJohn此时以先天下之忧而忧,后天下之乐而乐的精神,身先士卒地承担起向德克萨斯运送大量的营养冰凉的牛......