Camellia遇到了一个问题,她无法解决所以来求助豆子,以下是豆子所理解的问题:给定1000万个点,编号1-1000万。每个点都有一个值,初始的时候均为-1,有n个操作,操作有以下五种。
1 x 代表将x点更新为i,i为第几次操作。
2 x 代表将x点更新为-1。
3 代表把所有的点变为-1。
4 x 查询x点的值。
5 查询1000万个点里有多少个点不是-1。
亲爱的同学,你能帮助他们解决这个问题么?
http://acm.zzuli.edu.cn/problem.php?id=1784
Camellia遇到了一个问题,她无法解决所以来求助豆子,以下是豆子所理解的问题:给定1000万个点,编号1-1000万。每个点都有一个值,初始的时候均为-1,有n个操作,操作有以下五种。
1 x 代表将x点更新为i,i为第几次操作。
2 x 代表将x点更新为-1。
3 代表把所有的点变为-1。
4 x 查询x点的值。
5 查询1000万个点里有多少个点不是-1。
亲爱的同学,你能帮助他们解决这个问题么?
首先输入一个t(t<10)代表t组数组,接下来每组数据首先输入一个n(n<100万)代表n次操作,接下来n行每行一种操作。
对于4、5操作来言,输出它们的答案。
1 8 1 20 1 15 4 20 5 2 15 5 3 5
1 2 1 0
#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; }