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的因子就会有贡献。

所以我们将询问从大到小排序,将大于k的B[j]是那些数的因子筛一下。

然后用bitset优化一下,将相同的询问优化掉。

所以最后的复杂度为O( 50000*log(50000)+50000*q/32)

 1 #include<bits/stdc++.h>
 2 #define mst(a,b) memset(a,b,sizeof(a))
 3 #define F(i,a,b) for(int i=(a);i<=(b);++i)
 4 using namespace std;
 5 typedef pair<int,int>P;
 6
 7 const int N=5e4+7;
 8 int t,n,m,q,a[N],b[N],ans[N],sum[N],vis[N];
 9 bitset<N>ba,bb,tmp;
10 P ask[N];
11
12 int main(){
13     scanf("%d",&t);
14     while(t--)
15     {
16         ba.reset(),bb.reset(),mst(vis,0);
17         scanf("%d%d%d",&n,&m,&q);
18         F(i,1,n)scanf("%d",a+i),ba[a[i]]=1;
19         F(i,1,m)scanf("%d",b+i),vis[b[i]]=1;
20         for(int i=50000;i>=0;i--)sum[i]=vis[i+1]^sum[i+1];
21         F(i,1,q)
22         {
23             scanf("%d",&ask[i].first);
24             ask[i].second=i;
25         }
26         sort(ask+1,ask+1+q,greater<P>());
27         int now=50000;
28         F(i,1,q)
29         {
30             int k=ask[i].first;
31             if(i>1&&k==ask[i-1].first)
32             {
33                 ans[ask[i].second]=ans[ask[i-1].second];
34                 continue;
35             }
36             while(now>k)
37             {
38                 if(vis[now])
39                     for(int j=now;j<=50000;j+=now)
40                         bb.flip(j);
41                 now--;
42             }
43             int cnt=(((ba>>k)&bb).count())&1;
44             if(ba[k])cnt^=sum[k];
45             ans[ask[i].second]=cnt;
46         }
47         F(i,1,q)printf("%d\n",ans[i]);
48     }
49     return 0;
50 }

时间: 2024-10-10 13:38:45

hdu 6085 Rikka with Candies(bitset)的相关文章

HDU 4920 Matrix multiplication(bitset)

HDU 4920 Matrix multiplication 题目链接 题意:给定两个矩阵,求这两个矩阵相乘mod 3 思路:没什么好的想法,就把0的位置不考虑,结果就过了.然后看了官方题解,上面是用了bitset这个东西,可以用来存大的二进制数,那么对于行列相乘,其实就几种情况,遇到0都是0了,1 1得1,2 1,1 2得2,2 2得1,所以只要存下行列1和2存不存在分别表示的二进制数,然后取且bitcount一下的个数,就可以计算出相应的数值了 代码: 暴力: #include <cstdi

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

hdu 5425 Rikka with Tree II(暴力)

题目链接:hdu 5425 Rikka with Tree II 直接枚举就好了,当概率极小时贡献值可以忽略. #include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <queue> #include <algorithm> using namespace std; const int maxn = 1e5 + 5; int N,

hdu 6092 Rikka with Subset(01背包)

题目链接:hdu 6092 Rikka with Subset 题意: 给你n和m,让你找一个字典序最小的含有n个数的A序列,使得A序列的和为m, 然后给你m+1个数,是A序列所有的集合的和的个数,然后让你找出这个A序列. 题解: 和题解一样的思想. 1 #include<bits/stdc++.h> 2 #define mst(a,b) memset(a,b,sizeof(a)) 3 #define F(i,a,b) for(int i=(a);i<=(b);++i) 4 using

判断相同区间(lazy) 多校8 HDU 5828 Rikka with Sequence

1 // 判断相同区间(lazy) 多校8 HDU 5828 Rikka with Sequence 2 // 题意:三种操作,1增加值,2开根,3求和 3 // 思路:这题与HDU 4027 和HDU 5634 差不多 4 // 注意开根号的话,遇到极差等于1的,开根号以后有可能还是差1.如 5 // 2 3 2 3... 6 // 8 9 8 9... 7 // 2 3 2 3... 8 // 8 9 8 9... 9 // 剩下就是遇到区间相等的话,就直接开根号不往下传 10 11 12

hdu 5204 Rikka with sequence

题意: 众所周知,萌萌哒六花不擅长数学,所以勇太给了她一些数学问题做练习,其中有一道是这样的: 如果一个无重边无自环的无向图的每个联通块都存在一条回路经过这个联通分量所有边一次且仅一次,那么就称这个无向图是优美的.请问有n个点且边数不少于m的优美的图有多少个?(在这题中,我们认为这n个点是本质不同的) 当然,这个问题对于萌萌哒六花来说实在是太难了,你可以帮帮她吗? 限制: 1 <= n <= 1e5; 1 <= L <= R <= 1e18; 1 <= w <=

hdu 5203 Rikka with wood sticks

题意: 勇太有一根长度为n的木棍,这个木棍是由n个长度为1的小木棍拼接而成,当然由于时间放置的久了,一些小木棍已经不牢固了,所以勇太想让六花把这个木棍分成正整数长度的4段,其中有3段要没有不牢固的小木棍,勇太希望这3段木棍的长度和可以最大.同时六花希望在满足勇太要求的情况下让这三根木棍能拼成一个三角形,请问萌萌哒六花有多少种可行的分割方案呢? 限制: 1 <= n <= 1e6; 1 <= m <= 1e3 思路: 实际上问题会化为: 1. 给出长度为l1,l2的木棒,把其中一根截

HDU 4920 Matrix multiplication(std::bitset)

题目连接 :http://acm.hdu.edu.cn/showproblem.php?pid=4920 题意 :给两个n*n的矩阵A.B,要求算的A*B (答案对3取模) (比赛的时候一直想不到怎么去消复杂度,在最后的时候想到了用三进制压几位状态(就是几位几位算)应该可以过的,可是敲完比赛也结束.(压6位是可以过的) 正解是bitset搞,第一次接触到bitset这个神器,用起来确实很炫酷. 方法是统计A矩阵mod3后1出现在哪些位置,2出现哪些位置,B也一样,只是A是以一行为一个“状态”,

Hdu 5407 CRB and Candies (找规律)

题目链接: Hdu 5407 CRB and Candies 题目描述: 给出一个数n,求lcm(C(n,0),C[n,1],C[n-2]......C[n][n-2],C[n][n-1],C[n][n])%(1e9+7)是多少? 解题思路: 刚开始的时候各种开脑洞,然后卡题卡的风生水起.最后就上了数列查询这个神奇的网站,竟然被我找到了!!!!就是把题目上给的问题转化为求lcm(1, 2, 3, 4 ...... n-2, n-1, n, n-1) / (n+1),扎扎就打了两个表一个lcm[n