Java线段树答案,总是TLE卡在第2和第9个示例,不知为啥,求大佬指点
查看原帖
Java线段树答案,总是TLE卡在第2和第9个示例,不知为啥,求大佬指点
357027
v7fgg楼主2022/5/19 21:11
import java.util.*;
import java.io.*;
import java.math.*;
public class Main{
    public static void main(String args[]) throws IOException{
        Read sc=new Read();
        int n=sc.nextInt(),m=sc.nextInt();
        long preSum[]=new long[n+1];
        long sum[]=new long[4*n+5];
        for(int i=0;i<n;i++){
            preSum[i+1]=preSum[i]+sc.nextInt();
        }
        build(preSum,sum,0,n-1,1);
        for(int i=0;i<m;i++){
            int a=sc.nextInt();
            if(a==1){
                int x=sc.nextInt(),k=sc.nextInt();
                change(sum,0,n-1,1,k,x-1);
            }
            else{
                int x=sc.nextInt(),y=sc.nextInt();
                System.out.println(getSum(sum,0,n-1,x-1,y-1,1));
            }
        }
    }
    public static long getSum(long sum[],int l,int r,int a,int b,int idx){
        if(l==a&&r==b){
            return sum[idx];
        }
        int mid=(l+r)>>1;
        if(b<=mid){
            return getSum(sum,l,mid,a,b,2*idx);
        }
        else if(a>mid){
            return getSum(sum,mid+1,r,a,b,2*idx+1);
        }
        return getSum(sum,l,mid,a,mid,2*idx)+getSum(sum,mid+1,r,mid+1,b,2*idx+1);
    }
    public static void change(long sum[],int l,int r,int idx,int k,int x){
        sum[idx]+=k;
        if(l==r){
            return;
        }
        int mid=(l+r)>>1;
        if(x<=mid){
            change(sum,l,mid,2*idx,k,x);
        }
        else{
            change(sum,mid+1,r,2*idx+1,k,x);
        }
    }
    public static void build(long preSum[],long sum[],int l,int r,int idx){
        sum[idx]=preSum[r+1]-preSum[l];
        if(l==r){
            return;
        }
        int mid=(l+r)>>1;
        build(preSum,sum,l,mid,2*idx);
        build(preSum,sum,mid+1,r,2*idx+1);
    }
}
class Read{
    private BufferedReader bf;
    private StringTokenizer st;
    public Read(){
        bf=new BufferedReader(new InputStreamReader(System.in));
        st=new StringTokenizer("");
    }
    public String nextLine() throws IOException{
        return bf.readLine();
    }
    public String next() throws IOException{
        while(!st.hasMoreTokens()){
            st=new StringTokenizer(bf.readLine());
        }
        return st.nextToken();
    }
    public int nextInt() throws IOException{
        return Integer.parseInt(next());
    }
    public long nextLong() throws IOException{
        return Long.parseLong(next());
    }
    public double nextDouble() throws IOException{
        return Double.parseDouble(next());
    }
    public BigInteger nextBigInteger() throws IOException{
        return new BigInteger(next());
    }
}
2022/5/19 21:11
加载中...