Jzoj4792 整除
来源:互联网 发布:淘宝网页显示不正常 编辑:程序博客网 时间:2024/06/01 15:33
给你一个1~n的排列A,询问一些区间内有多少对x,y使得A[x]|A[y]
我们考虑将所有的询问按照r排序,让后分成两部分计算:
1.A[i]|A[j] 且i>j
2.A[i]|A[j] 且i<j
这里只考虑第一种,第二种将所有询问对称翻转即可
我们建立一个树状数组,我们令i=1~n
每次将考虑A[i]的倍数,若kA[i]的位置j在i之前,我们就在树状数组中把s[j]+1
那么显然,对于一个询问,若其右端点为i,那么显然这个询问的答案就是树状数组中[l,i]的和
这样就完成了一部分的计算,另一部分可以翻转后按照同样的方法计算
最后答案记得加上r-l+1(区间长度)
#include<stdio.h>#include<string.h>#include<algorithm>#define N 200020using namespace std;inline int c(int x){ return x&-x; }struct E{ int l,r,k; } s[N];inline bool c1(E a,E b){ return a.r<b.r; }int n,m,t=0,b[N],d[N],A[N],v[N];inline void sp(int& a,int& b){ a^=b; b^=a; a^=b; }inline void add(int x){ for(;x<=n;x+=c(x)) b[x]++; }inline int sum(int x,int k=0){ for(;x;x^=c(x)) k+=b[x]; return k; }void KM(){memset(b,0,sizeof b);for(int i=1,j;i<=m;++i){for(j=s[i-1].r+1;j<=s[i].r;++j)for(int k=2,z=n/d[j];k<=z;++k)if(v[k*d[j]]<j) add(v[k*d[j]]);A[s[i].k]+=sum(s[i].r)-sum(s[i].l-1);}}int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;++i) scanf("%d",d+i),v[d[i]]=i;for(int i=1;i<=m;s[i].k=i,++i) scanf("%d%d",&s[i].l,&s[i].r),A[i]=s[i].r-s[i].l+1;sort(s+1,s+1+m,c1); KM();reverse(d+1,d+1+n);for(int i=1;i<=n;++i) v[i]=n-v[i]+1;for(int i=1;i<=m;++i) { sp(s[i].l,s[i].r);s[i].l=n-s[i].l+1;s[i].r=n-s[i].r+1;}sort(s+1,s+1+m,c1); KM();for(int i=1;i<=m;++i) printf("%d\n",A[i]);}
阅读全文
1 0
- Jzoj4792 整除
- 【jzoj4792】【整除】【树状数组】
- NOIP提高组【JZOJ4792】整除
- 【JZOJ4792】【NOIP2016提高A组模拟9.21】整除
- 整除
- 整除
- 整除
- 整除
- 整除
- 整除
- [引]整除
- 整除问题
- 整除规则
- 长整除
- 长整除
- 整除11
- 整除性
- 整除程序
- tensorflow 运行过程中loss出现 NaN
- Java互联网架构-如何设计服务接口API限流功能
- 大数据Spark02算子
- 8IO流的分类字符流复制文本文件InputStream和outputStream的概述:分别使用字符流和字节流进行图片的复制字节流复制文本文件字节打印流 PrintStream 字符打印流 Prin
- Adobe Digital Editions打开epub书籍文件,中文都是乱码问题的解决
- Jzoj4792 整除
- 博客积累的一些感慨
- Java互联网架构-Mysql分库分表订单生成系统实战分析
- 小仙女讲软考(六):说说测试那些事儿
- 有没有大神能够逐行解释一下代码?Delphi
- 旷视 CEO 印奇:靠“刷脸”折腾出 120 亿的大生意
- vue 学习一
- Spring配置事物的5种方式
- Go实现快速排序算法