WA求助
查看原帖
WA求助
200044
JS_TZ_ZHR楼主2020/8/21 18:36

RT

#include<bits/stdc++.h>
#define int long long
#define begin gsdgfdsa
#define end fgdsgfsakjl
using namespace std;
int n,m,block,begin[1000005],end[1000005];
long long lazy[1000005],a[1000005];
struct node {
	int p;
	long long num;
	bool operator<(const node &a)const {
		return a.num>num;
	}
} s[1000005],t1[1000005],t2[1000005];
void build() {
	block=sqrt(n);
	int num=1;
	for(int i=1; i<=n; i+=block) {
		begin[num]=i,end[num]=min(n,i+block-1);
		sort(s+i,s+end[num]+1);
		num++;
	}
	return;
}
inline int query(int k) {
	int num=n/block+(n%block!=0),ans1=1,ans2=0;
	node nk;
	nk.num=k;
	for(int i=1; i<=num; i++) {
		nk.num-=lazy[i];
		int p=lower_bound(s+begin[i],s+end[i]+1,nk)-s;
		if(s[p].num+lazy[i]==k&&p>=begin[i]&&p<=end[i]) {
			for(int j=begin[i]; j<=end[i]; j++) {
				if(a[j]+lazy[i]==k) {
					ans1=j;
					break;
				}
			}
			break;
		}
		nk.num+=lazy[i];
	}
	for(int i=num; i>=1; i--) {
		nk.num-=lazy[i];
		int p=lower_bound(s+begin[i],s+end[i]+1,nk)-s;
		if(s[p].num+lazy[i]==k&&p>=begin[i]&&p<=end[i]) {
			for(int j=end[i]; j>=begin[i]; j--) {
				if(a[j]+lazy[i]==k) {
					ans2=j;
					break;
				}
			}
			break;
		}
		nk.num+=lazy[i];
	}
	return ans2-ans1;
}
void msort(int end1,int end2,int start) {
	int cnt1=1,cnt2=1;
	for(register int i=start; i<start+end1+end2; i++) {
		if((t1[cnt1].num<t2[cnt2].num&&cnt1<=end1)||cnt2>end2)
			s[i]=t1[cnt1++];
		else s[i]=t2[cnt2++];
	}
}
inline void update(int l,int r,int k) {
	int numl=(l/block)+(l%block!=0);
	int numr=(r/block)+(r%block!=0);
	int num1=0,num2=0;
	if(numl==numr) {
		if(l==begin[numl]&&r==end[numl])lazy[numl]+=k;
		else {
			for(int i=l; i<=r; i++)a[i]+=k;
			for(register int i=begin[numl]; i<=end[numl]; i++) {
				a[i]+=lazy[numl];
				s[i].num+=lazy[numl];
				if(s[i].p>=l&&s[i].p<=r)s[i].num+=k,t1[++num1]=s[i];
				else t2[++num2]=s[i];
			}
			msort(num1,num2,begin[numl]);
			lazy[numl]=0;
		}
		return;
	}
	for(register int i=l; i<=end[numl]; i++)a[i]+=k;
	for(register int i=begin[numr]; i<=r; i++)a[i]+=k;
	for(register int i=begin[numl]; i<=end[numl]; i++) {
		a[i]+=lazy[numl];
		s[i].num+=lazy[numl];
		if(s[i].p>=l)s[i].num+=k,t1[++num1]=s[i];
		else t2[++num2]=s[i];
	}
	msort(num1,num2,begin[numl]);
	num1=num2=0;
	for(register int i=begin[numr]; i<=end[numr]; i++) {
		a[i]+=lazy[numr];
		s[i].num+=lazy[numr];
		if(s[i].p<=r)s[i].num+=k,t1[++num1]=s[i];
		else t2[++num2]=s[i];
	}
	msort(num1,num2,begin[numr]);
	lazy[numl]=lazy[numr]=0;
	for(int i=numl+1; i<numr; i++)lazy[i]+=k;
}
signed main() {
	scanf("%lld%lld",&n,&m);
	for(int i=1; i<=n; i++)scanf("%lld",&a[i]),s[i].p=i,s[i].num=a[i];
	build();
	int opt,x,y,z;
	while(m--) {
		scanf("%lld%lld",&opt,&x);
		if(opt==2)
			printf("%lld\n",query(x));
		else scanf("%lld%lld",&y,&z),update(x,y,z);
	}
}
2020/8/21 18:36
加载中...