codeforces 602B (队列)

来源:互联网 发布:sql语句多表关联查询 编辑:程序博客网 时间:2024/05/17 23:05

题意是给一个序列寻找最长的子区间使得子区间中最大元素和最小元素的差小于等于1

用队列瞎搞,先把序列处理一下,把有相邻元素相同的合并,把每个元素依次放进队列里。

如果队列是空,直接放进去;如果这个元素和队尾元素差大于1,就清空队列,计算一次区间长度;否则就用即将入队的元素和队次尾元素比较。(因为维护的队列里面的元素必定满足abababab型)

#include <bits/stdc++.h>using namespace std;#define maxn 111111struct node {    int l, r;    int num;}p[maxn];int a[maxn];node que[maxn], now;int n;int cnt;int main () {    scanf ("%d", &n);    cnt = 0;    for (int i = 1; i <= n; i++) {        scanf ("%d", &a[i]);    }    int cnt = 1;    p[cnt].l = 1, p[cnt].r = 1, p[cnt].num = a[1];    for (int i = 2; i <= n; i++) {        if (a[i] == a[i-1]) {            p[cnt].r = i;        }        else {            cnt++;            p[cnt].l = i;            p[cnt].r = i;            p[cnt].num = a[i];        }    }     int s = 1, t = 1;    int cur = 1;    int ans = 0;    while (cur <= cnt) {        if (s == t) {            que[t++] = p[cur];        }        else {            now = p[cur];            if (abs (now.num - que[t-1].num) <= 1) {                if (t-s  > 1 && que[t-2].num != now.num) {                    ans = max (ans, que[t-1].r-que[s].l+1);                    s = t-1;                    que[t++] = now;                }                else                    que[t++] = now;            }            else {                ans = max (ans, que[t-1].r-que[s].l+1);                s = t;                que[t++] = now;            }        }        cur++;    }    ans = max (ans, que[t-1].r-que[s].l+1);    printf ("%d\n", ans);    return 0;}


0 0