写的线段树,TLE三个点,请问可以怎样优化?
查看原帖
写的线段树,TLE三个点,请问可以怎样优化?
189841
N_CanQvQ楼主2020/11/5 08:48
#include<bits/stdc++.h>
using namespace std;

const int max_arr=500005;
const int max_tree=2000005;
int arr[max_arr];
int tree[max_tree];
int n,m;

inline int read(){
	register int x=0,f=1,ch=getchar();
	while(!isdigit(ch))f=ch=='-'?-1:1,ch=getchar();
	while(isdigit(ch))x=x*10+ch-48,ch=getchar();
	return x*f;
}


void build_tree(int arr[],int tree[],int node,int start,int end)
{
    if(start==end)
    {
        tree[node]=arr[start];
    }
    else
    {
        int mid=(start+end)/2;
        int left_node=2*node;
        int right_node=2*node+1;
        build_tree(arr,tree,left_node,start,mid);
        build_tree(arr,tree,right_node,mid+1,end);
        tree[node]=tree[left_node]+tree[right_node];
    }
}

void update_tree(int arr[],int tree[],int node,int start,int end,int idx,int val)
{
    if(start==end)
    {
        arr[idx]+=val;
        tree[node]+=val;
    }
    else
    { 
        int mid=(start+end)/2;
        int left_node=2*node;
        int right_node=2*node+1;
        if(idx>=start&&idx<=mid) update_tree(arr,tree,left_node,start,mid,idx,val);
        else update_tree(arr,tree,right_node,mid+1,end,idx,val);
        tree[node]=tree[left_node]+tree[right_node];
    }
}

int query_tree(int arr[],int tree[],int node,int start,int end,int L,int R)
{
    if(R<start||L>end)
    {
        return 0;
    }
    if(start==end)
    {
        return tree[node];
    }
    else
    {
        int mid=(start+end)/2;
        int left_node=node*2;
        int right_node=node*2+1;
        return tree[node]=query_tree(arr,tree,left_node,start,mid,L,R)+query_tree(arr,tree,right_node,mid+1,end,L,R);
    }
}

int main()
{
    n=read(); m=read();
    for(int i=1;i<=n;i++) arr[i]=read();
    build_tree(arr,tree,1,1,n);
    for(int i=1;i<=m;i++)
    {
        int a,x,y;
        scanf("%d%d%d",&a,&x,&y);
        if(a==1) update_tree(arr,tree,1,1,n,x,y);      
        else printf("%d\n",query_tree(arr,tree,1,1,n,x,y));
    }
    return 0;
}

2020/11/5 08:48
加载中...