1. 程式人生 > >【BZOJ 2457】 雙端隊列

【BZOJ 2457】 雙端隊列

題目 ble tin mes () using div tar php

【題目鏈接】

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; }

【BZOJ 2457】 雙端隊列