记录编号 335995 评测结果 AAAAAAAAAAT
题目名称 快速红包变换 最终得分 90
用户昵称 Gravatar_Itachi 是否通过 未通过
代码语言 C++ 运行时间 1.680 s
提交时间 2016-11-02 20:54:47 内存使用 7.98 MiB
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=100005<<2,INF=0x3f3f3f3f;
int n,m,s,t,qx;
int sum[maxn],ma[maxn],mi[maxn],cntma[maxn],cntmi[maxn];
int lzsum[maxn],lzf[maxn];
int Rabit_max(int x,int y){return x>y?x:y;}
int Rabit_min(int x,int y){return x<y?x:y;}
void Rabit_up(int rt){
	int ls=rt<<1,rs=rt<<1|1;
	sum[rt]=sum[ls]+sum[rs];
	if(ma[ls]==ma[rs])ma[rt]=ma[ls],cntma[rt]=cntma[ls]+cntma[rs];
	else{
		if(ma[ls]>ma[rs])ma[rt]=ma[ls],cntma[rt]=cntma[ls];
		else ma[rt]=ma[rs],cntma[rt]=cntma[rs];	
	}
	if(mi[ls]==mi[rs])mi[rt]=mi[ls],cntmi[rt]=cntmi[ls]+cntmi[rs];
	else{
		if(mi[ls]<mi[rs])mi[rt]=mi[ls],cntmi[rt]=cntmi[ls];
		else mi[rt]=mi[rs],cntmi[rt]=cntmi[rs];	
	}
}
void Rabit_down(int rt,int l,int r){
	int mid=(l+r)>>1,ls=rt<<1,rs=rt<<1|1;
	if(lzf[rt]){
		sum[ls]=lzf[rt]*(mid-l+1),lzsum[ls]=0;
		sum[rs]=lzf[rt]*(r-mid),lzsum[rs]=0;
		lzf[ls]=lzf[rs]=ma[ls]=mi[ls]=ma[rs]=mi[rs]=lzf[rt];
		cntma[ls]=cntmi[ls]=mid-l+1;
		cntma[rs]=cntmi[rs]=r-mid;
		lzf[rt]=0;
	}
	if(lzsum[rt]){
		sum[ls]+=lzsum[rt]*(mid-l+1),sum[rs]+=lzsum[rt]*(r-mid);
		if(lzf[ls])lzf[ls]+=lzsum[rt];else lzsum[ls]+=lzsum[rt];
		if(lzf[rs])lzf[rs]+=lzsum[rt];else lzsum[rs]+=lzsum[rt];
		ma[ls]+=lzsum[rt],ma[rs]+=lzsum[rt];
		mi[ls]+=lzsum[rt],mi[rs]+=lzsum[rt];
		lzsum[rt]=0;
	}	
}
#define ls rt<<1,l,mid
#define rs rt<<1|1,mid+1,r
void Rabit_set(int rt,int l,int r){
	if(l==r){
		scanf("%d",&sum[rt]);
		ma[rt]=mi[rt]=sum[rt];
		cntma[rt]=cntmi[rt]=1;
		return;	
	}
	int mid=(l+r)>>1;
	Rabit_set(ls),Rabit_set(rs);
	Rabit_up(rt);
}
void Cadd(int rt,int l,int r){
	if(s<=l&&r<=t){
		sum[rt]+=qx*(r-l+1);
		ma[rt]+=qx,mi[rt]+=qx;
		lzsum[rt]+=qx;
		return;	
	}
	Rabit_down(rt,l,r);
	int mid=(l+r)>>1;
	if(s<=mid)Cadd(ls);
	if(t> mid)Cadd(rs);
	Rabit_up(rt);
}
void Cchange(int rt,int l,int r){
	if(s<=l&&r<=t){
		sum[rt]=qx*(r-l+1);
		ma[rt]=mi[rt]=qx;
		cntma[rt]=cntmi[rt]=r-l+1;
		lzf[rt]=qx;lzsum[rt]=0;
		return;	
	}
	Rabit_down(rt,l,r);
	int mid=(l+r)>>1;
	if(s<=mid)Cchange(ls);
	if(t> mid)Cchange(rs);
	Rabit_up(rt);
}
void Cbmax(int rt,int l,int r){
	if(s<=l&&r<=t&&ma[rt]<=qx){
		sum[rt]=qx*(r-l+1);
		ma[rt]=mi[rt]=qx;
		cntma[rt]=cntmi[rt]=r-l+1;
		lzf[rt]=qx;lzsum[rt]=0;
		return;	
	}
	if(l==r||mi[rt]>=qx)return;
	int mid=(l+r)>>1;
	Rabit_down(rt,l,r);
	if(s<=mid)Cbmax(ls);
	if(t> mid)Cbmax(rs);
	Rabit_up(rt);
}
void Cbmin(int rt,int l,int r){
	if(s<=l&&r<=t&&mi[rt]>=qx){
		sum[rt]=qx*(r-l+1);
		ma[rt]=mi[rt]=qx;
		cntma[rt]=cntmi[rt]=r-l+1;
		lzf[rt]=qx;lzsum[rt]=0;
		return;	
	}
	if(l==r||ma[rt]<=qx)return;
	Rabit_down(rt,l,r);
	int mid=(l+r)>>1;
	if(s<=mid)Cbmin(ls);
	if(t> mid)Cbmin(rs);
	Rabit_up(rt);
}
int Qsum(int rt,int l,int r){
	if(s<=l&&r<=t)return sum[rt];
	Rabit_down(rt,l,r);
	int res=0,mid=(l+r)>>1;
	if(s<=mid)res+=Qsum(ls);
	if(t> mid)res+=Qsum(rs);
	return res;
}
int Qwmax(int rt,int l,int r){
	if(s<=l&&r<=t)return ma[rt];
	Rabit_down(rt,l,r);
	int res=0,mid=(l+r)>>1;
	if(s<=mid)res=Qwmax(ls);
	if(t> mid)res=Rabit_max(res,Qwmax(rs));
	return res;
}
int Qwmin(int rt,int l,int r){
	if(s<=l&&r<=t)return mi[rt];
	Rabit_down(rt,l,r);
	int res=INF,mid=(l+r)>>1;
	if(s<=mid)res=Qwmin(ls);
	if(t> mid)res=Rabit_min(res,Qwmin(rs));
	return res;
}
int w;
int Qnmax(int rt,int l,int r){
	if(s<=l&&r<=t){w=ma[rt];return cntma[rt];}
	Rabit_down(rt,l,r);
	int	mid=(l+r)>>1;
	if(t<=mid)return Qnmax(ls);
	else if(s>mid)return Qnmax(rs);
	else{
		int res,cur,tmp;
		res=Qnmax(ls);cur=w;
		tmp=Qnmax(rs);
		if(cur==w)return res+tmp;
		else if(cur<w)return tmp;
		else{
			w=cur;return res;	
		}
	}
}
int Qnmin(int rt,int l,int r){
	if(s<=l&&r<=t){w=mi[rt];return cntmi[rt];}
	Rabit_down(rt,l,r);
	int	mid=(l+r)>>1;
	if(t<=mid)return Qnmin(ls);
	else if(s>mid)return Qnmin(rs);
	else{
		int res,cur,tmp;
		res=Qnmin(ls);cur=w;
		tmp=Qnmin(rs);
		if(cur==w)return res+tmp;
		else if(cur>w)return tmp;
		else{
			w=cur;return res;	
		}
	}
}
void Rabit_main(){
	scanf("%d",&n);
	Rabit_set(1,1,n);
	scanf("%d",&m);char ope[10];
	while(m--){
		scanf("%s",ope);
		if(ope[0]=='C'){
			scanf("%d%d%d",&s,&t,&qx);
			if(ope[1]=='a')Cadd(1,1,n);
			else if(ope[1]=='c')Cchange(1,1,n);
			else if(ope[3]=='a')Cbmax(1,1,n);
			else Cbmin(1,1,n);
		}
		else{
			scanf("%d%d",&s,&t);
			if(ope[1]=='s')printf("%d\n",Qsum(1,1,n));
			else if(ope[1]=='w'&&ope[3]=='a')printf("%d\n",Qwmax(1,1,n));
			else if(ope[1]=='w')printf("%d\n",Qwmin(1,1,n));
			else if(ope[3]=='a')printf("%d\n",Qnmax(1,1,n));
			else printf("%d\n",Qnmin(1,1,n));
		}	
	}
}
bool _Rabit(),RABIT=_Rabit();int main(){;}
bool _Rabit(){
#define _Rabit _RABIT
#ifdef _Rabit
	freopen("redbag.in","r",stdin);
	freopen("redbag.out","w",stdout);
#endif
	Rabit_main();
#ifndef _Rabit
	getchar(),getchar();
#endif
	fclose(stdin);fclose(stdout);
	return 0;
}