THU2015 fall 1-2 Company

THU2015 fall 1-2 Company


描述

  公司有n个员工,编号1 ~ n。员工数量众多,需要你为他们编写一个管理系统。

  员工上班时都要登录管理系统登记一个code,离开要从管理系统上注销,员工也可以随时更新自己的code。到了下班时间,所有员工都会自动注销。公司管理人员随时都可能想要知道有多少员工上班,以及任一员工登记的code。

输入

  第一行两个整数n、m。接下来m行,每行都是以下内容之一:

I	a	c	//Log In:员工a登录,code为c。若a已登录,则将code更新为c
O	a		//Log Out:编号为a的员工注销。若a未登录,则注销无效
C			//Close:到下班时间,所有员工注销
N			//Number:询问有多少员工正在上班
Q	a		//Query:询问员工a的code(若未登录或已注销,视为-1)

输出

  一个整数,是所有询问(N、Q)的答案之和(int表示,自动溢出,不用管溢出部分)

输入样例

10	8
I	1	2
I	1	4
Q	1
C
I	2	4
O	2
Q	2
N

输出样例

3
//“Q 1”答案是4,“Q 2”答案是-1,“N”答案是0,所有答案之和为3

限制

  n <= 10,000,000

  m <= 1,000,000

  1<=a<=n

  code为[0, 2^31)的整数

  空间限制:256 MB

  时间限制:2 sec

提示

一级提示

  测试数据中,每种操作都可能频繁出现,或很少出现。因此,你的算法需要应对所有可能的情况。


代码如下:

#include 
//#include 
#include 
#include 

const int SZ = 1 << 20;
struct fastio {   //fast io
	char inbuf[SZ];
	char outbuf[SZ];
	fastio() {
		setvbuf(stdin, inbuf, _IOFBF, SZ);
		setvbuf(stdout, outbuf, _IOFBF, SZ);
	}
}io;


#define N 10000000
#define M 1000000
int num[N + 1];
std::bitset bit;

int main()
{
	int n, m;
	int count = 0;
	scanf("%d%d", &n, &m);

	int ans = 0;

	while (m--)
	{
		char c;
		int a, b;
		while (scanf("%c", &c) && c != 'I' && c != 'O'&& c != 'C'&& c != 'N'&& c != 'Q');
		if (c == 'I')
		{
			scanf("%d %d", &a, &b);
			if (bit[a] == 0)
			{
				count++;
				bit.set(a);
			}
			num[a] = b;
		}
		else if (c == 'O')
		{
			scanf("%d", &a);
			if (bit[a] == 1)
			{
				bit.reset(a);
				count--;
			}
		}
		else if (c == 'C')
		{
			bit.reset();
			count = 0;
		}
		else if (c == 'Q')
		{
			scanf("%d", &a);
			
			ans += bit[a] == 1? num[a]:-1;


		}
		else if (c == 'N')
		{
			ans += bit.count();
		}
	}
	printf("%d\n", ans);
	//system("pause");
	return 0;
}


你可能感兴趣的:(TsinghuaX:,数据结构(2015))