线段树求助
  • 板块灌水区
  • 楼主Fwio_
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/6/20 11:15
  • 上次更新2023/11/3 13:32:16
查看原帖
线段树求助
965238
Fwio_楼主2023/6/20 11:15

蒟蒻刚学线段树,调了30min也没调出来,有没有大佬帮帮QwQ

P1253Code:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1000010;
int a[N] , n , m;
struct Node{
   int l , r;
   int sum , maxn , add;
}tr[N << 2];
void pushup(int u){
   tr[u].sum += tr[u << 1].sum + tr[u << 1 | 1].sum;
   tr[u].maxn = max(tr[u << 1].maxn , tr[u << 1 | 1].maxn);
}
void pushdown(int u){
   if(tr[u].add){
   	tr[u << 1].add += tr[u].add , tr[u << 1].sum += (tr[u << 1].r - tr[u << 1].l + 1) * tr[u].add;
   	tr[u << 1 | 1].add += tr[u].add , tr[u << 1 | 1].sum += (tr[u << 1 | 1].r - tr[u << 1 | 1].l + 1) * tr[u].add;
   	tr[u].add = 0;
   }
}
void build(int u , int l , int r){
   if(l == r){
   	tr[u].l = l , tr[u].r = r;
   	tr[u].sum = a[l] , tr[u].maxn = a[l] , tr[u].add = 0;
   	return ;
   }
   else{
   	tr[u].l = l , tr[u].r = r;
   	int mid = l + r >> 1;
   	build(u << 1 , l , mid);
   	build(u << 1 | 1 , mid + 1 , r);
   	pushup(u);
   }
}
void update(int u , int l , int r , int k){
   if(tr[u].l >= l && tr[u].r <= r){
   	tr[u].maxn = k;
   	tr[u].sum = (tr[u].r - tr[u].l + 1) * k;
   	tr[u].add += k;
   	return ;
   }
   else{
   	pushdown(u);
   	int mid = tr[u].l + tr[u].r >> 1;
   	if(r <= mid) update(u << 1 , l , r , k);
   	else if(l > mid) update(u << 1 | 1 , l , r , k);
   	else update(u << 1 , l , mid , k) , update(u << 1 | 1 , mid + 1 , r , k);
   	pushup(u);
   }
}
void modify(int u , int l , int r , int x){
   if(tr[u].l >= l && tr[u].r <= r){
   	tr[u].sum += (tr[u].r - tr[u].l + 1) * x;
   	tr[u].add += x;
   	tr[u].maxn += x;
   	return ;
   }
   else{
   	pushdown(u);
   	int mid = tr[u].l + tr[u].r >> 1;
   	if(r <= mid) modify(u << 1 , l , r , x);
   	else if(l > mid) modify(u << 1 | 1 , l , r , x);
   	else modify(u << 1 , l , mid , x) , modify(u << 1 | 1 , mid + 1 , r , x);
   	pushup(u);
   }
}
int query(int u , int l , int r){
   if(tr[u].l >= l && tr[u].r <= r) return tr[u].maxn;
   pushdown(u);
   int mid = tr[u].l + tr[u].r >> 1;
   int maxn = 0;
   if(r <= mid) maxn = query(u << 1 , l , r);
   else if(l > mid) maxn = query(u << 1 | 1 , l , r);
   else maxn = max(max(query(u << 1 , l , mid) , maxn) , query(u << 1 | 1 , mid + 1 , r));
   return maxn;
}
int main(){
   scanf("%d%d" , &n , &m);
   for(int i = 1;i <= n;i++) scanf("%d" , &a[i]);
   build(1 , 1 , n);
   while(m--){
   	int opt;
   	scanf("%d" , &opt);
   	if(opt == 1){
   		int l , r , x;
   		scanf("%d%d%d" , &l , &r , &x);
   		update(1 , l , r , x);
   	}
   	else if(opt == 2){
   		int l , r , x;
   		scanf("%d%d%d" , &l , &r , &x);
   		modify(1 , l , r , x);
   	}
   	else{
   		int l , r;
   		scanf("%d%d" , &l , &r);
   		printf("%d\n" , query(1 , l , r));
   	}
   }
   return 0;
}
2023/6/20 11:15
加载中...