萌新刚学线段树,后三点TLE,无法理解
查看原帖
萌新刚学线段树,后三点TLE,无法理解
194771
Fall_SH楼主2020/11/5 16:19

RT

#include<bits/stdc++.h>
using namespace std;
unsigned long long a,b,x,ans;
long long r()
  {
    long long num;
    char x;
    while(!isdigit(x=getchar()));
    num=x^48;
    while(isdigit(x=getchar()))
      num=(num<<1)+(num<<3)+(x^48);
    return num;
  }

struct S
  {
    int l,r,w,f;
  }tree[4*100001];

inline void down(int k)
  {
    tree[k<<1].f+=tree[k].f;
    tree[k<<1|1].f+=tree[k].f;
    tree[k<<1].w+=tree[k].f*(tree[k<<1].r-tree[k<<1].l+1);
    tree[k<<1|1].w+=tree[k].f*(tree[k<<1|1].r-tree[k<<1|1].l+1);
    tree[k].f=0;
  }

inline void build(int ll,int rr,int k)
  {
     tree[k].l=ll,tree[k].r=rr;
     if(ll==rr)
       {
         tree[k].w=r();
         return ;
	   }
	  int mid=(ll+rr)>>1;
	  build(ll,mid,k<<1);
	  build(mid+1,rr,k<<1|1);
	  tree[k].w=tree[k<<1].w+tree[k<<1|1].w;
  }
  
inline void ask_i(int k)
  {
    if(tree[k].l==tree[k].r)
      {
        ans+=tree[k].w;
        return;
	  }
	if(tree[k].f)
	  down(k);
	int mid=(tree[k].l+tree[k].r)>>1;
	if(a<=mid)
	  ask_i(k<<1);
	if(b>mid)
	  ask_i(k<<1|1);
  }

inline void add_i(int k)
  {
    if(tree[k].l>=a&&tree[k].r<=b)
      {
        tree[k].w+=(tree[k].r-tree[k].l+1)*x;
        tree[k].f+=x;
        return ;
	  }
	if(tree[k].f)
	  down(k);
	int mid=(tree[k].l+tree[k].r)>>1;
	if(a<=mid)
	  add_i(k<<1);
	if(b>mid)
	  add_i(k<<1|1);
	tree[k].w=tree[k<<1].w+tree[k<<1|1].w;
  }

int main()
{
  long long  n,m;
  n=r(),m=r();
  build(1,n,1);
  for(int i=1;i<=m;i++)
    {
      long long  xx;
      xx=r();
      if(xx==1)
        {
          a=r(),b=r(),x=r();
          add_i(1);
		}
	  else
	    {
	      a=r(),b=r();
	      ans=0;
	      ask_i(1);
	      printf("%lld\n",ans);
		}
	}
  return 0;
}

舅舅孩子

2020/11/5 16:19
加载中...