• HDU 6085


    看了标程的压位,才知道压位也能很容易写- -

    /*
    HDU 6085 - Rikka with Candies [ 压位 ]  |  2017 Multi-University Training Contest 5
    题意:
    	给定 A[N], B[N], Q 个 k
    	对于每个k, 求 A[i] % B[j] == k 的 (i,j)对数 
    	限制 N, Q <=50000
    分析:
    	对于每个 B[i] 按其倍数分块,则对于 A[j] ∈ [x*B[i],(x+1)*B[i]) , A[j]%B[i] = A[j] - x*B[i]
    	故事先将A数组处理成权值数组
    	枚举B[i] 和 B[i] 的每一个分块,将每个分块 [x*B[i],(x+1)*B[i]) 的值合并到 ans 的 [0, B[i]) 中
    	复杂度 O(n^2) 
    	对数组进行压位,压32位,这样合并起来快
    	
    	对 l = x*B[i], r = (x+1)*B[i] 进行合并时,若l,r不为32的倍数,就非常麻烦
    	所以开32个压位数组,第i个数组存 l+i,这样就有一个数组满足 (l+i) % 32 == 0,容易合并
    	(r-l)% 32 != 0 时,多余的那部分手动合并
    */
    #include <bits/stdc++.h>
    using namespace std;
    unsigned int a[32][10005], ans[10005];
    void Set(unsigned int a[], int x)
    {
        a[x>>5] ^= 1<<(x&31);
    }
    bool Get(unsigned int a[], int x)
    {
        return a[x>>5] & (1<<(x&31));
    }
    void solve(int l, int r)
    {
        while ((r-l)&31)
        {
            r--;
            if (Get(a[0], r)) Set(ans, r-l);
        }
        int m = 0;
        while (l&31) l++, r++, m++;
        l >>= 5, r >>= 5;
        for (int i = l; i < r; i++)
            ans[i-l] ^= a[m][i];
    }
    int t, n, m, q, Max;
    int main()
    {
        scanf("%d", &t);
        while (t--)
        {
            scanf("%d%d%d", &n, &m, &q);
            memset(a, 0, sizeof(a));
            memset(ans, 0, sizeof(ans));
            Max = 0;
            while (n--)
            {
                int x; scanf("%d", &x);
                Max = max(Max, x);
                for (int i = 0; i < 32; i++) Set(a[i], x+i);
            }
            while (m--)
            {
                int b; scanf("%d", &b);
                for (int i = 0; i <= Max; i += b)
                    solve(i, min(Max+1, i+b));
            }
            while (q--)
            {
                int k; scanf("%d", &k);
                if (Get(ans, k)) puts("1");
                else puts("0");
            }
        }
    }
    

      

  • 相关阅读:
    JS leetcode 买卖股票的最佳时机 题解分析,我离职了。
    JS leetcode x 的平方根 题解分析
    JS leetcode 有多少小于当前数字的数字 解题分析,你应该了解的桶排序
    JS leetcode 合并两个有序数组 解题分析
    JavaSE部分 (多线程下)
    JavaSE部分 (多线程上)
    JavaSE部分 (异常)
    JavaSE部分 集合下(Map)
    JavaSE部分 集合中(数据结构 list set Collections)
    JavaSE (接口 final 内部类)
  • 原文地址:https://www.cnblogs.com/nicetomeetu/p/7310593.html
Copyright © 2020-2023  润新知