为啥会RE
查看原帖
为啥会RE
271803
over_caykl楼主2023/1/2 13:07

RT,看得第二篇题解

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=5e5+5;
int n,Q;
int a[N];
LL f[N][23],nxt[N][23];
int s[N],top;
int main(){
	cin>>n>>Q;
	int MX=log2(n)+1;
	for(int i=1;i<=n;i++) cin>>a[i];
	
	for(int i=1;i<=n;i++){
		while(top&&a[s[top]]<a[i]){
			nxt[s[top]][0]=i;
			--top;
		}
		s[++top]=i;
	}
	while(top) nxt[s[top--]][0]=n+2;
	nxt[n+1][0]=nxt[n+2][0]=n+2;
	for(int i=1;i<=n;i++)
		f[i][0]=1LL*a[i]*(nxt[i][0]-i);
	
	for(int j=1;j<=MX;j++){
		for(int i=1;i<=n+2;i++)
			nxt[i][j]=n+2;
		for(int i=1;i+(1<<j)-1<=n;i++){
			nxt[i][j]=nxt[nxt[i][j-1]][j-1];
			f[i][j]=f[i][j-1]+f[nxt[i][j-1]][j-1];			
		}
	}
	int u,v;
	LL ans=0;
	while(Q--){
		cin>>u>>v;
		int l=1+(u^ans)%n, r=l+(v^(ans+1))%(n-l+1);
		int pos=l;
		ans=0;
		for(int i=MX;i>=0;i--){
			if(nxt[pos][i]-1>r) continue;
			ans+=f[pos][i];
			pos=nxt[pos][i];
		}
		ans+=a[pos]*(r-pos+1);
		cout<<ans<<"\n";
	}
	return 0;
}

2023/1/2 13:07
加载中...