题目链接

HDU 6085 Rikka with Candies

分析

其实很容易想到一个有技巧的暴力方法,我们可以这样办

首先对于每一个 AiA_i 我们考虑比 AiA_i 大的部分 BB ,对于这部分 B,Ai%B=AiB,A_i\%B = A_i ,所以我们通过计算前缀和可以在 O(1)O(1) 计算出这部分值,因此我们先不考虑这部分值,

对于比 AiA_i 小的部分 BB 我们反过来对每个 BiB_i 考虑比 BiB_i 大的部分 AA,那么对于每个 Bi,AiB_i,A_i 的贡献一定是 [0,1,2…,Bi−1][0,1,2\dots ,B_i-1] 的循环,即 A,[Bi,maxAi]A,[B_i,maxA_i] 这一部分的贡献恰好是循环 [0,1,2…,Bi−1][0,1,2\dots ,B_i-1] ,如果我们把 AiA_i 处理成

a[i] : 用01表示值为i的数存在与否,b[i]同理

则对于每个 BiB_i 我们只需将 a[k∗Bi,(k+1)Bi−1]a[k*B_i,(k+1)B_i-1] 这一部分加到答案 ans[0,1,2…,Bi−1]ans[0,1,2\dots ,B_i-1] ,暴力是 O(n∗m)O(n*m) 如果我们将 aa 压位就可以在 O(n∗m/32)O(n*m/32) 得出结果.具体压位可见代码

AC code

// Problem : 6085 ( Rikka with Candies )     Judge Status : Accepted
// RunId : 21600845    Language : G++    Author : zouzhitao
// Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
#include<bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define PI acos(-1)
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define INF64 0x3f3f3f3f3f3f3f3f
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define ms(x,v) memset((x),(v),sizeof(x))
#define scint(x)  scanf("%d",&x );
using namespace std;
const int MOD = 1e9+7;
const double eps = 1e-8;
typedef long long LL;
typedef long double DB;
typedef pair<int,int> PII;const int maxn = 5e4 +10;LL ans[maxn];
LL bit_ans[maxn];
int a[maxn],b[maxn];
LL digit[maxn][35];
LL sum[maxn];
int maxa,maxb;
void add(int idx,int l){//重idx开始+l位到bit_ans;int L = 0 , R = min(maxa-idx,l-1);while (L<=R) {int d = L/32;if(idx+L>maxa)break;if(R-L>=31){bit_ans[d] ^=digit[idx+L][32];L+=32;}else{bit_ans[d] ^=digit[idx+L][R-L+1];L=R+1;}// std::cout << L<<" LR "<<R << "d = "<<d <<"idx="<<idx <<'\n';// std::cout << bitset<64>(bit_ans[d]) << '\n';}
}
int main(int argc, char const *argv[]) {int T;scanf("%d",&T );while (T--) {maxa = 0;maxb = 0;int n,m,k;scanf("%d%d%d",&n,&m,&k );ms(a,0);ms(b,0);ms(ans,0);ms(digit,0);ms(sum,0);ms(bit_ans,0);for(int i=0 ; i<n ; ++i){int x;scanf("%d",&x );a[x] =1;maxa = max(x,maxa);}for(int i=0 ; i<m ; ++i){int x;scint(x);b[x]=1;maxb = max(maxb,x);}//压位for(int i=1 ; i<=maxa ; ++i){LL bit =0;// std::cout << i<<" " <<a[i] << '\n';for(int j =0 ; j<32&&(i+j)<=maxa ; ++j){bit <<=1;bit |=a[i+j];//从i开始长度为j+1的位digit[i][j+1] = bit<<(31-j);// std::cout << bitset<64>(digit[i][j+1]) << '\n';}}for(int i=1 ; i<=maxb ; ++i){if(b[i]){// std::cout << i<<" bi "<<b[i] << '\n';for(int j=i ; j<=maxa ;j+=i ){add(j,i);}}}for(int i=0 ; i*32 <=5e4 ; ++i){int j = (i+1) * 32 -1;int t =32;while (t--) {ans[j] = bit_ans[i]&1;j--;bit_ans[i]>>=1;}}sum[0] =0;for(int i=1 ; i<=maxb ; ++i){sum[i] = sum[i-1] + b[i];}for(int i=1 ; i<=maxa ; ++i){if(a[i]){ans[i]^= (sum[maxb]-sum[i])&1;}}while (k--) {int x;scint(x);printf("%d\n",ans[x] );}}return 0;
}

HDU 6085 Rikka with Candies (暴力压位)相关推荐

  1. 2017 Multi-University Training Contest - Team 5 1.Rikka with Candies(压位)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=6085 题意:给定长度分别为n,m的数组A和B,给定q个询问,每次询问给出一个k,求满足Ai%Bj=k的数对 ...

  2. hdu 6086 Rikka with String(AC自动机+状压dp)

    题目链接:hdu 6086 Rikka with String 题意: 给你n个只含01的串,和一个长度L,现在让你构造出满足s[i]≠s[|s|−i+1] for all i∈[1,|s|] ,长度 ...

  3. 斐波那契数列大数的压位c语言,HDU 1568 Fibonacci(大数前4位)

    分析:x=1234567.求其前四位数: log10(x)=log10(1.234567)+6. 所以1.234567=10^(log10(x)-6). 1234 =(int) 10^(log10(x ...

  4. [压位DP]Hdu 6149——Valley Numer II

    题目梗概 给定一个无向图,图中的点存在高低. 定义山谷为:一个低点连接两个相邻的高点. 求不相交的山谷的最大个数. 解题思路 一看这个高点个数<=15高点个数就马上想到压位DP. i表示前i个点 ...

  5. 【Codeforces - 找不到题号】三元环计数(bitset优化,压位)

    题干: 给你一个二维字符矩阵,如果 ( i , j ) 为+ 表明 两点之间有一条有向边,为-表示没有边,那么你要找出所有的三元环的个数.顶点数N<=1500. 解题报告: 考虑最暴力的方法,开 ...

  6. 【BZOJ3616】War,KD树+bitset压位

    思路: 一开始想到顺序无关.轮数独立啥的,想用DP来做,但发现怎么定义状态都有后效性,想套容斥发现也没有什么用,后来聪哥提供思路(bao chu zheng jie),对于一些概率期望的题目,除DP外 ...

  7. HDU 6091 - Rikka with Match | 2017 Multi-University Training Contest 5

    思路来自 某FXXL 不过复杂度咋算的.. /* HDU 6091 - Rikka with Match [ 树形DP ] | 2017 Multi-University Training Conte ...

  8. 高精度(压位+判负数+加减乘+读写)

    本算法目前属于还处于测试状态,欢迎Hack! struct gj{bool fu; //是否是负数int tt,mod; //高精的长度int s[40005]; //压位用的数组inline gj( ...

  9. 火车进出栈问题(高精度+压位+质因数分解消除除法)

    题目描述 一列火车n节车厢,依次编号为1,2,3,-,n. 每节车厢有两种运动方式,进栈与出栈,问n节车厢出栈的可能排列方式有多少种. 输入格式 输入一个整数n,代表火车的车厢数. 输出格式 输出一个 ...

最新文章

  1. vb listview 修改
  2. django restfull centos6.5 x86_64 python2.7
  3. 2021-9-下旬 数据结构-线性表-双向链表-java代码实现(复习用)
  4. boost::hana::lift用法的测试程序
  5. FEA-Net论文梳理
  6. 云原生网络性能优化:service mesh 篇
  7. ADB连接手机的三种方式USB、WLAN、WIFI
  8. java调用webservice接口方法整理
  9. 基于SpringBoot实现单点登录系统
  10. word 插入单页页脚
  11. 小程序地理位置接口申请
  12. 图像增强(空间域)——灰度变换
  13. 基于来信码的短信通知平台
  14. 打印可自定义的字母金字塔(python实现)
  15. windows10安装配置vim
  16. 硬实时RTLinux安装配置详解 (一):准备工作
  17. Google CardBoard SDK for Unity集成指南
  18. Windows RGBDS 及 BGB 的安装 及 HelloWorld
  19. latex中文小标题_LaTeX标题怎样使用中文?
  20. OCJP(1Z0-851) 模拟题分析(三)

热门文章

  1. 企业社会责任与消费者话语权
  2. android锁屏机制探讨
  3. 2021-RedHat-CTF-WP【MISC】
  4. 华为首款鸿蒙,本报记者体验华为首款鸿蒙产品
  5. 公司企业搭建网站需要哪些步骤?
  6. SpringBoot和Mybatis实现评论楼中楼功能(一张表搞定)
  7. 勒索病毒应急响应指导手册
  8. 新概念二册 Lesson 22 A glass envelope玻璃信封 ( 修饰比较级)
  9. Coherence企业级缓存特点
  10. 如何快速提升自己硬实力