首页 > 其他分享 >[atcoder 351] [F Double Sum] [线段树]

[atcoder 351] [F Double Sum] [线段树]

时间:2024-05-01 16:23:39浏览次数:25  
标签:atcoder return int Sum long static 351 new null

解法,使用线段树。

请看代码:


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.StringTokenizer;

public class Main {
    static class SegmentNode {
        int left;
        int right;
        int cnt; //[left,right] have 多少个数
        long sum; //[left,right] 中所有数的和

        SegmentNode leftNode = null;
        SegmentNode rightNode = null;


        public SegmentNode(int l, int r) {
            this.left = l;
            this.right = r;
            cnt = 0;
            sum = 0;
            leftNode = null;
            rightNode = null;
        }

        /**
         * 查找区间[x,y]上的cnt,sum
         *
         * @param x
         * @param y
         * @return
         */
        public long[] query(int x, int y) {
            if (y < x) {
                return new long[]{0,0};
            }
            if (this.left >= x && this.right <= y) {
                return new long[]{cnt, sum};
            }

            int mid = (this.left + this.right) >> 1;
            if (x > mid) {
                if (this.rightNode != null) {
                    return this.rightNode.query(x, y);
                }
                else {
                    return new long[]{0, 0};
                }
            }
            else if (y > mid) {
                long[] a1 = new long[2];
                long[] b1 = new long[2];

                if (this.leftNode != null) {
                    a1 = this.leftNode.query(x, mid);
                }
                if (this.rightNode != null) {
                    b1 = this.rightNode.query(mid+1, y);
                }

                return new long[]{a1[0] + b1[0], a1[1] + b1[1]};
            }
            else {
                if (this.leftNode != null) {
                    return this.leftNode.query(x, y);
                }
                return new long[]{0, 0};
            }
        }

        public void add(int n) {
            if (this.left <= n && this.right >= n) {
                this.cnt++;
                this.sum += n;
            }

            if (this.left == n && this.right == n) {
                return;
            }

            int mid  = (this.left + this.right) >> 1;

            if (n > mid) {
                if (this.rightNode == null) {
                    this.rightNode = new SegmentNode(mid+1, this.right);
                }
                this.rightNode.add(n);
            }
            else {
                if (this.leftNode == null) {
                    this.leftNode = new SegmentNode(this.left, mid);
                }
                this.leftNode.add(n);
            }
        }

    }

    static SegmentNode root = new SegmentNode(0, 1000_000_00);

    public static void main(String[] args) throws IOException {
        int n = rd.nextInt();

        long ans = 0;
        for (int i = 0; i < n; i++){
            int num = rd.nextInt();
            root.add(num);
            long[] range = root.query(0, num-1);
            long cnt = range[0];
            ans += cnt * num - range[1];
        }
        System.out.println(ans);
    }
}
class rd {
    static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer tokenizer = new StringTokenizer("");

    // nextLine()读取字符串
    static String nextLine() throws IOException {
        return reader.readLine();
    }

    // next()读取字符串
    static String next() throws IOException {
        while (!tokenizer.hasMoreTokens()) tokenizer = new StringTokenizer(reader.readLine());
        return tokenizer.nextToken();
    }

    // 读取一个int型数值
    static int nextInt() throws IOException {
        return Integer.parseInt(next());
    }

    // 读取一个double型数值
    static double nextDouble() throws IOException {
        return Double.parseDouble(next());
    }

    // 读取一个long型数值
    static long nextLong() throws IOException {
        return Long.parseLong(next());
    }

    // 读取一个BigInteger
    static BigInteger nextBigInteger() throws IOException {
        BigInteger d = new BigInteger(rd.nextLine());
        return d;
    }
}

标签:atcoder,return,int,Sum,long,static,351,new,null
From: https://www.cnblogs.com/fishcanfly/p/18169424

相关文章

  • ABC351F
    F-DoubleSum题意简述Justit.思路1发现很像求正序对,但是需要具体数字计算。只考虑\(A_j-A_i>0\),那么我们把\(A_j,-A_i\)分开计算。考虑\(A_j\)被计算的清形,其实就是以它结尾的正序对个数。考虑\(-A_i\)被计算的清形,其实就是以它开头的正序对个数,翻转序列,转化为以......
  • ABC351E
    E-JumpDistanceSum题意简述Justit.思路兔子斜着走->国际象棋里的象->黑象只能到达黑格,白象只能到达白格(横纵坐标相加的奇偶性)。将点分成两组,则每组内的点之间都有答案。可以发现可以先朝着那个方向斜着走,然后超出的部分向着那个方向迂回是最优的。如图不难发现距离是......
  • ABC351讲解
    ABC351A:题意思路:直接按题意模拟,求出\(\SigmaA\)和\(\SigmaB\)再相减便是差,因为要获胜所以再\(+1\)即可。代码B:题意思路:直接按照题意\(N^2\)枚举即可。代码C:题意思路:直接按照题意模拟即可。代码D:请lrx讲解。F:题意思路:题意十分简单,就是求\(\Sig......
  • Atcoder ABC 351 全题解
    乾岩我:G题来咯!!!大火:这G题,大家都不敢做,说是有人在里面放了毒瘤。我:做,做,为什么不做!不做也别想活着!!!(两天后)我:我的G题完成辣!!!!!!AB不讲C显然$2^a*2=2^{a+1}$。考虑用一个栈存球的大小是$2$的多少次方,每次插入球后,不断取出后面两个球,大小相同则合并,否则插入下一个......
  • ABC351E 补题笔记
    批:赛时很快想到切比雪夫后就跳进主席树里出不来了。一个很妙的题。首先分\(x+y\)的奇偶性黑白染色后黑色和白色不可达。然后对于同一个颜色的点易得\(dis=\max(|x1-x2|,|y1-y2|)\),即切比雪夫距离。这个时候就可以直接上主席树了,但太复杂不是正解。最简单的解法是:我们充分......
  • ABC351D
    [ABC351D]GridandMagnet题意简述给定一个\(h\timesw\)的网格,有些网格中有磁铁。你可以向上下左右移动\(1\)格。当这个格子上下左右有磁铁时你不能移动。对于每个没有磁铁的单元格,将其自由度定义为从该单元格重复移动所能到达的单元格数。求网格中所有没有磁铁的单元格......
  • AtCoder-abc350_g 题解
    原题链接题意简述有一个无向图,初始时没有边。接下来有一些操作:将\(u,v\)连边。询问\(u,v\)的距离是否为\(2\),如果是,则输出中间的那个点的编号,否则输出0。每次询问后,更新\(lastans\)为询问的答案,初始时为\(0\)。每次操作的\(opt,u,v\)使用\(lastans\)解码,......
  • AtCoder-abc350_f 题解
    原题链接题意简述给定一个字符串\(S\),对于每个匹配的括号,将括号内的字符左右翻转并大小写反转,然后删除括号。输出最后的序列。思路本题为文艺平衡树的模板题。扫一遍字符串进行括号匹配,每次把最内层的括号进行操作。最后遍历一遍平衡树,将不为括号字符的字符输出。FHQ_Treap......
  • Binomial Sum 学习笔记
    BinomialSum如果我们有一个微分有限函数\(F(z)\),还有另外一个生成函数\(G(z)\),一个数列\(a\),如果我们能对\(k\in[0,n]\)的每一个\(k\)快速求出\(G^k(z)\)的前\(n\)项系数带权和,即\[b_k=\sum_{i=0}^na_i[z^i]G^k(z)\]那么我们可以在\(\Theta(n)\)的时间复杂度内......
  • [题解]ABC351 D~F
    D-GridandMagnet[明天更]E-JumpDistanceSum一开始想到的思路很复杂,先把\(n\)个点按照\(x+y\mod\2\)分成\(2\)组,对于每一组用线段树维护……总之很繁多,虽然有完整的思路,理论上也应该可行,但是实现太麻烦就看题解了。题目描述的距离叫切比雪夫距离,也就是\(x\)坐标之差......