Rikka with Candies 【HDU - 6085】【bitset】

题目链接


  有N个人,有M个物品,并且给出N个人手中的钱A[i],再给出每个物品的单价B[i],现在,我们要求的是pair(i, j) == k的对数,pair(i, j)表示的是第i个人花尽可能多的钱,买第j个物品,剩余的钱是k。我们现在查询这样的K。

  然后把式子化简一下,其实就是相当于A - K = \lambda * B,那么,我们要查询全体的K对应的Ki,我们可以直接放在bitset中来维护。我们可以把所有的B也存在bitset中去(定义为bx),然后我们查的是(A >> K) & bx中1的数量就是对应的个数了(% 2)。

  这题很容易被卡:3494ms,可能是写的还是不够啊!!!

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
#include <unordered_map>
#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
int N, M, Q, price[50005], _UP;
bitset<50005> A, B, ans, bx;
inline void init()
{
    A.reset(); B.reset();
    ans.reset(); bx.reset();
    _UP = 0;
}
int main()
{
    int T; scanf("%d", &T);
    while(T--)
    {
        scanf("%d%d%d", &N, &M, &Q);
        init();
        for(int i=1, ai; i<=N; i++)
        {
            scanf("%d", &ai);
            A.set(ai);
        }
        for(int i=1, bi; i<=M; i++)
        {
            scanf("%d", &bi);
            B.set(bi); _UP = max(_UP, bi);
        }
        for(int i=_UP; i>=0; i--)
        {
            ans[i] = (((A >> i) & bx).count()) & 1;
            if(B[i])
            {
                for(int j=0; j <= _UP; j += i)
                {
                    bx.flip(j);
                }
            }
        }
        int xx;
        while(Q--)
        {
            scanf("%d", &xx);
            printf("%d\n", ans[xx] & 1);
        }
    }
    return 0;
}
发布了722 篇原创文章 · 获赞 891 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_41730082/article/details/103858473