【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

最新文章

  1. react-native学习笔记--首次安装apk到小米5报错
  2. 【记录】SqlBulkCopy 跨数据库,表自定义导入
  3. 网络基础知识之 Ping
  4. 利用开源软件strongSwan实现支持IKEv2的企业级IPsec VPN,并结合FreeRadius实现AAA协议(下篇)
  5. Scrum Meeting---Seven(2015-11-2)
  6. Ubuntu下Eclipse中文乱码问题解决(转)
  7. pythomn
  8. C#创建Windows服务入门图解(VS2010)
  9. C# Java间进行RSA加密解密交互(二)
  10. python 中 time 模块 格式化 format
  11. 二、Linux文件系统之内存管理
  12. mipi 调试经验(转)
  13. &amp; and &amp;&amp;区别
  14. spring-线程池(1)
  15. 360提供的php防注入代码
  16. calling c++ from golang with swig--windows dll (三)
  17. [HNOI2003]激光炸弹
  18. TCP发送源码学习(1)--tcp_sendmsg
  19. 在普通js文件里引入vue实例的方法
  20. (转载)Unity3D所要知道的基础知识体系大纲,可以对照着学习,不定期更新

热门文章

  1. Unity3D 图形问题之怎样使用水?
  2. JSON 对象
  3. ArcGIS Engine读取GDB中的Shape
  4. mui 跨域请求
  5. Notepad++输入模式之改动模式、插入模式
  6. Spring AOP 面向切面编程相关注解
  7. LA 5009 (HDU 3714) Error Curves (三分)
  8. 一道超级坑爹的水题(ACdream oj 无耻的出题人)
  9. SpringCloud系列十三:Feign对继承、压缩、日志的支持以及构造多参数请求
  10. Centos7使用LVM扩容磁盘(测试成功)