萌新刚学分块,全wa求条
查看原帖
萌新刚学分块,全wa求条
533162
wanxinlian楼主2024/11/29 20:14

RT,和题解拍不出来

#include<bits/stdc++.h>
using namespace std;

const int N=5e5+5,M=1e5+5,Q=1e3+5;

int n,q,a[M],sum2[M];
struct ask{int l,r,x,y,ans,id,m;}op[N];
vector<ask> query1[N];
vector<ask> query2[N];
int sum[Q][Q];
int big_sum[Q][Q];

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);cout.tie(nullptr);
	cin>>n>>q;
	int maxq=0;
	for(int i=1;i<=n;++i) cin>>a[i],maxq=max(maxq,a[i]);
	int len=330,kuai=(Q-5+len-1)/len;
	for(int i=1;i<=q;++i) {
		op[i].id=i;
		cin>>op[i].l>>op[i].r>>op[i].x>>op[i].y>>op[i].m;
		if(op[i].x%op[i].m==op[i].y%op[i].m) {op[i].ans=0;}
		else if(op[i].m<=len) {
			query1[op[i].l-1].push_back(op[i]);
			query1[op[i].r].push_back(op[i]);
		}else {
			//cout<<query2[op[i].l-1].size()<<'\n';
			query2[op[i].l-1].push_back(op[i]);
			query2[op[i].r].push_back(op[i]);
		}
	}
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=len;j++) sum[j][a[i]%j]++;
		for(int j=0;j<query1[i].size();j++) {
			ask x=query1[i][j];
			if(i==op[x.id].l-1) {
				if(x.x%x.m<x.y%x.m) {
					int suml=0,sumr=0;
					for(int k=0;k<=x.m-x.y%x.m-1;k++) suml+=sum[x.m][k];
					for(int k=0;k<=x.m-x.x%x.m-1;k++) sumr+=sum[x.m][k];
					op[x.id].ans-=(x.l-1)+suml-sumr;
				}else {
					int suml=0,sumr=0;
					for(int k=0;k<=x.m-x.y%x.m-1;k++) suml+=sum[x.m][k];
					for(int k=0;k<=x.m-x.x%x.m-1;k++) sumr+=sum[x.m][k];
					op[x.id].ans-=suml-sumr;
				}
			//	cout<<op[x.id].ans<<'\n';
			}else {
				if(x.x%x.m<x.y%x.m) {
					int suml=0,sumr=0;
					for(int k=0;k<=x.m-x.y%x.m-1;k++) suml+=sum[x.m][k];
					for(int k=0;k<=x.m-x.x%x.m-1;k++) sumr+=sum[x.m][k];
					op[x.id].ans+=(x.r)+suml-sumr;
				}else {
					int suml=0,sumr=0;
					for(int k=0;k<=x.m-x.y%x.m-1;k++) suml+=sum[x.m][k];
					for(int k=0;k<=x.m-x.x%x.m-1;k++) sumr+=sum[x.m][k];
					op[x.id].ans+=suml-sumr;
				}
			//	cout<<op[x.id].ans<<'\n';
			}
		}
	}
	for(int i=1;i<=n;i++) {
		int val=a[i],belong=(a[i]+len-1)/len;
		for(int k=a[i];k<=kuai*len;k++) sum2[k]++;
		for(int k=belong;k<=kuai+1;k++) big_sum[k][len]++;
		for(int k=(a[i]-1)%len;k<len;k++) big_sum[belong][k]++;
		for(int j=0;j<query2[i].size();j++) {
			ask x=query2[i][j];
			//cout<<x.id<<'\n'; 
			if(i==op[x.id].l-1) {
				for(int l=0;l<=kuai*len;l+=x.m) {
					int k=x.m-x.x%x.m-1+l;
					int belong_k=(k+len-1)/len;
					int suml=big_sum[belong_k-1][len]+big_sum[belong_k][(k-1)%len];
					if(k>maxq) {suml=big_sum[kuai][len];}
					op[x.id].ans+=suml;
				}
				for(int l=0;l<=kuai*len;l+=x.m) {
					int k=x.m-x.y%x.m-1+l;
					int belong_k=(k+len-1)/len;
					int sumr=big_sum[belong_k-1][len]+big_sum[belong_k][(k-1)%len];
					if(k>maxq) {sumr=big_sum[kuai][len];}
					op[x.id].ans-=sumr;
				}
				if(x.x%x.m<x.y%x.m) op[x.id].ans-=x.l-1;
			}else {
				for(int l=0;l<=kuai*len;l+=x.m) {
					int k=x.m-x.x%x.m-1+l;
					int belong_k=(k+len-1)/len;
					int suml=big_sum[belong_k-1][len]+big_sum[belong_k][(k-1)%len];
					if(k>maxq) {suml=big_sum[kuai][len];}
					op[x.id].ans-=suml;
				}
				for(int l=0;l<=kuai*len;l+=x.m) {
					int k=x.m-x.y%x.m-1+l;
					int belong_k=(k+len-1)/len;
					int sumr=big_sum[belong_k-1][len]+big_sum[belong_k][(k-1)%len];
					if(k>maxq) {sumr=big_sum[kuai][len];}
					op[x.id].ans+=sumr;
				}
				if(x.x%x.m<x.y%x.m) op[x.id].ans+=i;
			}
		}
	}
	
	for(int i=1;i<=q;i++) {
	//	cout<<op[i].l<<' '<<op[i].r<<' '<<op[i].m<<'\n';
		if(op[i].x%op[i].m==op[i].y%op[i].m) op[i].ans*=0;
		cout<<op[i].ans<<'\n';
	}
	return 0;
}
2024/11/29 20:14
加载中...