题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5177

  在网上看到的题解基本都是用主席树,也就是带点骚操作的暴力直接艹过去的。这里分享一个比较清真的分块做法。

  因为$ p , a_i $的值域较小,因此我们可以考虑把序列分成$ size $块,预处理出每个块内的数模每个$ p $的最大值,那么查询时只需查询区间中的整块答案,然后再统计零散的元素的贡献。预处理时,我们可以考虑对当前块维护一个数组$ last[i] $表示在当前块内出现过的小于等于$ i $的最大的数,在计算模$ p $的答案时,因为$ f(x)=x \mod p $是一个分段的单调函数,在$ [kp,(k+1)p-1] (k \in \mathbb{Z})$上单调递增,因此我们只需对每个区间$ [kp,(k+1)p-1] $求出区间内的最大值,也就是$ last[(k+1)p-1] $,作为模$ p $值最大的数。因此,每个块的预处理复杂度为$ O(1000 \ln 1000) $。

  总时间复杂度为$ O(n+1000 \ln 1000size+m(size+\frac{n}{size})) $,当取$ size=\sqrt{n} $时时间复杂度为$ 1000 \ln 1000 \sqrt{n}+m\sqrt{n}) \approx 5.7 \times 10^7 $,比那些$ O(1000 m \log n) $的做法清真到不知道哪里去了。

  代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<set>
#define ll long long
#define mod 1000000007
#define Mod1(x) (x>=mod?x-mod:x)
#define Mod2(x) (x<0?x+mod:x)
#define maxn 1000010
inline ll read()
{
ll x=; char c=getchar(),f=;
for(;c<''||''<c;c=getchar())if(c=='-')f=-;
for(;''<=c&&c<='';c=getchar())x=x*+c-'';
return x*f;
}
inline void write(ll x)
{
static int buf[],len; len=;
if(x<)x=-x,putchar('-');
for(;x;x/=)buf[len++]=x%;
if(!len)putchar('');
else while(len)putchar(buf[--len]+'');
}
inline void writeln(ll x){write(x); putchar('\n');}
inline void writesp(ll x){write(x); putchar(' ');}
int mx[][],last[];
int a[maxn];
int n,m,size;
int main()
{
// freopen("bzoj5177.in","r",stdin);
// freopen("bzoj5177.out","w",stdout);
n=read(); m=read();
for(int i=;i<n;i++)
a[i]=read();
size=sqrt(n);
// writeln(size);
for(int k=;k*size<n;k++){
memset(last,,sizeof(last));
for(int i=k*size;i<(k+)*size&&i<n;i++)
last[a[i]]=a[i];
for(int i=;i<=;i++)
if(!last[i])last[i]=last[i-];
for(int i=;i<=;i++){
for(int j=i;j<=;j+=i)
mx[k][i]=std::max(mx[k][i],last[j-]-(j-i));
mx[k][i]=std::max(mx[k][i],last[]%i);
}
}
while(m--){
int l=read(),r=read(),p=read();
if(l>r){
int tmp=l; l=r; r=tmp;
}
int idl=l/size,idr=r/size;
if(idl==idr){
int ans=;
for(int i=l;i<=r;i++)
ans=std::max(ans,a[i]%p);
writeln(ans);
}
else{
int ans=;
for(int i=idl+;i<idr;i++)
ans=std::max(ans,mx[i][p]);
for(int i=l;i<(idl+)*size;i++)
ans=std::max(ans,a[i]%p);
for(int i=idr*size;i<=r;i++)
ans=std::max(ans,a[i]%p);
writeln(ans);
}
}
// fclose(stdin); fclose(stdout);
return ;
}

bzoj5177

【bzoj5177】[Jsoi2013]贪心的导游(分块)的更多相关文章

  1. [Bzoj5177][Jsoi2013]贪心的导游(主席树)

    5177: [Jsoi2013]贪心的导游 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 32  Solved: 15[Submit][Status] ...

  2. BZOJ5177 : [Jsoi2013]贪心的导游

    首先预处理出对于每个模数,所有被模数按结果从大到小排序的结果,那么对于一个询问,如果可以在$O(1)$时间内判断某个数字是否出现,则可以$O(1000)$回答. 考虑对序列进行分治,对于区间$[l,r ...

  3. 「JSOI2013」贪心的导游

    「JSOI2013」贪心的导游 传送门 多次询问区间内%一个数的最大值 我们不妨设这个数为M_sea 值域比较小所以考虑分块维护. 我们观察到对于给定的一个 \(p\) ,函数 \(y = x \% ...

  4. L3-2 森森快递 (30 分)(贪心+线段树/分块)

    题目链接:https://pintia.cn/problem-sets/1108203702759940096/problems/1108204121661857798 题目大意: 森森开了一家快递公 ...

  5. 2018.09.17 atcoder Tak and Hotels(贪心+分块)

    传送门 一道有意思的题. 一开始想错了,以为一直lowerlowerlower_boundboundbound就可以解决询问,结果交上去TLE了之后才发现时间复杂度是错的. 但是贪心思想一定是对的,每 ...

  6. CF573E Bear and Bowling 贪心、分块、凸包

    传送门 题解搬运工++ 先证明一个贪心做法的正确性:做以下操作若干次,每一次考虑选择没有被选到答案序列中的数加入到答案序列中对答案的贡献,设第\(i\)个位置的贡献为\(V_i\),如果最大的贡献小于 ...

  7. 【贪心】【二维偏序】【权值分块】bzoj1691 [Usaco2007 Dec]挑剔的美食家

    既然题目中的要求满足二维偏序,那么我们很自然地想到将所有东西(草和牛)都读进来之后,对一维(美味度)排序,然后在另一维(价值)中取当前最小的. 于是,Splay.mutiset.权值分块什么的都支持查 ...

  8. bzoj 4464: [Jsoi2013]旅行时的困惑【贪心】

    据说正解是有上下界最小流,但是这种1e5的玩意问什么要跑网络流啊-- 贪心即可,注意一点是可以有多条路径经过一条边-- 以1为根,设d[u][0/1]为u到父亲的边是向下/向上,g记录这个点儿子中不能 ...

  9. BZOJ1086: [SCOI2005]王室联邦(贪心,分块?)

    Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 2610  Solved: 1584[Submit][Status] ...

随机推荐

  1. wcur LOCATE +

    w字符串处理 DROP PROCEDURE IF EXISTS w_unique; DELIMITER /w/ CREATE PROCEDURE w_unique() BEGIN DECLARE do ...

  2. Tilera--100核cpu

    市场对多核的需求越来越多,主要是因为单核处理能力不可能像以往那样不断地提升.从上世纪90 年代开始,整个产业遵循摩尔定律,即芯片上可容纳的晶体管数目每隔18个月便会增加一倍,性能也提升一倍.随着时间的 ...

  3. Python中的推导式(列表推导式、字典推导式、集合推导式)

    推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 共有三种推导,在Python2和3中都有支持: 列表(lis ...

  4. 前端开发 - jsDom

    一.jsDom简介 jsDom = javascript document object model在JS中,所有的事物都是节点,元素.文本等都是节点.应用场景:可以通过节点进行DOM对象的增删改查 ...

  5. 剪花布条---hdu2087(kmp模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 kmp模板题: #include <cstdio> #include <cst ...

  6. bug-sqlite3

    [root@izj6c6b4i40od17ev77lhez Python-3.7.0]# python Python 3.7.0 (default, Sep 5 2018, 00:40:27) [GC ...

  7. 教你编译PHP7 (nginx+mysql+php7)

    # 安装编译工具: yum install gcc automake autoconf libtool gcc-c++ # 安装基础库 yum install gd zlib zlib-devel o ...

  8. kettle添加hadoop cluster时报错Caused by: java.lang.IllegalArgumentException: Does not contain a valid host:port authority: hadoop:password@node56:9000

    完整报错是: Caused by: java.lang.IllegalArgumentException: Does not contain a valid host:port authority: ...

  9. CTreeView 的教程

    整个网上搜了一圈没有好的CTreeView 的教程,所以自己谢谢看. CTreeView 是什么? C打头的东西当然是一个类了. 有类就有继承,他的继承关系如下. 有个东西和他比较像 叫CTreeCt ...

  10. Java内存解析 程序的执行过程

    Java内存解析 栈.堆.常量池等虽同属Java内存分配时操作的区域,但其适用范围和功用却大不相同.本文将深入Java核心,简单讲解Java内存分配方面的知识. 首先我们先来讲解一下内存中的各个区域. ...