WA14求助
查看原帖
WA14求助
200044
JS_TZ_ZHR楼主2022/10/11 21:41

和题解拍了几组小数据都是对的

虽然我知道不会有人来看的

#include<bits/stdc++.h>
#define base 16
#define N 500005
#define len 10
#define ll long long
using namespace std;
int n,m,a[N],sum[15],opt,l,r,x,tot;
long long lst;
struct node{
	int mn,mx,tag,cnt;
	long long sum;
}t[9][N/2];
inline int read(){
	int x=0;
	char ch=getchar();
	while(ch<'0'||ch>'9')ch=getchar();
	while(ch>='0'&&ch<='9'){
		x=(x*10)+ch-'0';
		ch=getchar();
	}
	return x;
}
void push_up(int p1,int p2){
	t[p1][p2].sum=t[p1][p2<<1].sum+t[p1][p2<<1|1].sum;
	t[p1][p2].cnt=t[p1][p2<<1].cnt+t[p1][p2<<1|1].cnt;
	t[p1][p2].mx=max(t[p1][p2<<1].mx,t[p1][p2<<1|1].mx);
	t[p1][p2].mn=min(t[p1][p2<<1].mn,t[p1][p2<<1|1].mn);
}
void del(int p1,int p2,int k,int l,int r){

	if(r-l+1<=len){
		for(int i=l;i<=r;i++)
			if(a[i]>=sum[p1-1]&&a[i]<sum[p1])a[i]-=k,t[p1][p2].sum-=k;
		t[p1][p2].mn-=k,t[p1][p2].mx-=k;
		return;
	}
	t[p1][p2].tag+=k;
	t[p1][p2].mn-=k,t[p1][p2].mx-=k,t[p1][p2].sum-=(ll)t[p1][p2].cnt*k;
}
void push_down(int p1,int p2,int l,int r){
	if(!t[p1][p2].tag)return;
	int mid=(l+r)>>1;
	del(p1,p2<<1,t[p1][p2].tag,l,mid),del(p1,p2<<1|1,t[p1][p2].tag,mid+1,r);
	t[p1][p2].tag=0;
}
void build(int l,int r,int p,int P){
	if(r-l+1<=len){
		t[P][p].mn=2e9;
		for(int i=l;i<=r;i++){
			if(!(a[i]>=sum[P-1]&&a[i]<sum[P]))continue;
			t[P][p].sum+=a[i];
			t[P][p].cnt++;
			t[P][p].mx=max(t[P][p].mx,a[i]);
			t[P][p].mn=min(t[P][p].mn,a[i]);
		}
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,p<<1,P);
	build(mid+1,r,p<<1|1,P);
	push_up(P,p);
}
void add(int p,int l,int r,int p1,int p2){
	if(r-l+1<=len){
		t[p1][p2].sum+=a[p],t[p1][p2].mx=max(t[p1][p2].mx,a[p]);
		t[p1][p2].mn=min(t[p1][p2].mn,a[p]),t[p1][p2].cnt++;
		return;
	}
	int mid=(l+r)>>1;
	push_down(p1,p2,l,r);
	if(mid>=p)add(p,l,mid,p1,p2<<1);
	else add(p,mid+1,r,p1,p2<<1|1);
	push_up(p1,p2);
}
void upd(int l1,int r1,int l,int r,int p1,int p2,int k){
	if(t[p1][p2].mn==2000000000||t[p1][p2].mx<=k)return;
	
	if(r-l+1<=len){
		for(int i=l;i<=r;i++){
			if(i<l1||i>r1||!(a[i]>=sum[p1-1]&&a[i]<sum[p1])||a[i]<=k)continue;
			a[i]-=k;
			t[p1][p2].sum-=k;
			if(a[i]<sum[p1-1]){
				for(int j=p1-1;j>=1;j--)if(a[i]>=sum[j-1]&&a[i]<sum[j])add(i,1,n,j,1);
				t[p1][p2].sum-=a[i];
				t[p1][p2].cnt--;
			}
			t[p1][p2].mn=2e9;
			t[p1][p2].mx=0;
			for(int i=l;i<=r;i++){
				if(a[i]>=sum[p1-1]&&a[i]<sum[p1]){
					t[p1][p2].mn=min(t[p1][p2].mn,a[i]);
					t[p1][p2].mx=max(t[p1][p2].mx,a[i]);
				}
			}
		}
		return;
	}
	if(l>=l1&&r<=r1&&t[p1][p2].mn-sum[p1-1]>=k){
		del(p1,p2,k,l,r);
		return;
	}
	int mid=(l+r)>>1;
	push_down(p1,p2,l,r);
	if(mid>=l1)upd(l1,r1,l,mid,p1,p2<<1,k);
	if(r1>mid)upd(l1,r1,mid+1,r,p1,p2<<1|1,k);
	push_up(p1,p2);
}
ll q1(int l1,int r1,int l,int r,int p1,int p2){
	if(l>=l1&&r<=r1)return t[p1][p2].sum;
	ll res=0;
	if(r-l+1<=len){
		for(int i=l;i<=r;i++)
			if(a[i]>=sum[p1-1]&&a[i]<sum[p1]&&i>=l1&&i<=r1)res+=a[i];
		return res;
	}
	int mid=(l+r)>>1;
	push_down(p1,p2,l,r);
	if(mid>=l1)res+=q1(l1,r1,l,mid,p1,p2<<1);
	if(r1>mid)res+=q1(l1,r1,mid+1,r,p1,p2<<1|1);
	return res;
}
int q2(int l1,int r1,int l,int r,int p1,int p2){
	if(l>=l1&&r<=r1)return t[p1][p2].mn;
	int res=2e9;
	if(r-l+1<=len){
		for(int i=l;i<=r;i++)
			if(a[i]>=sum[p1-1]&&a[i]<sum[p1]&&i>=l1&&i<=r1)res=min(res,a[i]);
		return res;
	}
	int mid=(l+r)>>1;
	push_down(p1,p2,l,r);
	if(mid>=l1)res=min(res,q2(l1,r1,l,mid,p1,p2<<1));
	if(r1>mid)res=min(res,q2(l1,r1,mid+1,r,p1,p2<<1|1));
	return res;
}
int q3(int l1,int r1,int l,int r,int p1,int p2){
	if(l>=l1&&r<=r1)return t[p1][p2].mx;
	int res=0;
	if(r-l+1<=len){
		for(int i=l;i<=r;i++)if(a[i]>=sum[p1-1]&&a[i]<sum[p1]&&i>=l1&&i<=r1)res=max(res,a[i]);
		return res;
	}
	int mid=(l+r)>>1;
	push_down(p1,p2,l,r);
	if(mid>=l1)res=max(res,q3(l1,r1,l,mid,p1,p2<<1));
	if(r1>mid)res=max(res,q3(l1,r1,mid+1,r,p1,p2<<1|1));
	return res;
}
int main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	sum[0]=1;
	for(int i=1;i<=7;i++)sum[i]=sum[i-1]*base;
	sum[8]=1e9+1;
	for(int i=1;i<=8;i++)build(1,n,1,i);
	while(m--){
		opt=read(),l=read(),r=read();
		if(opt==1)x=read();
		l^=lst,r^=lst,x^=lst;
		if(opt==1)for(int i=1;i<=8;i++)upd(l,r,1,n,i,1,x);
		else{
			lst=0;
			int t1=2e9,t2=0;
			for(int i=1;i<=8;i++){
				lst+=q1(l,r,1,n,i,1);
				t1=min(t1,q2(l,r,1,n,i,1));
				t2=max(t2,q3(l,r,1,n,i,1));
			}
			printf("%lld %d %d\n",lst,t1,t2);
			lst%=(1<<20);
		}
	}
}
/*
10 10
23423 5646 6346 676 25325 767 5235 6755 546346 634
2 1 5
2 1 9
2 6 10
2 3 6
1 1 10 6744
2 4 7
1 4 8 2352
1 1 10 10000
2 4 9
2 1 6
*/
2022/10/11 21:41
加载中...