社区讨论

超时90……为什么感觉把线段树打成了暴力……

P1253扶苏的问题参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lo2x82df
此快照首次捕获于
2023/10/23 21:15
2 年前
此快照最后确认于
2023/10/23 21:15
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
int opt,j,k,qq;
struct www{
	int l,r,large;
};
const int xx=4e6+10;
www tree[xx];
int lazy[xx],cover[xx];
int a[xx];
int l(int x){
	return x<<1;
}
int read(){
   int x=0,f=1;
   char ch=getchar();
   while(ch < '0' || ch > '9'){
        if(ch=='-') f = -1;
        ch = getchar();
   }
   while(ch >='0' && ch <= '9'){
        x = (x<<3) + (x<<1) + ch - '0';
        ch = getchar();
   }
   return x*f;
}
//不分类型的快读
//快写
void write(int x){
    if(x<0){//判断负数
        x=-x;
        putchar('-');
    }
    if(x>9) write(x/10);//位值拆数,递归
    putchar(x%10+'0');//按位输出
}
int r(int x){
	return l(x)+1;
}
void updata(int x){
	tree[x].large=max(tree[l(x)].large,tree[r(x)].large);
}
void push(int x){
	lazy[l(x)]+=lazy[x];
	lazy[r(x)]+=lazy[x];
	if(cover[x]!=-3e18){
		tree[l(x)].large=tree[r(x)].large=cover[x];
		cover[l(x)]=cover[r(x)]=cover[x];
		lazy[l(x)]=lazy[r(x)]=lazy[x];
	}
	tree[l(x)].large+=lazy[x];
	tree[r(x)].large+=lazy[x];
	lazy[x]=0;
	cover[x]=-3e18;
}
void build(int x,int left,int right){
	tree[x].l=left;
	tree[x].r=right;	cover[x]=-3e18;
    if(left==right){
    	tree[x].large=a[left];
    	return;
	}
	int mid=(left+right)/2;
	build(l(x),left,mid);
	build(r(x),mid+1,right);
	updata(x);
}
void gai(int x ,int left,int right,int k){
	if(tree[x].l==left&&tree[x].r==right){
		tree[x].large=k;
		lazy[x]=0;
		cover[x]=k;
		return;
	}
	if(lazy[x]!=0||cover[x]!=-3e18)push(x);
	if(tree[l(x)].r>=right) gai(l(x),left,right,k);
    else if(tree[r(x)].l<=left) gai(r(x),left,right,k);
    else{
    	gai(l(x),left,tree[l(x)].r,k);
        gai(r(x),tree[r(x)].l,right,k);
	}
    updata(x);
}
void gai1(int x,int left,int right ,int k){
	if(tree[x].l==left&& tree[x].r==right){
		tree[x].large+=k;
		lazy[x]+=k;
		return ;
	}
	if(lazy[x]!=0||cover[x]!=-3e18) push(x);
	if(tree[l(x)].r>=right) gai1(l(x),left,right,k);
	else if(tree[r(x)].l<=left) gai1(r(x),left,right,k);
	else{
	gai1(l(x),left,tree[l(x)].r,k);
	gai1(r(x),tree[r(x)].l,right,k);	
	}
	updata(x);
}
int ask(int x,int left,int right ){
	if(tree[x].l==left&&tree[x].r==right){
		return tree[x].large;
	}
	if(lazy[x]!=0||cover[x]!=-3e18) push(x);
	if(tree[l(x)].r>=right)return ask(l(x),left,right);
	if(tree[r(x)].l<=left) return ask(r(x),left,right);
	return max(ask(l(x),left,tree[l(x)].r),ask(r(x),tree[r(x)].l,right));
}
signed  main(){
	int n,q;
	n=read();
	q=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
	}
	build(1,1,n);
	for(int i=1;i<=q;i++){
		opt=read();
		j=read();
		k=read();
		if(opt==1){
			qq=read();
			gai(1,j,k,qq);
		}
		else if(opt==2){
			qq=read();
			gai1(1,j,k,qq);
		}
		else {
			printf("%lld\n",ask(1,j,k));
		}
	}
	return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...