zzuli 1784: Camellia的难题 (暴力)

http://acm.zzuli.edu.cn/problem.php?id=1784

1784: Camellia的难题

Description

 Camellia遇到了一个问题,她无法解决所以来求助豆子,以下是豆子所理解的问题:给定1000万个点,编号1-1000万。每个点都有一个值,初始的时候均为-1,有n个操作,操作有以下五种。

1 x 代表将x点更新为i,i为第几次操作。

2 x 代表将x点更新为-1。

3   代表把所有的点变为-1。

4 x 查询x点的值。

5  查询1000万个点里有多少个点不是-1。

亲爱的同学,你能帮助他们解决这个问题么?

Input

 首先输入一个t(t<10)代表t组数组,接下来每组数据首先输入一个n(n<100万)代表n次操作,接下来n行每行一种操作。

Output

 对于4、5操作来言,输出它们的答案。

Sample Input

1
8
1 20
1 15
4 20
5
2 15
5
3
5

Sample Output

1
2
1
0
用一个数组保存不是-1的数,当操作3的时候只需要将不是-1的数改成-1就可以了

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <limits>
#include <queue>
#include <stack>
#include <vector>
#include <map>

using namespace std;
typedef long long LL;

#define N 10002311
#define INF 0x3f3f3f3f
#define PI acos (-1.0)
#define EPS 1e-8
#define met(a, b) memset (a, b, sizeof (a))

int val[N], jude[N];
int main ()
{
    int n, m;
    scanf ("%d", &n);

    while (n--)
    {
        int cnt = 0, k = 0, flag = 1;
        met (jude, 0);
        met (val, -1);

        scanf ("%d", &m);

        while (m--)
        {
            int q, x;
            scanf ("%d", &q);

            if (q == 1)
            {
                scanf ("%d", &x);
                if (val[x] == -1) cnt++;
                val[x] = flag;
                jude[k++] = x;
            }
            else if (q == 2)
            {
                scanf ("%d", &x);
                if (val[x] != -1)
                    val[x] = -1, cnt--;
            }
            else if (q == 3)
            {
                for (int i=0; i<k; i++)
                    val[jude[i]] = -1;
                k = 0, cnt = 0;
            }
            else if (q == 4)
            {
                scanf ("%d", &x);
                printf ("%d\n", val[x]);
            }
            else if (q == 5)
                printf ("%d\n", cnt);
            flag++;
        }
    }
    return 0;
}


你可能感兴趣的:(zzuli 1784: Camellia的难题 (暴力))