跑用例第一次修改[1,4]加1的时候只修改了[3,4],求助
查看原帖
跑用例第一次修改[1,4]加1的时候只修改了[3,4],求助
533856
NuclearBomb楼主2022/9/20 01:03

看了半天没看出问题要哭了

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.LinkedList;
import java.util.Queue;

//线段树2
class Xnode{
    long val;
    long add;//lazy
    long mul=1;//lazy
    int[] range;
    Xnode right;
    Xnode left;
}
public class Main {
    public static int p;
    public static long[] ns;
    public static Queue<Long> printQueue = new LinkedList<>();
    public static void pushdown(Xnode n){
        if(n.right==null&&n.left==null)return;
        if(n.mul!=1){
            n.right.val*=n.mul;
            n.right.mul*=n.mul;
            n.right.add*=n.mul;
            n.left.val*=n.mul;
            n.left.mul*=n.mul;
            n.left.add*=n.mul;
            n.mul=1;
        }
        if(n.add!=0){
            n.right.val+=n.add*(n.right.range[1]-n.right.range[0]+1);
            n.left.val+=n.add*(n.left.range[1]-n.left.range[0]+1);
            n.add=0;
        }
    }
    public static void pushup(Xnode n){
        if(n.right==null&&n.left==null)return;
        n.val=0;
        if(n.left!=null)n.val+=n.left.val;
        if(n.right!=null)n.val+=n.right.val;
    }
    public static Xnode build(int begin,int end){
        if(begin>end)return null;
        Xnode root = new Xnode();
        root.range=new int[]{begin,end};
        if(begin==end)root.val=ns[begin-1];
        else {
            int mid=(begin+end)/2;
            root.left=build(begin,mid);
            root.right=build(mid+1,end);
            pushup(root);
        }
        return root;
    }
    public static void add(int x,int y,int k,Xnode r){
        if(r==null)return;
        if(x>r.range[1]||y<r.range[0])return;
        if(x<=r.range[0]&&y>=r.range[1]){
            r.add+=k;
            r.val+=k*(r.range[1]-r.range[0]+1);
        }else {
            if(r.right!=null)add(x,y,k,r.right);
            if(r.left!=null)add(x,y,k,r.left);
            pushup(r);
        }
    }
    public static void mul(int x,int y,int k,Xnode r){
        if(r==null)return;
        if(x>r.range[1]||y<r.range[0])return;
        if(x<=r.range[0]&&y>=r.range[1]){
            r.add*=k;
            r.mul*=k;
            r.val*=k;
        }else {
            if(r.right!=null)mul(x,y,k,r.right);
            if(r.left!=null)mul(x,y,k,r.left);
            pushup(r);
        }
    }
    public static long getByRange(int x,int y,Xnode r){
        if(r==null)return 0;
        if(x>r.range[1]||y<r.range[0])return 0;
        if(x<=r.range[0]&&y>=r.range[1])return r.val;
        pushdown(r);
        long l = getByRange(x, y, r.left) + getByRange(x, y, r.right);
        return l;
    }
    public static void main(String[] args) throws IOException {
        StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        st.nextToken();
        int n = (int) st.nval;
        st.nextToken();
        int m = (int) st.nval;
        st.nextToken();
        p = (int) st.nval;
        ns = new long[n];
        for (int i = 0; i < n; i++) {
            st.nextToken();
            ns[i]=(long)st.nval;
        }
        Xnode root = build(1,n);
        int tmp,x,y,k;
        for (int i = 0; i < m; i++) {
            st.nextToken();
            tmp=(int)st.nval;
            if (tmp==1) {
                st.nextToken();
                x=(int)st.nval;
                st.nextToken();
                y=(int)st.nval;
                st.nextToken();
                k=(int)st.nval;
                mul(x,y,k,root);
            } else if (tmp==2) {
                st.nextToken();
                x=(int)st.nval;
                st.nextToken();
                y=(int)st.nval;
                st.nextToken();
                k=(int)st.nval;
                add(x,y,k,root);
            }else {
                st.nextToken();
                x=(int)st.nval;
                st.nextToken();
                y=(int)st.nval;
                printQueue.add(getByRange(x,y,root));
            }
        }
        for (Long aLong : printQueue) {
            System.out.println(aLong);
        }
    }
}
2022/9/20 01:03
加载中...