【CQOI2008】位统计
题意十分明了,
发现修改和询问是对于整个序列进行的处理,且询问只有
所以考虑对每个
时间复杂度
其实还有另外一个更好想到,更暴力的思路,将前
时间复杂度
这里给出第二种代码实现
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int read()
{
char c;
int w=1;
while((c=getchar())>'9'||c<'0')if(c=='-')w=-1;
int ans=c-'0';
while((c=getchar())>='0'&&c<='9')ans=(ans<<1)+(ans<<3)+c-'0';
return ans*w;
}
int n,m,t[65537],s[257],dlt=0;
int get(int l,int r)
{
if(l<0)l+=65536*20;
if(r<0)r+=65536*20;
l%=65536,r%=65536;
if(l<=r)return t[r]-((l!=0)?t[l-1]:0);
return get(0,r)+get(l,65535);
}
signed main(){
n=read(),m=read();
for(int i=1;i<=n;i++)
{
int o=read();
t[o]++;s[o%256]++;
}
for(int i=1;i<65536;i++)t[i]+=t[i-1];
while(m--)
{
char c;
while((c=getchar())!='C'&&c!='Q');
if(c=='C')dlt+=read(),dlt%=65536;
else
{
int a=read(),ans=0;
if(a<=7)
{
for(int i=0;i<256;i++)
if(i>>a&1)ans+=s[(i-dlt+256*1000)%256];
}
else
{
for(int i=0;i<256;i++)
if(i>>(a-8)&1)ans+=get(i*256-dlt,(i+1)*256-1-dlt);
}
cout<<ans<<'\n';
}
}
return 0;
}