【BZOJ2506】calc

Description

         给一个长度为n的非负整数序列A1,A2,…,An。现有m个询问,每次询问给出l,r,p,k,问满足l<=i<=r且Ai mod p = k的值i的个数。

Input

         第一行两个正整数n和m。
         第二行n个数,表示A1,A2,…,An。
         以下m行,每行四个数分别表示l,r,p,k。满足1<=l<=r<=n。

Output

         对于每个询问,输出一行,表示可行值i的个数。

Sample Input

5 2
1 5 2 3 7
1 3 2 1
2 5 3 0

Sample Output

2
1

HINT

数据范围:
         0<n,m<=10^5,任意1<=i<=n满足Ai<=10^4,0<p<=10^4,0<=k<p。

题解:发现Ai很小,考虑分段处理询问。对于p<100的,直接用vector维护所有%p=k的位置,然后查询时在vector上二分即可。

对于p>100的呢?考虑莫队,用桶维护区间中所有数出现的次数,然后暴力查询,时间复杂度还是nsqrt(n)的。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
const int maxn=100010;
int n,m,tot,mx,B;
vector<int> s[110][110];
struct node
{
int l,r,a,b,org;
}q[maxn];
int ans[maxn],v[maxn],st[maxn];
bool cmp(const node &a,const node &b)
{
return (a.l/B==b.l/B)?(a.r<b.r):(a.l/B<b.l/B);
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
n=rd(),m=rd(),B=int(sqrt(double(n)));
int i,j,l,r,a,b;
for(i=1;i<=n;i++)
{
v[i]=rd(),mx=max(mx,v[i]);
for(j=1;j<=100;j++) s[j][v[i]%j].push_back(i);
}
for(i=1;i<=m;i++)
{
l=rd(),r=rd(),a=rd(),b=rd();
if(a<=100)
{
ans[i]=upper_bound(s[a][b].begin(),s[a][b].end(),r)-lower_bound(s[a][b].begin(),s[a][b].end(),l);
}
else q[++tot].l=l,q[tot].r=r,q[tot].a=a,q[tot].b=b,q[tot].org=i;
}
sort(q+1,q+tot+1,cmp);
for(l=q[1].l,r=l-1,i=1;i<=tot;i++)
{
while(l>q[i].l) st[v[--l]]++;
while(l<q[i].l) st[v[l++]]--;
while(r<q[i].r) st[v[++r]]++;
while(r>q[i].r) st[v[r--]]--;
for(j=q[i].b;j<=mx;j+=q[i].a) ans[q[i].org]+=st[j];
}
for(i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}//5 2 1 5 2 3 7 1 3 2 1 2 5 3 0

【BZOJ2506】calc 分段+vector+莫队的更多相关文章

  1. 【bzoj2506】calc 根号分治+STL-vector+二分+莫队算法

    题目描述 给一个长度为n的非负整数序列A1,A2,…,An.现有m个询问,每次询问给出l,r,p,k,问满足l<=i<=r且Ai mod p = k的值i的个数. 输入 第一行两个正整数n ...

  2. BZOJ #2506. calc [根号分治,莫队,二分]

    \(p\) 是个正常范围, \(\sqrt p <= 100\) 比较小,预处理出来 \(a_i % p == k\) 的位置,然后丢进去,最后询问的 \(p\) 如果大于 \(100\) 就莫 ...

  3. 【Luogu4137】Rmq Problem/mex (莫队)

    [Luogu4137]Rmq Problem/mex (莫队) 题面 洛谷 题解 裸的莫队 暴力跳\(ans\)就能\(AC\) 考虑复杂度有保证的做法 每次计算的时候把数字按照大小也分块 每次就枚举 ...

  4. 【莫队算法】【权值分块】bzoj3920 Yuuna的礼物

    [算法一] 暴力. 可以通过第0.1号测试点. 预计得分:20分. [算法二] 经典问题:区间众数,数据范围也不是很大,因此我们可以: ①分块,离散化,预处理出: <1>前i块中x出现的次 ...

  5. bzoj 3757 树上莫队

    感谢以下文章作者: http://blog.csdn.net/kuribohg/article/details/41458639 http://vfleaking.blog.163.com/blog/ ...

  6. 2038: [2009国家集训队]小Z的袜子(hose) (莫队算法)

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 专题练习: http://acm.hust.edu.cn/vjudge/conte ...

  7. HihoCoder 1629 Graph (2017 ACM-ICPC 北京区域赛 C题,回滚莫队 + 启发式合并 + 可撤销并查集)

    题目链接  2017 ACM-ICPC Beijing Regional Contest Problem C 题意  给定一个$n$个点$m$条边的无向图.现在有$q$个询问,每次询问格式为$[l, ...

  8. 洛谷P5398 [Ynoi2018]GOSICK(二次离线莫队)

    题面 传送门 题解 维包一生推 首先请确保您会二次离线莫队 那么我们现在的问题就是怎么转移了,对于\(i\)和前缀\([1,r]\)的贡献,我们拆成\(b_i\)和\(c_i\)两部分,其中\(b_i ...

  9. AT1219 歴史の研究[回滚莫队学习笔记]

    回滚莫队例题. 这题的意思大概是 设 \(cnt_i\) 为 l ~ r 这个区间 \(i\) 出现的次数 求\(m\) 次询问 求 l~r 的 max {\(a_i\) * \(cnt_i\)} \ ...

随机推荐

  1. 使用Python发送电子邮件

    使用python发送邮件并不难,这里使用的是SMTP协议. Python标准库中内置了smtplib,使用它发送邮件只需提供邮件内容与发送者的凭证即可. 代码如下: # coding:utf-8 im ...

  2. 在LoadRunner中设置HTTP请求time-out的时间

    Error -27728: Step download timeout (120 seconds) has expired when downloading non-resource(s) [MsgI ...

  3. NullPointerException异常的原因及java异常??

    所谓空指针异常,是因为用空(null)去调用属性或方法.   null表示没有这个对象,既然没有这个对象,那么去调用他的属性和方法,就会报异常.   <--主要有以下几种原因:   1.使用了未 ...

  4. Linux 后台开发常用命令

    1.automake编译 autoreconf -isv ./configure make 2.远程获取代码 rsync -aPvr --exclude=*/log/* *.*.*.*::home/s ...

  5. js canvas画柱状图 没什么高端的 就是一篇偶尔思路的

    公司项目要用js画柱状图,本来想用个插件吧 chart.js 忽然一想 我们也用不了那么大的插件.自己写个吧,也能看看自己那点数学水平能够不! 有几个小亮点吧 1.函数x 和 函数y 对坐标进行了转化 ...

  6. JAVASCRIPT 格式化日期

    // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占 ...

  7. .NET下的ORM框架有哪些

    现在市面上针对.NET ORM框架越来越多 微软自家的LINQ to SQL, ADO.NET Entity Framework不多说. 商业: 1.LightSpeed(免费版比较垃圾.表限制8个. ...

  8. Angularjs学习笔记5_form1

    1.入门 <form ng-controller="validationController" name="form1" novalidate>   ...

  9. codeblocks中右键源文件没有Rename选项?

    那是因为你右击的那个文件已经被CB的编辑器打开,关闭即可,你就能看到Rename选项了. 或者更简单,翻到Files那一栏,然后右击某个文件夹选择"Make root"即可,就跟w ...

  10. Linux虚拟机Centos 设置固定的静态IP

    经过两天的研究(研究到深夜1点),百度了很多文章与加了几个linux的群,终于得到一种方式是可以正常设置静态IP且正常的ssh连接的方式. 第一种方式:NAT模式 参考文章 -- 虚拟机中的CentO ...