L2-049 鱼与熊掌 (set做法)

        今天写到这道题的时候,突然想到了可以利用set容器的不含重复元素的特性来做这道题,感觉做法比较简单,一开始是有一个测试点超时的,但是当把cin输入改成scanf输入就刚刚好能过。

        思路:用set数组(下标为人的编号)来存入每个人拥有的物品,然后对于每次询问尝试依次添加两种物品,如果两次的set的大小都不变,则说明是包含这两种的(因为set容器不会放入重复元素),如果某一次的set的大小变了,说明不包含该物品,此时要删除放入的物品,并执行下一次循环。

代码如下:

#include<iostream>
#include<set>

using namespace std;
const int N = 1e5 + 10;

int n, m, q;
int a, b, cnt;
set<int> p[N];

int main()
{
    cin >> n >> m;
    for(int i = 1 ; i <= n ; i ++ )
    {
        int k;
        cin >> k;
        for(int j = 0 ; j < k ; j ++ )
        {
            int x;
            scanf("%d",&x);
            p[i].insert(x);
        }
    }    //存入数据
    scanf("%d",&q);
    while(q -- )
    {
        cnt = 0;
        cin >> a >> b;
        for(int i = 1 ; i <= n ; i ++ )
        {
            int len = p[i].size();    //先存原来的大小
            p[i].insert(a);
            if(len != p[i].size())
            {
                p[i].erase(a);
                continue;
            }
            p[i].insert(b);
            if(len != p[i].size())
            {
                p[i].erase(b);
                continue;
            } //依次尝试放入两种物品
            cnt ++;
        }
        printf("%d\n",cnt);
    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值