时间限制: 1 Sec 内存限制: 128 MB
题目描述:
为了KK周年邀请赛,Admin有N个物品,他们分别放到了N个大小相同的盒子中,由于某种原因,Admin只想选择其中的一些作为比赛的奖品,但是由于物品数量太多,所以请你写一个程序来帮帮他吧!Admin一共需要以下功能:
1.查询是否有物品被选择(初始状态下所有物品都没有被选择)
2.当前选择了多少物品
3.查询编号为id的物品选择情况
4.将编号为id的物品选择情况取反(原先选择变为不选择,原先不选择变为选择)
输入第一行N,M,表示有N个物品,M个操作,下面共M行,每一行描述一个操作。
如果这行是”any”,则表示第一个操作
如果这行是”count”,则表示第二个操作
如果这行是”find”+id,则表示第三个操作
如果这行是”filp”+id,则表示第四个操作
输出每个第一、二、三操作,都需要输出一行。对于第一个询问,输出T或者F分别表示有和无,第二个操作输出一个数,第三个操作输出T或F,分别表示选择和没有选择。
样例输入 :
10 8
any
filp 1
filp 2
count
any
find 2
filp 2
find 2
样例输出 :
F
2
T
T
F
提示30%的数据,n<=100
100%的数据,n<=10^15,m<=100,0<id<=n
如果数据范围小一点,直接用数组就可以搞定了就,但是这儿就不行了,所以考虑用STL中的map,轻松搞定。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string.h>
#include <math.h>
#include <map>
#define ll long long
#define inf 0x3f3f3f3f
#define enf -0x3f3f3f3f
#define maxn 1e15
using namespace std;
int main()
{
ll n,m,i,j,cot=0,id;
scanf("%lld%lld",&n,&m);
char str[20];
map<long long,bool>mp;
for(i=0;i<m;i++)
{
scanf("%s",str);
if(strcmp(str,"any")==0)
{
if(cot)
printf("T\n");
else
printf("F\n");
}
if(strcmp(str,"count")==0)
{
printf("%lld\n",cot);
}
if(strcmp(str,"find")==0)
{
scanf("%lld",&id);
if(mp[id])
printf("T\n");
else
printf("F\n");
}
if(strcmp(str,"filp")==0)
{
scanf("%lld",&id);
if(mp[id])
cot--;
else cot++;
mp[id]=!mp[id];
}
}
mp.clear();
return 0;
}