社区讨论
神秘代码挂两个点求调
P12525[Aboi Round 1] 私は雨参与者 5已保存回复 10
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @mlha5rw6
- 此快照首次捕获于
- 2026/02/11 08:17 上周
- 此快照最后确认于
- 2026/02/12 18:55 7 天前
RT,根号分治限制为447会挂#12和#32,而调到200就能全过
CPP#include<bits/stdc++.h>
#define limits 447
#define int unsigned int
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;
int n,m,type,a[100005],b[505][100005],t,siz,l[4005],r[4005],p[100005],cnt[200005][505];
int sum[505][505][505],maxn;
vector<int>vec[505];
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<48||ch>57){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>=48&&ch<=57){
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return x*f;
}
struct ValBlock{
int t,siz,l[505],r[505],p[200005];
void init(){
siz=sqrt(200000);
t=200000/siz;
for(int i=1;i<=t;++i){
l[i]=(i-1)*siz+1;
r[i]=i*siz;
}
if(r[t]!=200000){
t++;
l[t]=r[t-1]+1;
r[t]=200000;
}
for(int i=1;i<=t;++i){
for(int j=l[i];j<=r[i];++j){
p[j]=i;
}
}
// cout<<"t: "<<t<<'\n';
// for(int i=1;i<=t;++i){
// cout<<"i: "<<i<<" l[i]: "<<l[i]<<" r[i]: "<<r[i]<<'\n';
// }
}
}blk;
int getleft(int id,int v,int k){
int l1=1,r1=n,mid,ans=0;
while(l1<=r1){
mid=(l1+r1)>>1;
if(a[b[v][mid]]%v<k||(a[b[v][mid]]%v==k&&b[v][mid]<id))l1=mid+1;
else{
ans=mid;
r1=mid-1;
}
}
if(a[b[v][ans]]%v==k)return ans;
return 0;
}
int getright(int id,int v,int k){
int l1=1,r1=n,mid,ans=0;;
while(l1<=r1){
mid=(l1+r1)>>1;
if(a[b[v][mid]]%v<k||(a[b[v][mid]]%v==k&&b[v][mid]<=id)){
ans=mid;
l1=mid+1;
}
else r1=mid-1;
}
if(a[b[v][ans]]%v==k)return ans;
return 0;
}
int query_min(int x,int y,int x1,int y1,int v,int k){
int ans=0;
if(p[y]-p[x]<=1){
for(int i=x;i<=y;++i){
if(x1<=a[i]&&a[i]<=y1&&a[i]%v==k){
ans++;
}
}
}
else{
for(int i=x;i<=r[p[x]];++i){
if(x1<=a[i]&&a[i]<=y1&&a[i]%v==k){
ans++;
}
}
for(int i=l[p[y]];i<=y;++i){
if(x1<=a[i]&&a[i]<=y1&&a[i]%v==k){
ans++;
}
}
if(blk.p[y1]-blk.p[x1]<=1){
for(int i=x1;i<=y1;++i){
if(i%v==k){
ans+=cnt[i][p[y]-1]-cnt[i][p[x]];
}
}
}
else{
for(int i=x1;i<=blk.r[blk.p[x1]];++i){
if(i%v==k){
ans+=cnt[i][p[y]-1]-cnt[i][p[x]];
}
}
for(int i=blk.l[blk.p[y1]];i<=y1;++i){
if(i%v==k){
ans+=cnt[i][p[y]-1]-cnt[i][p[x]];
}
}
int l1=getleft(l[p[x]+1],v,k),r1=getright(r[p[y]-1],v,k);
if(!l1)return ans;
if(p[l1]==p[r1]){
for(int i=l1;i<=r1;++i){
if(blk.l[blk.p[x1]+1]<=a[b[v][i]]&&a[b[v][i]]<=blk.r[blk.p[y1]-1]){
ans++;
}
}
}
else{
for(int i=l1;i<=r[p[l1]];++i){
if(blk.l[blk.p[x1]+1]<=a[b[v][i]]&&a[b[v][i]]<=blk.r[blk.p[y1]-1]){
ans++;
}
}
for(int i=l[p[r1]];i<=r1;++i){
if(blk.l[blk.p[x1]+1]<=a[b[v][i]]&&a[b[v][i]]<=blk.r[blk.p[y1]-1]){
ans++;
}
}
ans+=sum[v][p[r1]-1][blk.p[y1]-1]-sum[v][p[r1]-1][blk.p[x1]]-sum[v][p[l1]][blk.p[y1]-1]+sum[v][p[l1]][blk.p[x1]];
}
}
}
return ans;
}
int query_max(int x,int y,int x1,int y1,int v,int k){
// cout<<"x: "<<x<<" y: "<<y<<" x1: "<<x1<<" y1: "<<y1<<" v: "<<v<<" k: "<<k<<'\n';
int ans=0;
if(p[x]==p[y]){
for(int i=x;i<=y;++i){
if(x1<=a[i]&&a[i]<=y1&&a[i]%v==k){
ans++;
}
}
}
else{
for(int i=x;i<=r[p[x]];++i){
if(x1<=a[i]&&a[i]<=y1&&a[i]%v==k){
ans++;
}
}
for(int i=l[p[y]];i<=y;++i){
if(x1<=a[i]&&a[i]<=y1&&a[i]%v==k){
ans++;
}
}
for(int i=k;i<=maxn;i+=v)if(x1<=i&&i<=y1)ans+=cnt[i][p[y]-1]-cnt[i][p[x]];
}
return ans;
}
signed main(){
// freopen("P12525.in","r",stdin);
// freopen("P12525.out","w",stdout);
n=read(),type=read();
for(int i=1;i<=n;++i){
a[i]=read();
maxn=max(maxn,a[i]);
}
m=read();
siz=sqrt(n);
t=n/siz;
for(int i=1;i<=t;++i){
l[i]=(i-1)*siz+1;
r[i]=i*siz;
}
if(r[t]!=n){
t++;
l[t]=r[t-1]+1;
r[t]=n;
}
for(int i=1;i<=t;++i){
for(int j=l[i];j<=r[i];++j){
p[j]=i;
}
}
for(int i=1;i<=n;++i){
for(int j=p[i];j<=t;++j){
cnt[a[i]][j]++;
}
}
// for(int i=1;i<=maxn;++i){
// for(int j=1;j<=t;++j){
// cout<<cnt[i][j]<<" ";
// }
// cout<<'\n';
// }
blk.init();
for(int i=1;i<=limits;++i){
for(int j=1;j<=n;++j)vec[a[j]%i].push_back(j);
int num=0;
for(int j=0;j<i;++j){
for(int k=0;k<vec[j].size();++k)b[i][++num]=vec[j][k];
vec[j].clear();
}
for(int j=1;j<=n;++j){
sum[i][p[j]][blk.p[a[b[i][j]]]]++;
// cout<<"a[b[i][j]]: "<<a[b[i][j]]<<" blk.p[a[b[i][j]]]: "<<blk.p[a[b[i][j]]]<<'\n';
}
for(int j=1;j<=t;++j){
for(int k=1;k<=blk.t;++k){
sum[i][j][k]+=sum[i][j-1][k];
}
}
for(int j=1;j<=t;++j){
for(int k=1;k<=blk.t;++k){
sum[i][j][k]+=sum[i][j][k-1];
}
}
}
// for(int i=1;i<=limits;++i){
// for(int j=1;j<=t;++j){
// for(int k=1;k<=blk.t;++k){
// cout<<sum[i][j][k]<<" ";
// }
// cout<<'\n';
// }
// cout<<'\n';
// }
// for(int i=1;i<=limits;++i){
// for(int j=1;j<=n;++j){
// cout<<b[i][j]<<" ";
// }
// cout<<'\n';
// }
int ans=0;
while(m--){
int x=read(),y=read(),x1=read(),y1=read(),v=read(),k=read();
x^=ans*type,y^=ans*type,x1^=ans*type,y1^=ans*type,v^=ans*type,k^=ans*type;
if(v<=limits){
ans=query_min(x,y,x1,y1,v,k);
cout<<ans<<'\n';
}
else{
ans=query_max(x,y,x1,y1,v,k);
cout<<ans<<'\n';
}
}
return 0;
}
回复
共 10 条回复,欢迎继续交流。
正在加载回复...