最后三个点TLE是为什么

P3372 【模板】线段树 1

lpnp6 @ 2023-03-08 14:52:22

#include<bits/stdc++.h>
#include <iostream>
#include <variant>
using namespace std;
struct node{
  int l,r;
  long long sum;
}tr[6000001];
int n,m,cnt=1;
void build(int root,int l,int r)
{
  tr[root].l=l,tr[root].r=r;
  if(l==r)
  {
    int input;
    cin>>input;
    tr[root].sum=input;
    return;
  }
  build(2*root,l,(l+r)/2);
  build(2*root+1,(l+r)/2+1,r);
  tr[root].sum=tr[2*root].sum+tr[2*root+1].sum;
}
void add(int root,int x,int y,int k)
{
  if(tr[root].r<x||tr[root].l>y)return;
  if(tr[root].l==tr[root].r)
  {
    tr[root].sum+=k;
    return;
  }
  add(2*root,x,y,k);
  add(2*root+1,x,y,k);
  tr[root].sum=tr[2*root].sum+tr[2*root+1].sum;

}
long long getsum(int root,int x,int y)
{
  if(tr[root].l>=x&&tr[root].r<=y)return tr[root].sum;
  if(tr[root].l>y||tr[root].r<x)return 0;
  long long s=0;
  if(y>=tr[root].l)s+=getsum(2*root,x,y);
  if(x<=tr[root].r)s+=getsum(2*root+1,x,y);
  return s;
}
int main()
{
  cin>>n>>m;
  build(1,1,n);
  while(m--)
  {
    int op;
    cin>>op;
    int x,y,k;
    switch (op)
    {
      case 1:
      cin>>x>>y>>k;
      add(1,x,y,k);
      break;
      case 2:
      cin>>x>>y;
      cout<<getsum(1,x,y)<<endl;
      break;
    }
  }
}

by Bbaka @ 2023-03-08 15:07:15

@lpnp6 你这个修改太暴力了


by Bbaka @ 2023-03-08 15:08:36

如果修改多就会消耗很多的时间,修改应该采用懒标记或者标记永久化之类的方式来进行


by lpnp6 @ 2023-03-08 15:24:33

@Bbaka 明白了谢谢


|