考虑枚举L, R明显具有可二分性, 然后预处理一些东西, 二分就好啦。
#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 = 1e6 + 7; const int inf = 0x3f3f3f3f; const LL INF = 0x3f3f3f3f3f3f3f3f; const int mod = 1e9 + 7; 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, x, a[N]; int mnPos[N], mxPos[N]; int preMax[N], sufMin[N]; bool preCan[N], sufCan[N]; inline bool check(int l, int r) { if(!preCan[l - 1]) return false; if(!sufCan[r + 1]) return false; if(sufMin[r + 1] < preMax[l - 1]) return false; return true; } int main() { memset(mnPos, inf, sizeof(mnPos)); scanf("%d%d", &n, &x); sufMin[x + 1] = inf; preMax[0] = -inf; for(int i = 1; i <= n; i++) scanf("%d", &a[i]); for(int i = 1; i <= n; i++) { chkmax(mxPos[a[i]], i); chkmin(mnPos[a[i]], i); } preMax[1] = mxPos[1]; for(int i = 2; i <= x; i++) preMax[i] = max(preMax[i - 1], mxPos[i]); sufMin[x] = mnPos[x]; for(int i = x - 1; i >= 1; i--) sufMin[i] = min(sufMin[i + 1], mnPos[i]); preCan[0] = true; for(int i = 1; i <= x; i++) { if(!preCan[i - 1]) break; if(mnPos[i] > preMax[i - 1]) preCan[i] = true; } sufCan[x + 1] = true; for(int i = x; i >= 1; i--) { if(!sufCan[i + 1]) break; if(mxPos[i] < sufMin[i + 1]) sufCan[i] = true; } LL ans = 0; for(int i = 1; i <= x; i++) { int low = i, high = x, p = i - 1; while(low <= high) { int mid = low + high >> 1; if(!check(i, mid)) p = mid, low = mid + 1; else high = mid - 1; } ans += x - p; } printf("%lld ", ans); return 0; } /* */