洛谷 P3948 数据结构
题目传送门
这道题目用到了差分和打表,下面是ac代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
#include<algorithm>
long long a[100100],b[100100];
long long n,opt,mod,minn,maxx,L,r,x,final,value;
char c;
long long inquire(long long L,long long r)
{
long long sum=0,value=0;
for(long long i=1;i<=r;i++)
{
if(i==L){
for(i=L;i<=r;i++)
{
value+=a[i];
if(minn<=value*i%mod&&value*i%mod<=maxx )
sum++;
}
}
value+=a[i];
}
return sum;
}
int main()
{
cin>>n>>opt>>mod>>minn>>maxx;
while(opt--){
cin>>c;
if(c=='A'){
cin>>L>>r>>x;
a[L]+=x; //差分
if(r!=n)a[r+1]-=x;
}
else if(c=='Q'){
cin>>L>>r;
cout<<inquire(L,r)<<endl;
}
}
cin>>final;
value=0;
for(long long i=1;i<=n;i++) //打表
{
value+=a[i];
if(minn <=(value*i)%mod && (value*i)%mod <=maxx)
b[i]=b[i-1]+1;
else b[i]=b[i-1];
}
while(final--){
cin>>L>>r;
cout<<b[r]-b[L-1]<<endl;
}
return 0;
}