您的位置:首页 > 其它

BZOJ 3339: Rmq Problem

2017-01-11 14:06 369 查看

3339: Rmq Problem

Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 1075 Solved: 549
[Submit][Status][Discuss]

Description



Input



Output



Sample Input

7 5

0 2 1 0 1 3 2

1 3

2 3

1 4

3 6

2 7

Sample Output

3

0

3

2

4

HINT



Source

By Xhr

[Submit][Status][Discuss]

3585 mex 一模一样,代码不变,AC依旧。

#include <bits/stdc++.h>

const int mxn = 200005;

int n, m, num[mxn], nxt[mxn], lst[mxn], mex[mxn], vis[mxn], ans[mxn];

struct query {
int l, r, t;
}q[mxn];

inline bool cmp(const query &a, const query &b)
{
return a.l < b.l;
}

signed main(void)
{
scanf("%d%d", &n, &m);

for (int i = 1; i <= n; ++i)
{
scanf("%d", num + i);
if (num[i] > n)
num[i] = n;
}

for (int i = 0; i <= n; ++i)
lst[i] = n + 1;

for (int i = n; i >= 1; --i)
nxt[i] = lst[num[i]], lst[num[i]] = i;

for (int i = 1; i <= n; ++i)
{
mex[i] = mex[i - 1];
vis[num[i]] = true;
while (vis[mex[i]])
++mex[i];
}

for (int i = 1; i <= m; ++i)
scanf("%d%d", &q[i].l, &q[i].r), q[i].t = i;

std::sort(q + 1, q + m + 1, cmp);

int left = 1;

for (int i = 1; i <= m; ++i)
{
while (left < q[i].l)
{
int t = nxt[left];
int p = num[left];
for (int j = t - 1; j > left; --j)
{
if (mex[j] <= p)break;
else mex[j] = p;
}
++left;
}

ans[q[i].t] = mex[q[i].r];
}

for (int i = 1; i <= m; ++i)
printf("%d\n", ans[i]);
}


@Author: YouSiki
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: