Rikka with Candies HDU 6085

其实这种中档的问题,要是好好思考的话还是可以想出来的就是要深入的思考,实在不行就改变一下思路。

这个书写bitset的模板还是应该好好的记住的,真的感觉不错。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<bitset>
#include<set>
#include<vector>

using namespace std;
const int N=6e4+32;
vector<int>G[N];
set<int>S;
int vis[N],a[N],b[N],res[N];
long long dig[N][50];
long long ans[N];
void inist(int r)
{
    for(int i=1;i<=r;i++)
    {
        for(int j=1;j*j<=i;j++)
        {
            if(i%j) continue;
            if(i%j==0)
            {
                G[i].push_back(j);
                if(i/j!=j) G[i].push_back(i/j);
            }
        }
        //sort(G[i].begin(),G[i].end());
    }

}
int main()
{
    int T;
    scanf("%d",&T);
    inist(N-2);
    while(T--)
    {
        S.clear();
        int n,m,q;
        int maxn_date=0;
        scanf("%d%d%d",&n,&m,&q);
        memset(ans,0,sizeof(ans));
        memset(dig,0,sizeof(dig));
        memset(res,0,sizeof(res));
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            vis[a[i]]=1;
            maxn_date=max(maxn_date,a[i]);
        }
        for(int i=1;i<=m;i++)
        {
            scanf("%d",&b[i]);
            S.insert(b[i]);
        }
        sort(b+1,b+1+m);
        for(int i=1;i<N-100;i++)
        {
            long long su=0;
            for(int j=0;j<32;j++)
            {
                su=su*2+vis[i+j];
                dig[i][j+1]=su;
                dig[i][j+1]<<=(31-j);
            }
        }

        for(int i=1;i<=maxn_date;i++)
        {
            int sz=G[i].size();
            for(int j=0;j<sz;j++)
            {
                int x=G[i][j];
                if(!S.count(x))continue;
                int L=0,R=x-1;
                while(L<=R)
                {
                    int d=L/32;
                    if(i+L>N-100) break;
                    if(L+31<=R)
                    {
                        ans[d]^=dig[i+L][32];
                        L+=32;
                    }
                    else
                    {
                        ans[d]^=dig[i+L][R-L+1];
                        L=R+1;
                    }
                }
            }
        }
        for(int i=0;i*32<=5e4+50;i++)
        {
            int j=(i+1)*32-1;
            int t=32;
            while(t--)
            {
                res[j]=ans[i]&1; j--;
                ans[i]>>=1;
            }
        }
        for(int i=1;i<=n;i++)
        {
           int  x=a[i];
           res[x]+=m-(upper_bound(b+1,b+1+m,x)-(b+1));
        }
        while(q--)
        {
            int k;
            scanf("%d",&k);
            printf("%d\n",res[k]&1);
        }
    }
}

  

时间: 2024-10-22 17:07:23

Rikka with Candies HDU 6085的相关文章

hdu 6085 Rikka with Candies(bitset)

题目链接:hdu 6085 Rikka with Candies 题意: 给你一个A序列和B序列,A和B内的每个数都不相同,现在有q个询问,问对于每个询问的k输出A[i]%B[j]==k的个数的奇偶性. 题解: 考虑两种情况: 1. 当A[i]<B[i]时,对于当前询问的k,只要A[i]中有k,那么大于A[i]的数都会有贡献. 2. 当A[i]>=B[i]时,如果A[i]%B[j]==k,那么会有(A[i]-k)%B[j]=0.此时只要B[j]是A[i]-k的因子就会有贡献. 所以我们将询问从

Rikka with Graph hdu 6090

题解:考虑贪心地一条一条边添加进去. 当 m \leq n-1m≤n?1 时,我们需要最小化距离为 nn 的点对数,所以肯定是连出一个大小为 m+1m+1 的联通块,剩下的点都是孤立点.在这个联通块中,为了最小化内部的距离和,肯定是连成一个菊花的形状,即一个点和剩下所有点直接相邻. 当 m > n-1m>n?1 时,肯定先用最开始 n-1n?1 条边连成一个菊花,这时任意两点之间距离的最大值是 22.因此剩下的每一条边唯一的作用就是将一对点的距离缩减为 11. 这样我们就能知道了最终图的形状了

【分块】【bitset】hdu6085 Rikka with Candies

给你数组A和B,A B中的元素大小都不超过5w,且两两不同. q次询问,每次给你个k,问你有多少对(i,j),满足A(i)%B(j)==k. 如题目所言模拟bitset的过程,实质上是个分块,每块的大小定为63. 一个小技巧是对于最终的那个数组w,分块后记63个w数组,每个数组最前面一块是零散的部分,大小从1~63,这样比较好操作. 最后把63个w里面的每一位的值都异或起来,就是对应的k的答案. #include<cstdio> #include<cstring> #include

Rikka with Competition hdu 6095

签到题目,排序然后按序清理掉一定会输的结果就可以. ac代码: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int a[100001]; int main() { int t; cin>>t; while(t--) { int n,k; int sum=0; scanf("%d %d&

BestCoder #37 Rikka with string (hdu 5205)

// 这题一开始看的时候觉得就是取最右边的问号,依次从大到小枚举 // 注意没有?和?在中间的情况特判,结果wa了十一发,还是没有找到 // 错误在哪里,看了一下discuss里面的数据发现5 b??ab这组用我先开始 // 的思路是跪了的.我的会输出QwQ... // // 然后看了看大牛们的思路,发现自己所谓的最右边是错的,这题要求字典序最小 // 可以先全部把?填成a,判断是否回文, // 如果不是回文直接输出, // 如果是回文,那么我们可以直接把最右边的不是中间的填成b,输出就好了 /

关于 bitset 的一些题目

参考 http://www.cplusplus.com/reference/bitset/bitset/ https://blog.csdn.net/snowy_smile/article/details/79120063 bitset bitset<MAXN> b; b.any() // b中是否存在置为1的二进制位. b.none() // b中是否不存在置为1的二进制位. b.count() // b中置为1的二进制位的个数. b.size() // b中二进制位数的个数. b[pos]

2019 杭电多校 第九场

2019 Multi-University Training Contest 9 补题链接:2019 Multi-University Training Contest 9 1005 Rikka with Game (HDU 6684) 题意 Rikka 和 Yuta 玩游戏.给定一个字符串.两人轮流对字符串操作.可以选择结束游戏,也可以改变其中一个字符,改变规则是:\(a\rightarrow b,b\rightarrow c,-,y\rightarrow z,z\rightarrow a.\

hdu 1514 Free Candies 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1514 题目意思:有4堆糖果,每堆糖果有n个,从上到下排好,取糖果只能从上往下取,取完的糖果放在篮子里,篮子里最多放5个,如果篮子里有两个颜色相同的糖果则可以取走放进口袋里,问最多能取走多少对糖果放进口袋.n<=40, 糖果颜色最多20种. 这题是抄这个人滴:http://fudq.blog.163.com/blog/static/1913502382014239225290/ 有些地方看得不太懂,本

HDU 5831 Rikka with Parenthesis II(六花与括号II)

HDU 5831 Rikka with Parenthesis II (六花与括号II) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Description 题目描述 As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some math ta