求助,uoj#228 Extra Test#3是卡什么的QAQ
  • 板块学术版
  • 楼主getchar123
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/2/19 09:39
  • 上次更新2023/11/5 03:05:06
查看原帖
求助,uoj#228 Extra Test#3是卡什么的QAQ
102754
getchar123楼主2021/2/19 09:39

rt,我被卡t了

#include<bits/stdc++.h>
using namespace std;
int n,m,ysl[100010];
struct TREE{
	long long mx,mn,sm,mxs,bj,ymx,ymn;
}tr[400010];
void hb(TREE x,TREE y,TREE &z){
	z.mx=z.ymx=max(x.mx,y.mx);
	z.mn=z.ymn=min(x.mn,y.mn);
	z.sm=x.sm+y.sm;z.mxs=0;
	if(z.mx==x.mx)z.mxs+=x.mxs;
	if(z.mx==y.mx)z.mxs+=y.mxs;
	z.ymx=z.mx;z.ymn=z.mn;	
	return;
}
void bjxc(int p,int ls,int rs,int l,int r,int mid){//xian kai gen zai jia
	if(tr[p].mx-tr[p].mn<=1){
		if(tr[ls].mx==tr[p].ymx){tr[ls].mx=tr[p].mx;}
		else{tr[ls].mx=tr[p].mn;}
		if(tr[ls].mn==tr[p].ymx){tr[ls].mn=tr[p].mx;}
		else{tr[ls].mn=tr[p].mn;}
		if(tr[rs].mx==tr[p].ymx){tr[rs].mx=tr[p].mx;}
		else{tr[rs].mx=tr[p].mn;}
		if(tr[rs].mn==tr[p].ymx){tr[rs].mn=tr[p].mx;}
		else{tr[rs].mn=tr[p].mn;}
		tr[ls].sm=tr[ls].mx*tr[ls].mxs+tr[ls].mn*(mid-l+1-tr[ls].mxs);
		tr[rs].sm=tr[rs].mx*tr[rs].mxs+tr[rs].mn*(r-mid-tr[rs].mxs);
		if(tr[ls].mx-tr[ls].mn==0)tr[ls].mxs=mid-l+1;
		if(tr[rs].mx-tr[rs].mn==0)tr[rs].mxs=r-mid;
	}
	else{
		tr[ls].mx+=tr[p].bj;tr[ls].mn+=tr[p].bj;
		tr[rs].mx+=tr[p].bj;tr[rs].mn+=tr[p].bj;
		tr[ls].sm+=tr[p].bj*(mid-l+1);
		tr[rs].sm+=tr[p].bj*(r-mid);		
	}
	tr[ls].bj+=tr[p].bj;tr[rs].bj+=tr[p].bj;
	tr[p].bj=0;tr[p].ymx=tr[p].mx;tr[p].ymn=tr[p].mn;
	return;
}
void js(int l,int r,int p){
	if(l==r){
		tr[p].mx=tr[p].mn=tr[p].sm=ysl[l];
		tr[p].mxs=1;return;
	}
	int mid=(l+r)>>1,ls=p<<1,rs=(p<<1)+1;
	js(l,mid,ls);js(mid+1,r,rs);
	hb(tr[ls],tr[rs],tr[p]);
	return;
}
void jia(int l,int r,int p,int ll,int rr,long long val){
	if(ll<=l&&r<=rr&&tr[p].mx-tr[p].mn<=1){
		tr[p].bj+=val;tr[p].mx+=val;tr[p].mn+=val;tr[p].sm+=(r-l+1)*val;
		return;
	}
	int mid=(l+r)>>1,ls=p<<1,rs=(p<<1)+1;
	bjxc(p,ls,rs,l,r,mid);
	if(ll<=mid)jia(l,mid,ls,ll,rr,val);
	if(rr>mid)jia(mid+1,r,rs,ll,rr,val);
	hb(tr[ls],tr[rs],tr[p]);
	return;
}
void kaig(int l,int r,int p,int ll,int rr){
	if(ll<=l&&r<=rr&&tr[p].mx-tr[p].mn<=1){
		tr[p].mx=sqrt(tr[p].mx);tr[p].mn=sqrt(tr[p].mn);
		if(tr[p].mx-tr[p].mn==0)tr[p].mxs=r-l+1;
		tr[p].sm=tr[p].mx*tr[p].mxs+tr[p].mn*(r-l+1-tr[p].mxs);
		return;
	}
	int mid=(l+r)>>1,ls=p<<1,rs=(p<<1)+1;
	bjxc(p,ls,rs,l,r,mid);
	if(ll<=mid)kaig(l,mid,ls,ll,rr);
	if(rr>mid)kaig(mid+1,r,rs,ll,rr);
	hb(tr[ls],tr[rs],tr[p]);
	return;
}
long long cx(int l,int r,int p,int ll,int rr){
	if(ll<=l&&r<=rr){
		return tr[p].sm;
	}
	int mid=(l+r)>>1,ls=p<<1,rs=(p<<1)+1;long long jg=0;
	bjxc(p,ls,rs,l,r,mid);
	if(ll<=mid)jg+=cx(l,mid,ls,ll,rr);
	if(rr>mid)jg+=cx(mid+1,r,rs,ll,rr);
	return jg;
}
int main(){
	//freopen("qwq.in","r",stdin);
//	freopen("qwq.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){scanf("%d",&ysl[i]);}
	js(1,n,1);
	while(m--){
		int t,l,r,v;
		scanf("%d%d%d",&t,&l,&r);
		if(t==1){
			scanf("%d",&v);
			jia(1,n,1,l,r,v);
		}
		else if(t==2){
			kaig(1,n,1,l,r);
		}
		else{
			printf("%lld\n",cx(1,n,1,l,r));
		}
	}
	return 0;
} 

2021/2/19 09:39
加载中...