正如lyd所说,和数据结构本身没什么太大关联
中文题面
反方向思考
先排序好,原来的位置跟着排序
要满足双端队列,需要满足排序之后的原位置要先递减,再递增
不满足的话开新的双端队列
#include<cstdio> #include<algorithm> #include<vector> #define N 200005 #define INF 0x3fffffff using namespace std; int n; pair<int, int>a[N]; vector<int>p[N]; int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i].first); a[i].second = i; } sort(a + 1, a + 1 + n); int t = 0; for (int i = 1; i <= n; i++) { p[++t].push_back(a[i].second); while (a[i].first == a[i + 1].first) p[t].push_back(a[++i].second); } for (int i = 1; i <= t; i++) sort(p[i].begin(), p[i].end()); bool flag = 0; int num = INF, ans = 1; for (int i = 1; i <= t; i++) { int s = p[i].size(); if (flag) { if (num < p[i][0]) num = p[i][s - 1]; else { ++ans; flag = 0; num = p[i][0]; } } else { if (num > p[i][s - 1]) num = p[i][0]; else { flag = 1; num = p[i][s - 1]; } } } printf("%d\n", ans); return 0; }
[BZOJ2457][BeiJing2011]双端队列 (单调性)
原文:https://www.cnblogs.com/lincold/p/10162098.html