zzuli 1784: Camellia的难题 (暴力)

来源:互联网 发布:重庆时时彩数学算法 编辑:程序博客网 时间:2024/05/16 14:40

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

181 201 154 2052 15535

Sample Output

1210
用一个数组保存不是-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;}


1 0
原创粉丝点击