Into_the_Abyss @ 2024-08-13 08:36:25
求调
马蜂不咋好qwq
#include<bits/stdc++.h>
#define maxn 1000100
#define ll long long
using namespace std;
ll a[maxn],n,k;
struct node{
ll l,r,sum,b,min;
}t[maxn<<2];
void push_up(ll p){
t[p].sum=t[p<<1].sum+t[p<<1|1].sum;
}
void build(ll l,ll r,ll p){
t[p].l=l;t[p].r=r;
if(l==r){t[p].sum=a[l];return;}
ll mid=l+r>>1;
build(l,mid,p<<1);
build(mid+1,r,p<<1|1);
push_up(p);
}
void push_down(ll l,ll r,ll p){
t[p<<1].b+=t[p].b;t[p<<1|1].b+=t[p].b;
ll mid=l+r>>1;
t[p<<1].sum+=t[p].b*(mid-l+1);
t[p<<1|1].sum+=t[p].b*(r-mid);
t[p].b=0;
}
void modify(ll lq,ll rq,ll l,ll r,ll x,ll p){
if(l>=lq&&r<=rq){
t[p].sum+=x*(r-l+1);
t[p].b+=x;
return ;
}
push_down(l,r,p);
ll mid=l+r>>1;
if(lq<=mid)modify(lq,rq,l,mid,x,p<<1);
if(rq>mid)modify(lq,rq,mid+1,r,x,p<<1|1);
push_up(p);
}
void dl(ll lq,ll rq,ll l ,ll r,ll x,ll p){
if(l==r){
t[p].sum=x;
return ;
}
ll mid=l+r>>1;
push_down(l,r,p);
if(lq<=mid)dl(lq,rq,l,mid,x,p<<1);
if(rq>mid)dl(lq,rq,mid+1,r,x,p<<1|1);
push_up(p);
}
ll getsum(ll lq,ll rq,ll l,ll r,ll p){
if(l>=lq&&r<=rq)return t[p].sum;
ll mid=l+r>>1,ans=0;
push_down(l,r,p);
if(lq<=mid)ans+=getsum(lq,rq,l,mid,p<<1);
if(rq>mid)ans+=getsum(lq,rq,mid+1,r,p<<1|1);
return ans;
}
ll getmax(ll lq,ll rq,ll l,ll r,ll p){
if(l==r)return t[p].sum;
ll mid=l+r>>1,ans=-114514114514;
push_down(l,r,p);
if(lq<=mid)ans=max(getmax(lq,rq,l,mid,p<<1),ans);
if(rq>mid)ans=max(getmax(lq,rq,mid+1,r,p<<1|1),ans);
return ans;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n;cin>>k;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,n,1);
while(k--){
int opt,x,y,q;
cin>>opt;
if(opt==2){
cin>>x>>y>>q;
modify(x,y,1,n,q,1);
}
else if(opt==1){
cin>>x>>y>>q;
dl(x,y,1,n,q,1);
}
else{
cin>>x>>y;
cout<<getmax(x,y,1,n,1)<<"\n";
}
}
return 0;
}
https://www.luogu.com.cn/record/172302682
by littlep001 @ 2024-08-13 08:46:02
区间加和是不是要打懒标记呀(具体不也不太清楚
by Air_Color5 @ 2024-08-13 08:47:06
@Into_the_Abyss 我感觉你没有理解线段树的本质啊,只是写了一个区间求和+lazytag就把做法硬往这道题上搬。建议好好理解一下线段树的本质。你的时间复杂度是
by Into_the_Abyss @ 2024-08-13 08:48:53
@Air_Color5 thx
by 1_plus_1_equal_5 @ 2024-08-13 08:49:02
@Air_Color5 他这个哪里来的
by smartdevil @ 2024-08-13 08:50:55
完了太菜了找不出来哪里T了AWA
by xuduang @ 2024-08-13 08:52:16
这是标记少打了一个吗
by xuduang @ 2024-08-13 08:52:28
没打覆盖标记
by yiming_328 @ 2024-08-13 08:53:01
你似乎是用区间和改的区间最值,但最值并没有维护,查询时间为O(n),再加上外循环,妥妥的n方级别,不超时才怪
by yiming_328 @ 2024-08-13 08:53:55
@Into_the_Abyss 你把区间和改为区间最值就可以了
by Into_the_Abyss @ 2024-08-13 08:55:30
@xuduang 好像是的,没打覆盖标记