BZOJ2506: calc
2016-06-15 19:38
323 查看
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 21 5 2 3 7
1 3 2 1
2 5 3 0
Sample Output
21
HINT
数据范围:0<n,m<=10^5,任意1<=i<=n满足Ai<=10^4,0<p<=10^4,0<=k<p。
Source
2011福建集训容斥一下将询问转化成前缀和查询,然后离线添加,分块处理出来p<=sqrt(Ai)的答案,p>sqrt(Ai)的询问暴力即可。
时间复杂度O((N+M)sqrt(c))。
#include<cstdio> #include<cctype> #include<queue> #include<cstring> #include<cassert> #include<algorithm> #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) #define ren for(int i=first[x];i;i=next[i]) using namespace std; const int BufferSize=1<<16; char buffer[BufferSize],*head,*tail; inline char Getchar() { if(head==tail) { int l=fread(buffer,1,BufferSize,stdin); tail=(head=buffer)+l; } return *head++; } inline int read() { int x=0,f=1;char c=Getchar(); for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1; for(;isdigit(c);c=Getchar()) x=x*10+c-'0'; return x*f; } #define S 1200000 char pf[S],*o1=pf,*o2=pf+S; #define ot(x) (o1==o2?fwrite(pf,1,S,stdout),*(o1=pf)++=x:*o1++=x) inline void print(int x){static char s[10],*b;b=s;if(!x)*b++=48;for(;x;*b++=x%10+48,x/=10);for(;b--!=s;ot(*b));} const int maxn=100010; const int maxm=10010; const int SIZE=50; int n,m,A[maxn],ans[maxn]; struct Query { int x,p,k,id; bool operator < (const Query& ths) const {return x<ths.x;} }Q[maxn<<1]; int cnt[maxm],B[55][55]; void Add(int v) { cnt[v]++; rep(i,1,SIZE) B[i][v%i]++; } int calc(int p,int k) { int ans=0; while(k<=10000) { ans+=cnt[k]; k+=p; } return ans; } int main() { n=read();m=read(); rep(i,1,n) A[i]=read(); rep(i,1,m) { int l=read(),r=read(),p=read(),k=read(); Q[i]=(Query){l-1,p,k,-i};Q[i+m]=(Query){r,p,k,i}; } sort(Q+1,Q+2*m+1);int cur=0; rep(i,1,2*m) { while(cur<Q[i].x) Add(A[++cur]); int res=Q[i].p<=SIZE?B[Q[i].p][Q[i].k]:calc(Q[i].p,Q[i].k);if(Q[i].id<0) res=-res,Q[i].id=-Q[i].id; ans[Q[i].id]+=res; } rep(i,1,m) print(ans[i]),ot('\n'); fwrite(pf,1,o1-pf,stdout); return 0; }
相关文章推荐
- Python基础知识学习
- TeX下的Markdown包
- 【Android】各种小知识点,不间断更新
- Java性能优化权威指南-读书笔记(三)-JVM性能调优-内存占用
- Jenkins执行gradle任务提示Can't load log handler "4host-manager.org.apache.juli.FileHandler"
- 飛飛(七十)阅读程序 好玩好玩
- GDB调试方法汇总
- [Java] 作业8(继承、多态)
- JAVA正则表达式判断IP地址
- 在Activity和Service之间使用Binder和回调接口进行通信
- POJ 3276-Face The Right Way(牛面向前方-开关问题)
- 数组类运算的实现
- 232. Implement Queue using Stacks 还不理解法一
- 硬盘容量不能全部识别问题
- jdk自带监控工具整理-jstat
- 从招聘信息看到的学习方向
- CUDA并行算法系列之规约
- 多线程更新UI的常用方法
- 关于USB的8个问题
- APACHE默认模块功能说明