问题 A: 奖品选择

时间限制: 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值