MLE求助 (QWQ)
  • 板块P1531 I Hate It
  • 楼主李东昇
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/10/6 16:55
  • 上次更新2023/10/27 08:28:30
查看原帖
MLE求助 (QWQ)
325021
李东昇楼主2022/10/6 16:55

一只蒟蒻前来求救

#include<bits/stdc++.h>
using namespace std;
int n,m,grade[200005],tree[2000100],ans=-0x3f;

void fbuild(int l,int r,int rt){
	if(l==r){
		tree[rt]=grade[l];
		return;
	}
	int mid=(l+r)/2;
	fbuild(l,mid,rt*2),fbuild(mid+1,r,rt*2+1);
	tree[rt]=max(tree[rt*2],tree[rt*2+1]);
	return;
}

void change(int l,int r,int rt,int pos,int num){
	if(l==r&&l==pos&&num>grade[pos]){
		tree[rt]=num,grade[pos]=num;
		return;
	}
	int mid=(l+r)/2;
	if(mid+1<=pos){
		change(mid+1,r,rt*2+1,pos,num);
	}else if(pos<=mid){
		change(l,mid,rt*2,pos,num);
	}
	tree[rt]=max(tree[rt*2],tree[rt*2+1]);
	return;
}

int quest(int l,int r,int L,int R,int rt){
	if(L<=l&&r<=R){
		return ans=tree[rt];
	}
	int mid=(l+r)/2;
	if(L<=mid){
		int tmp=quest(l,mid,L,R,rt*2),tmp2=ans;
		ans=max(ans,tmp);
//		printf("[L<=mid] (%d,%d) ans:%d=max(%d,%d)\n",l,r,ans,tmp2,tmp);
	}
	else if(mid<R){
		int tmp=quest(mid+1,r,L,R,rt*2+1),tmp2=ans;
		ans=max(ans,tmp);
//		printf("[mid<R] (%d,%d) ans:%d=max(%d,%d)\n",l,r,ans,tmp2,tmp);
	}
	return ans;
}

int main(){
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&grade[i]);
	}
	fbuild(1,n,1);
//	int cnt=1;
//	while(tree[cnt]){
//		printf("%d ",tree[cnt++]);
//	} printf("\n");
	while(m--){
		char kind;int x,y;
		cin>>kind>>x>>y;
		if(kind=='Q'){
			ans=-0x7f;
			printf("%d\n",quest(1,n,x,y,1));
		}else if(kind=='U'){
			change(1,n,1,x,y);
//			cnt=1;
//			while(tree[cnt]){
//				printf("%d ",tree[cnt++]);
//			} printf("\n");
		}
	}
	
	return 0;
}

2022/10/6 16:55
加载中...