【题解】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,单调栈真的很好理解捏
完结撒花!

浙公网安备 33010602011771号