【分块】【bitset】hdu6085 Rikka with Candies

本文介绍了一种解决特定模算子问题的方法,通过使用bitset和分块技术来高效地处理数组A和B中元素的模运算。针对给定的多次查询,该算法能够快速找出所有满足A(i)%B(j)==k条件的数对(i,j)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给你数组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<algorithm>
using namespace std;
const int SZ=63;
typedef unsigned long long ull;
ull blo[805],b[67][805],lss[67];
int T,n,m,q,sum=794,l[805],r[805],num[50005],sz[805];
bool a[50005],c[50005];
int main(){
	int x;
	scanf("%d",&T);
	for(;T;--T){
		memset(a,0,sizeof(a));
		memset(blo,0,sizeof(blo));
		memset(b,0,sizeof(b));
		memset(lss,0,sizeof(lss));
		memset(l,0,sizeof(l));
		memset(r,0,sizeof(r));
		memset(num,0,sizeof(num));
		memset(sz,0,sizeof(sz));
		memset(c,0,sizeof(c));
		scanf("%d%d%d",&n,&m,&q);
		for(int i=1;i<=n;++i){
			scanf("%d",&x);
			a[x]=1;
		}
		r[0]=-1;
		for(int i=1;i<=sum;++i){
			l[i]=r[i-1]+1;
			r[i]=min(i*SZ-1,50000);
			sz[i]=r[i]-l[i]+1;
			for(int j=l[i],p=0;j<=r[i];++j,++p){
				if(a[j]){
					blo[i]|=((ull)1<<p);
				}
				num[j]=i;
			}
		}
		for(;m;--m){
			scanf("%d",&x);
			for(int ql=0;ql<=50000;ql+=x){
				int qr=min(ql+x-1,50000);
				if(num[ql]==num[qr]){
					int fls=ql-l[num[ql]];
					lss[qr-ql+1]^=((blo[num[ql]]>>fls)&(((ull)1<<(qr-ql+1))-(ull)1));
				}
				else{
					int ls=r[num[ql]]-ql+1;
					for(int i=num[ql]+1,j=1;i<num[qr];++i,++j){
						b[ls][j]^=blo[i];
					}
					int rs=qr-l[num[qr]]+1;
					lss[ls]^=(blo[num[ql]]>>(sz[num[ql]]-ls));
					b[ls][num[qr]-num[ql]]^=(blo[num[qr]]&(((ull)1<<rs)-(ull)1));
				}
			}
		}
		for(int i=1;i<=SZ;++i){
			for(int j=0;j<i;++j){
				c[j]^=((lss[i]>>j)&(ull)1);
			}
			int now=0,wei;
			for(int k=i,p=1;k<=50000;++k,++p,++wei){
				if(p%SZ==1){
					++now;
					wei=0;
				}
				c[k]^=((b[i][now]>>wei)&((ull)1));
			}
		}
		for(;q;--q){
			scanf("%d",&x);
			printf("%d\n",c[x]);
		}
	}
	return 0;
}

转载于:https://www.cnblogs.com/autsky-jadek/p/7308919.html

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值