关于换个顺序就AC这件事
  • 板块灌水区
  • 楼主Dream_weavers
  • 当前回复12
  • 已保存回复12
  • 发布时间2022/3/23 19:58
  • 上次更新2023/10/28 05:51:14
查看原帖
关于换个顺序就AC这件事
572482
Dream_weavers楼主2022/3/23 19:58

rt,是P1531

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

const int N=2e5+5;
int n,m;
int a[N],sum[N*4],tag[N*4];

inline int lc(int x){
	return x<<1;
}
inline int rc(int x){
	return x<<1|1;
}

void pushup(int x){
	sum[x]=max(sum[lc(x)],sum[rc(x)]);
}

void buildtree(int x,int l,int r){
	if(l==r){
		sum[x]=a[l];
		return ;
	}
	int mid=(l+r)/2;
	buildtree(lc(x),l,mid);
	buildtree(rc(x),mid+1,r);
	pushup(x);
}

void update(int x,int l,int r,int l1,int r1){
	if(l==r){
		if(sum[x]<r1)sum[x]=r1;
		return ;
	}
	int mid=(l+r)/2;
	if(l1<=mid)update(lc(x),l,mid,l1,r1);
	else update(rc(x),mid+1,r,l1,r1);
	pushup(x);
}

int query(int x,int l,int r,int l1,int r1){
	if(l1<=l&&r<=r1) return sum[x];
	int mid=(l+r)/2;
	int res=-1e9;
	if(l1<=mid)res=max(res,query(lc(x),l,mid,l1,r1));
	if(mid<r1)res=max(res,query(rc(x),mid+1,r,l1,r1));
	return res;
}

signed main(){
	int x,y,k;
	char op;
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]); 
	buildtree(1,1,n);
	while(m--){
		cin>>op>>x>>y;//scanf("%c",&op);
		if(op=='Q'){
		    printf("%lld\n",query(1,1,n,x,y));
		}else{
			update(1,1,n,x,y);
		}
	} 
    return 0;
}

看代码第60到64行,这里面的如果判断

if(op=='U'){
		update(1,1,n,x,y);
	}else{
		printf("%lld\n",query(1,1,n,x,y));
}

就会WA 20分,反过来就AC,不知道为什么求助

2022/3/23 19:58
加载中...