线段树TLE on #20 玄关求调
查看原帖
线段树TLE on #20 玄关求调
1140784
StarryRTX楼主2025/1/23 20:24
#include<iostream>
#include<cstdio>
#include<vector>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<climits>
#define ls id<<1
#define rs id<<1|1
#define MAXN 500005
#define int long long
#define ull unsigned long long
#define rep(k,l,r) for(register int k=l;k<=r;++k)
#define req(k,l,r) for(register int k=l;k<r;++k)
#define qep(k,l,r) for(register int k=l;k>=r;--k)
#define qeq(k,l,r) for(register int k=l;k>r;--k)
#define sped_cout_cin ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
using namespace std;
int n,m,l,r,k,t,x,y,op,id;
int luA[MAXN<<1],luB[MAXN<<1];
struct tree{int l,r,sum1,sum2;}tr[MAXN*4];
inline 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*10+ch-'0',ch=getchar();
    return x*f;
}
inline void pushup(int id){
	tr[id].sum1=tr[ls].sum1+tr[rs].sum1,
	tr[id].sum2=min(tr[ls].sum2,tr[rs].sum2);
	return ;
}
void build(int id,int l,int r){
	tr[id].l=l,tr[id].r=r;
	if(l==r){
		tr[id].sum1=luA[l]+luB[l],
		tr[id].sum2=luA[l]*luB[l];
		return ;
	}
	int mid=l+r>>1;
	build(ls,l,mid),build(rs,mid+1,r);
	pushup(id);
	return ;
}
void Change1(int id,int l,int r,int k,int t){
	if(tr[id].sum2>k) return ;
	if(tr[id].l==tr[id].r){
		luA[tr[id].l]+=t,luB[tr[id].l]+=t,
		tr[id].sum1+=t<<1,/* ==t*2 */tr[id].sum2=luA[tr[id].l]*luB[tr[id].l];//change += with = 
		return ;
	}
	int mid=tr[id].l+tr[id].r>>1;
	if(l<=mid) Change1(ls,l,r,k,t);
	if(r>mid) Change1(rs,l,r,k,t);
	pushup(id);
	return ;
}
void Change2(int id,int tar,int x,int y){
	if(tr[id].l==tr[id].r){
		luA[tr[id].l]=x,luB[tr[id].l]=y,
		tr[id].sum1=x+y,tr[id].sum2=x*y; 
		return ;
	}
	int mid=tr[id].l+tr[id].r>>1;
	if(tar<=mid) Change2(ls,tar,x,y);
	if(tar>mid) Change2(rs,tar,x,y);
	pushup(id);
	return ;
}
int query(int id,int l,int r){
	if(tr[id].l>=l&&tr[id].r<=r) return tr[id].sum1;
	int mid=tr[id].l+tr[id].r>>1,s=0;
	if(l<=mid) s+=query(ls,l,r);
	if(r>mid) s+=query(rs,l,r);
	return s;
}
signed main(){
	//sped_cout_cin
	n=read(),m=read();
	rep(i,1,n) luA[i]=read(); 
	rep(i,1,n) luB[i]=read();
	build(1,1,n);
	while(m--){
		cin>>op;
		if(op==1){
			l=read(),r=read(),k=read(),t=read();
			Change1(1,l,r,k,t);
		}else if(op==2){
			id=read(),x=read(),y=read();
			Change2(1,id,x,y);
		}else if(op==3){
			l=read(),r=read();
			cout<<query(1,l,r)<<'\n';
		}
	}
	return 0;
}
2025/1/23 20:24
加载中...