这道题我用差分来做,对于每一个修改直接修改差分数组,对于每一个查询直接暴力把差分数组遍历一遍。最后的Final次询问使用了一个前缀和来记录答案的个数(思路很正确),但一直过不去(只有10分)
求大佬指正
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll n,m,minx,maxn,ans,mod,ff;
char k;
ll cha[1001000],pre[1001000],num[1001000];
inline bool judge(ll k,int id)
{
ll qaq=k*id%mod;
return ((qaq>=minx)&&(qaq<=maxn));
}
int main()
{
scanf("%lld %lld %lld %lld %lld",&n,&m,&mod,&minx,&maxn);
for(int i=1;i<=m;++i)
{
ll x,y,z;
scanf("\n%c",&k);
if(k=='A')
{
scanf("%lld%lld%lld",&x,&y,&z);
cha[x]+=z;
cha[y+1]-=z;
}
if(k=='Q')
{
scanf("%lld%lld",&x,&y);
ll ans=0,cur=0;
for(register int j=1;j<=y;++j)
{
cur+=cha[i];
if(judge(cur,j)&&j>=x)++ans;
}
printf("%lld\n",ans);
}
}
ll cur=0;
for(int i=1;i<=n;++i)
{
cur+=cha[i];
pre[i]+=pre[i-1];
if(judge(cur,i))++pre[i];
}
scanf("%lld",&ff);
for(int i=1;i<=ff;++i)
{
ll a,b;
scanf("%lld%lld",&a,&b);
printf("%lld\n",pre[b]-pre[a-1]);
}
return 0;
}