L.Mod

题目大意

给定一个序列和 l,r,kl,r, kl,r,k,询问 [l,r][l,r][l,r] 中的数字 mod kkk 的最大值,1≤n,k≤500001\leq n,k\leq 500001≤n,k≤50000


分块,预处理fi,jf_{i,j}fi,j​表示第iii块mod jjj的最大值。

对于每一块,维护 mximx_imxi​, 表示本块内所有出现过的数字中不小于iii的最大的数字。

对于fi,jf_{i,j}fi,j​,依次枚举长度为jjj的区间[k×j,k×j+j−1][k×j,k×j+j-1][k×j,k×j+j−1],于是有
fi,j=max⁡k{mxk×j+j−1−k×j}f_{i,j}=\max_{k}\{\text{mx}_{k×j+j-1}-k×j\}fi,j​=kmax​{mxk×j+j−1​−k×j}

设块的大小为B\text BB
时间复杂度为O{NBNlog⁡N+M(B+NB)}O\{\frac N{\text B}N\log N+M(\text B+\frac N{\text B})\}O{BN​NlogN+M(B+BN​)}

取B=N+N2log⁡NM\text B=\sqrt{N+\frac{N^2\log N}{M}}B=N+MN2logN​​最优

Code

此代码并未经过验证,无意间看到之前校赛的题目,貌似已经没有oj去测评。。。

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
template <class T=int> T rd()
{T res=0;T fg=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') fg=-1;ch=getchar();}while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res*fg;
}
const int N=50010;
int n,m;
int a[N];
int b[N],Bs;
int f[400][N],mx[N];
void prework()
{Bs=sqrt(10*n);for(int i=1;i<=n;i++) b[i]=(i-1)/Bs+1;for(int i=1;i<b[n];i++){for(int k=(b[i]-1)*Bs+1;k<b[i]*Bs;k++) mx[a[k]]=a[k];memeset(mx,0,sizeof mx);for(int j=1;j<=50000;j++) mx[j]=max(mx[j],mx[j-1]);for(int j=1;j<=50000;j++)for(int k=1;k*j+j-1<=50000;k++)f[i][j]=max(f[i][j],mx[k*j+j-1]-k*j);}
}
int query(int l,int r,int v)
{int ans=0;for(int i=l;i<=min(r,Bs*b[l]);i++) ans=max(ans,a[i]%v);if(b[l]!=b[r]) for(int i=(b[r]-1)*Bs+1;i<=r;i++) ans=max(ans,a[i]%v);for(int i=b[l]+1;i<b[r];i++) ans=max(ans,f[i][v]);return ans;
}
int main()
{n=rd(),m=rd();for(int i=1;i<=n;i++) a[i]=rd();prework();while(m--) {int l=rd(),r=rd(),k=rd();printf("%d\n",query(l,r,k));}return 0;
}

L. Mod(预处理+分块)相关推荐

  1. Codeforces Round #701 (Div. 2) C. Floor and Mod 数学分块

    传送门 题意: 给两个数x,yx,yx,y.现在你计算有多少对a(a<=x)a(a<=x)a(a<=x)和b(b<=y)b(b<=y)b(b<=y)使得⌊ab⌋=a ...

  2. *【HDU - 6333】Problem B. Harvest of Apples (莫队,逆元,组合数学)(这样预处理正确吗?)

    题干: There are nn apples on a tree, numbered from 11 to nn.  Count the number of ways to pick at most ...

  3. LOJ——#6277. 数列分块入门 1

    ~~推荐播客~~ 「分块」数列分块入门1 – 9 by hzwer 浅谈基础根号算法--分块 博主蒟蒻,有缘人可直接观摩以上大佬的博客... #6277. 数列分块入门 1 题目大意: 给出一个长为 ...

  4. 洛谷 - P4168 [Violet]蒲公英(分块+离散化)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列,再给出 m 次查询,每次查询区间 [ l , r ] 内的众数,要求强制在线 题目分析:对于这个题意来说,如果允许离线的话,完全可以用莫队当模 ...

  5. P2260 [清华集训2012]模积和,P2834 能力测验(二维除法分块)

    P2260 [清华集训2012]模积和 推导过程 我们假定n<=mn <= mn<=m ∑i=1n∑j=1m(nmodi)(mmodj),i≠j\sum_{i = 1} ^{n} ...

  6. Codeforces Round #740 (Div. 2) D2. Up the Strip dp + 分块优化 + 逆向思维

    传送门 文章目录 题意: 思路 题意: 有nnn个细胞,你初始在第nnn细胞上,假设你当前在xxx处,你每次可以进行如下两个操作: (1)(1)(1)选择[1,x−1][1,x-1][1,x−1]内一 ...

  7. P3935 Calculating 整除分块

    传送门 文章目录 题意: 思路: 题意: 思路: 我们设s(x)=∑i=1nf(x)s(x)=\sum_{i=1}^nf(x)s(x)=∑i=1n​f(x),那么答案就是s(r)−s(l−1)s(r) ...

  8. [CQOI2017] 小Q的表格(分块 + 整除分块 + 数学 + 前缀和)

    problem luogu-P3700 solution f(a,b)=f(b,a)f(a,b)=f(b,a)f(a,b)=f(b,a) 意味着我们只用考虑半个棋盘的信息. b∗f(a,a+b)=(a ...

  9. 数论分块练习([CF830 C]Bamboo Partition + [hdu 6395]Sequence )

    文章目录 T1:Sequence title solution T2:Bamboo Partition title solution code T1:Sequence title 传送 solutio ...

最新文章

  1. Relation Networks for Object Detection
  2. 网络表述学习经典论文——DeepWalk
  3. MySQL带BETWEEN AND关键字的查询
  4. 处女座和小姐姐(二)
  5. “我,程序员,33岁,距离退休,只剩2年了!”
  6. linux chcon命令详解
  7. vim golang 插件
  8. java selenium_关于selenium的介绍
  9. linux c编程错误汇总
  10. php tr td,php-基于tr计数的Td / th的XPath
  11. LINUX下载编译libffi
  12. PHP数组按字符串长度排序
  13. GB2312、BIG5、GBK、GB18030简介
  14. Java测试框架系列:Mockito 详解:第三部分:结果验证
  15. 【HUST】网络攻防实践|5_二进制文件补丁技术|实验二 getshell
  16. Bank相关1_数据移行
  17. yandex如何挑选关键词?
  18. python基础(七)散点类型与格式化输出
  19. Eclipse注释中文格式没对齐
  20. WEB漏洞测试(二)——HTML注入 XSS攻击

热门文章

  1. python json方法详解_python详解json模块
  2. 7500 cpuz跑分 i5_核心硬盘 i5 7500性能测试_DIY攒机酷品测试-中关村在线
  3. tableau三轴合并_《Tableau数据可视化实战》——1.12节合并不同数据源-阿里云开发者社区...
  4. mysql 设置宽松模式_mysql5.6 sql_mode设置为宽松模式
  5. mockmvc get请求 tm的 一直404_大家快来看看404的兄弟姐妹
  6. mysql decimal型转化为float_5分钟搞懂MySQL数据类型之数值型DECIMAL类型
  7. [剑指offer]面试题45:圆圈中最后剩下的数字
  8. C++ class实现顺序队列(完整代码)
  9. Aeroplane chess HDU - 4405(期望dp)
  10. python对浏览器的常用操作_selenium+python基本操作(02)