BZOJ2506 calc

来源:互联网 发布:九龙朝精灵升级数据 编辑:程序博客网 时间:2024/05/16 16:15

首先我们发现这个区间特别的蛋疼……所以我们离线,把询问拆成两个,然后从前往后扫整个序列

对于p<=100的,拿个数组记录所有模p得k的,到时候直接出解,对于p>100的,开个数组记录值为多少的都有多少个,然后暴力

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<ctime>#include<cmath>#include<algorithm>#include<iomanip>#include<vector>#include<map>#include<set>#include<bitset>#include<queue>#include<stack>using namespace std;#define MAXN 200010#define MAXM 110#define INF 1000000000#define MOD 1000000007#define eps 1e-8#define ll long longstruct que{int x;int p;int k;int bel;int f;que(){}que(int _x,int _p,int _k,int _bel,int _f){x=_x;p=_p;k=_k;bel=_bel;f=_f;}friend bool operator <(que x,que y){return x.x<y.x;}};int n,m;int a[MAXN];que q[MAXN];int s[MAXM][MAXM];int c[MAXN];int ans[MAXN];int main(){freopen("data.txt","r",stdin);freopen("dui.txt","w",stdout);int i,j;scanf("%d%d",&n,&m);for(i=1;i<=n;i++){scanf("%d",&a[i]);}for(i=1;i<=m;i++){scanf("%d%d%d%d",&q[i*2-1].x,&q[i*2].x,&q[i*2-1].p,&q[i*2-1].k);q[i*2].p=q[i*2-1].p;q[i*2].k=q[i*2-1].k;q[i*2].bel=q[i*2-1].bel=i;q[i*2-1].x--;q[i*2-1].f=-1;q[i*2].f=1;}sort(q+1,q+2*m+1);int wzh=1;while(q[wzh].x==0){wzh++;}for(i=1;i<=n;i++){for(j=1;j<=100;j++){s[j][a[i]%j]++;}c[a[i]]++;while(q[wzh].x==i){if(q[wzh].p<=100){ans[q[wzh].bel]+=q[wzh].f*s[q[wzh].p][q[wzh].k];}else{for(j=q[wzh].k;j<=10000;j+=q[wzh].p){ans[q[wzh].bel]+=q[wzh].f*c[j];}}wzh++;}}for(i=1;i<=m;i++){printf("%d\n",ans[i]);}return 0;}/*5 21 5 2 3 71 3 2 12 5 3 0*/

0 0
原创粉丝点击