想了想感觉可行解不多, 然后就暴力莽就完事了(FST我就删了这个博客 逃
#include<bits/stdc++.h> #define LL long long #define LD long double #define ull unsigned long long #define fi first #define se second #define mk make_pair #define PLL pair<LL, LL> #define PLI pair<LL, int> #define PII pair<int, int> #define SZ(x) ((int)x.size()) #define ALL(x) (x).begin(), (x).end() #define fio ios::sync_with_stdio(false); cin.tie(0); using namespace std; const int N = 5e5 + 7; const int inf = 0x3f3f3f3f; const LL INF = 0x3f3f3f3f3f3f3f3f; const int mod = 998244353; const double eps = 1e-8; const double PI = acos(-1); template<class T, class S> inline void add(T& a, S b) {a += b; if(a >= mod) a -= mod;} template<class T, class S> inline void sub(T& a, S b) {a -= b; if(a < 0) a += mod;} template<class T, class S> inline bool chkmax(T& a, S b) {return a < b ? a = b, true : false;} template<class T, class S> inline bool chkmin(T& a, S b) {return a > b ? a = b, true : false;} int n, a[N]; int maxPos[N]; int Map[N]; int Log[N]; struct ST { int dp[N][20]; int ty; void build(int n, int b[], int _ty) { ty = _ty; for(int i = -(Log[0]=-1); i < N; i++) Log[i] = Log[i - 1] + ((i & (i - 1)) == 0); for(int i = 1; i <= n; i++) dp[i][0] = ty * b[i]; for(int j = 1; j <= Log[n]; j++) for(int i = 1; i+(1<<j)-1 <= n; i++) dp[i][j] = max(dp[i][j-1], dp[i+(1<<(j-1))][j-1]); } inline LL query(int x, int y) { int k = Log[y - x + 1]; return ty * max(dp[x][k], dp[y-(1<<k)+1][k]); } } rmq; int main() { scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d", &a[i]); rmq.build(n, a, 1); int canGo = n; for(int i = n; i >= 1; i--) { if(Map[a[i]]) chkmin(canGo, Map[a[i]] - 1); Map[a[i]] = i; maxPos[i] = canGo; } LL ans = 0; for(int i = 1; i <= n; i++) { int now = i; while(now <= maxPos[i]) { if(rmq.query(i, now) == now - i + 1) { ans++; now++; } else { now = i + rmq.query(i, now) - 1; } } } printf("%lld ", ans); return 0; } /* */