L. Mod(预处理+分块)
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=maxk{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{NBNlogN+M(B+NB)}O\{\frac N{\text B}N\log N+M(\text B+\frac N{\text B})\}O{BNNlogN+M(B+BN)}
取B=N+N2logNM\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(预处理+分块)相关推荐
- 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 ...
- *【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 ...
- LOJ——#6277. 数列分块入门 1
~~推荐播客~~ 「分块」数列分块入门1 – 9 by hzwer 浅谈基础根号算法--分块 博主蒟蒻,有缘人可直接观摩以上大佬的博客... #6277. 数列分块入门 1 题目大意: 给出一个长为 ...
- 洛谷 - P4168 [Violet]蒲公英(分块+离散化)
题目链接:点击查看 题目大意:给出一个长度为 n 的数列,再给出 m 次查询,每次查询区间 [ l , r ] 内的众数,要求强制在线 题目分析:对于这个题意来说,如果允许离线的话,完全可以用莫队当模 ...
- P2260 [清华集训2012]模积和,P2834 能力测验(二维除法分块)
P2260 [清华集训2012]模积和 推导过程 我们假定n<=mn <= mn<=m ∑i=1n∑j=1m(nmodi)(mmodj),i≠j\sum_{i = 1} ^{n} ...
- 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]内一 ...
- P3935 Calculating 整除分块
传送门 文章目录 题意: 思路: 题意: 思路: 我们设s(x)=∑i=1nf(x)s(x)=\sum_{i=1}^nf(x)s(x)=∑i=1nf(x),那么答案就是s(r)−s(l−1)s(r) ...
- [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 ...
- 数论分块练习([CF830 C]Bamboo Partition + [hdu 6395]Sequence )
文章目录 T1:Sequence title solution T2:Bamboo Partition title solution code T1:Sequence title 传送 solutio ...
最新文章
- Relation Networks for Object Detection
- 网络表述学习经典论文——DeepWalk
- MySQL带BETWEEN AND关键字的查询
- 处女座和小姐姐(二)
- “我,程序员,33岁,距离退休,只剩2年了!”
- linux chcon命令详解
- vim golang 插件
- java selenium_关于selenium的介绍
- linux c编程错误汇总
- php tr td,php-基于tr计数的Td / th的XPath
- LINUX下载编译libffi
- PHP数组按字符串长度排序
- GB2312、BIG5、GBK、GB18030简介
- Java测试框架系列:Mockito 详解:第三部分:结果验证
- 【HUST】网络攻防实践|5_二进制文件补丁技术|实验二 getshell
- Bank相关1_数据移行
- yandex如何挑选关键词?
- python基础(七)散点类型与格式化输出
- Eclipse注释中文格式没对齐
- WEB漏洞测试(二)——HTML注入 XSS攻击
热门文章
- python json方法详解_python详解json模块
- 7500 cpuz跑分 i5_核心硬盘 i5 7500性能测试_DIY攒机酷品测试-中关村在线
- tableau三轴合并_《Tableau数据可视化实战》——1.12节合并不同数据源-阿里云开发者社区...
- mysql 设置宽松模式_mysql5.6 sql_mode设置为宽松模式
- mockmvc get请求 tm的 一直404_大家快来看看404的兄弟姐妹
- mysql decimal型转化为float_5分钟搞懂MySQL数据类型之数值型DECIMAL类型
- [剑指offer]面试题45:圆圈中最后剩下的数字
- C++ class实现顺序队列(完整代码)
- Aeroplane chess HDU - 4405(期望dp)
- python对浏览器的常用操作_selenium+python基本操作(02)