【题解】B3666 求数列所有后缀最大值的位置

题面

题目传送门

前言

晦涩的题意

正文

后缀最大值?

如果一个数在你后面还比你大

那么你无论如何都成为不了后缀最大值

那么维护一个单调递减的单调栈即可

注意要输出后缀最大值下标的异或和

迷惑的值域之 \(a_i \le 2^{64}\)

代码

#include<iostream>
#include<stack>
#include<utility>
#define int unsigned long long
#define pii pair<int,int>
#define fi first
#define se second
#define mkp make_pair
using namespace std;
const int maxn=1e6+10;;
int n,a[maxn];
stack<pii> stk;
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	int ans=0;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		while(!stk.empty()&&a[i]>stk.top().fi){
			ans^=stk.top().se;
			stk.pop();
		}
		stk.push(mkp(a[i],i)); 
		ans^=i;
		cout<<ans<<endl;
	}
	return 0;
}

后记

u1s1,单调栈真的很好理解捏

完结撒花!

posted @ 2025-01-21 07:35  sunxuhetai  阅读(62)  评论(0)    收藏  举报