【BZOJ 2457】 双端队列
【题目链接】
https://www.lydsy.com/JudgeOnline/problem.php?id=2457
【算法】
贪心
【代码】
#include<bits/stdc++.h> using namespace std; #define MAXN 200010 int i,n,len,last,cnt; int d[MAXN],tmp[MAXN],mx[MAXN],nx[MAXN]; bool flag; inline bool cmp(int a,int b) { return (d[a] == d[b]) ? (a < b) : (d[a] < d[b]); } int main() { scanf("%d",&n); for (i = 1; i <= n; i++) { scanf("%d",&d[i]); tmp[i] = i; } sort(tmp+1,tmp+n+1,cmp); d[0] = -1; for (i = 1; i <= n; i++) { if (d[tmp[i]] != d[tmp[i-1]]) { len++; nx[len] = mx[len] = tmp[i]; } else { nx[len] = min(nx[len],tmp[i]); mx[len] = max(mx[len],tmp[i]); } } flag = false; cnt = 1; last = nx[1]; for (i = 2; i <= len; i++) { if (flag && nx[i] < last) { flag = false; cnt++; last = nx[i]; continue; } if (!flag && mx[i] > last) { flag = true; last = mx[i]; continue; } if (!flag && mx[i] < last) { last = nx[i]; continue; } if (flag && nx[i] > last) last = mx[i]; } printf("%d\n",cnt); return 0; }