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 <stdio.h>
//#include <stdlib.h>
#include <string.h>
#include <bitset>
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<N + 1> 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;
}