首页 > 其他分享 >【leetcode 399 周赛】【题解】

【leetcode 399 周赛】【题解】

时间:2024-05-26 19:34:05浏览次数:26  
标签:周赛 return int 题解 端点 ans new 399 public

  • 第一题和第三题一样。就是求约数

  • 第二题就是模拟

  • 第4题使用线段树

  • 1,3题代码

  • 实际上发现没有下面代码的负载,比如: a*b = n ,枚举a就好,a在[1, sqrt(n)内。

import java.util.*;

class Solution {

    public int numberOfPairs(int[] nums1, int[] nums2, int k) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums2.length; i++) {
            map.put(nums2[i], map.getOrDefault(nums2[i], 0) + 1);
        }
        int ans = 0;
        for (int i = 0; i < nums1.length; i++) {
            if (nums1[i] % k == 0) {
                List<Integer> list = getfactor(nums1[i] / k);
                for (int num : list) {
                    ans += map.getOrDefault(num, 0);
                }
            }
        }
        return ans;
    }

    public List<int[]> getPrime(int n) {
        List<int[]> ans = new LinkedList<>();
        int p = 2;
        while (p * p <= n) {
            if (n % p == 0) {
                int cnt = 0;
                while (n % p == 0) {
                    n = n / p;
                    cnt++;
                }
                ans.add(new int[]{p, cnt});
            }
            p++;
        }
        if (n != 1) {
            ans.add(new int[]{n,1});
        }
        return ans;
    }

    public List<Integer> getfactor(int n) {
        List<int[]> ans = getPrime(n);
        List<Integer> res = new ArrayList<>();
        res.add(1);
        dfs(ans, res, 0, 1);
        return res;
    }

    public int pow(int base, int p) {
        if (p == 0) {
            return 1;
        }
        if (p == 1) {
            return base;
        }
        int ans = pow(base, p / 2);
        if (p % 2 == 0) {
            return ans * ans;
        }
        return ans * ans * base;
    }

    public void dfs(List<int[]> ans, List<Integer> res, int depth, int curr) {
        if (depth == ans.size()) {
            if (curr != 1) {
                res.add(curr);
            }
            return;
        }
        int[] tmp = ans.get(depth);
        int p = tmp[0];
        int cnt = tmp[1];
        for (int c = 0; c <= cnt; c++) {
            dfs(ans, res, depth + 1, curr * pow(p, c));
        }
    }
}
  • 第2题
class Solution {
    public String compressedString(String word) {
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < word.length(); ) {
            char c = word.charAt(i);
            int j =  i;
            int cnt = 0;
            while(j < word.length() && cnt < 9 && word.charAt(j) == c) {
                cnt++;
                j++;
            }
            sb.append(String.format("%d%c",cnt,c));
            i = j;
        }
        return sb.toString();
    }
}
  • 第4题 线段树
class Solution {
    public static void main(String[] args) {
        Solution solution = new Solution();
        int ans = solution.maximumSumSubsequence(new int[]{
                3,5,9
        }, new int[][]{
                {1, -2},
                {0, -3}
        });
        System.out.println(ans);
    }
    public int maximumSumSubsequence(int[] nums, int[][] queries) {
        int n = nums.length;
        Segment segment = new Segment(0, n - 1);
        for (int i = 0; i < nums.length; i++) {
            segment.update(i, nums[i]);
        }

        long ans = 0;
        for (int i = 0; i < queries.length; i++) {
            int pos = queries[i][0];
            int x = queries[i][1];
            nums[pos] = x;

            segment.update(pos, x);
            ans += segment.max();
            ans %= 1000_000_007;
        }
        return (int)ans;
    }

    class Segment {
        int l, r;
        Segment left, right;
        // f00, f01, f10, f11
        // f00 表示左端点一定不选,右端点也一定不选 最大值
        // f01 表示左端点一定不选,右端点可选可不选 最大值
        // f10 表示左端点可选可不选,右端点一定不选 最大值
        // f11 表示左端点可选可不选,右端点可选可不选 最大值
        int[] f = new int[4];

        public Segment(int l, int r) {
            this.l = l;
            this.r = r;
        }

        public int max() {
            return Math.max(Math.max(f[0], f[1]), Math.max(f[2], f[3]));
        }
        
        public void update(int L, int value) {
            if (l == L && L == r) {
                f[0] = 0;
                f[1] = 0;
                f[2] = 0;
                f[3] = Math.max(value, 0);
                return;
            }
            int mid = (l + r) / 2;
            if (this.left == null) {
                this.left = new Segment(l, mid);
            }
            if (this.right == null) {
                this.right = new Segment(mid + 1, r);
            }
            if (L <= mid) {
                this.left.update(L, value);
            } else {

                this.right.update(L, value);
            }

            pushup();
        }

        public void pushup() {
            int[] a = this.left.f;
            int[] b = this.right.f;

            f[0] = Math.max(a[0] + b[2], a[1] + b[0]);
            f[1] = Math.max(a[0] + b[3], a[1] + b[1]);
            f[2] = Math.max(a[2] + b[2], a[3] + b[0]);
            f[3] = Math.max(a[2] + b[3], a[3] + b[1]);
        }
    }
}

标签:周赛,return,int,题解,端点,ans,new,399,public
From: https://www.cnblogs.com/fishcanfly/p/18214172

相关文章

  • CATIA入门操作——萌新宝宝遇到的奇奇怪怪的问题解决,持续更新中。。。
    目录引出发生肾么事了??鼠标中键旋转不了解决:特征树不显示参数关系我的窗口去哪了?插曲:草图工具的调出插曲:颜色工具栏显示弹窗警告警告:创建约束是临时的操作技巧技巧:快速隐藏不相关元素工具栏怎么变成水平?总结异形弹簧新建几何体草图编辑,画一条样条线进行扫掠,圆心和半......
  • CF1821F Timber 题解
    题意:在\([1,n]\)的区间里放\(m\)棵树,每棵树的高度为\(k\)。求有多少种放置树的方法,满足:每个树都在整点上,且每个点最多只能放一棵树。存在一种砍倒树的方案,使得树倒了之后不会越界,也不会有某个点被超过一棵树占据。你可以自由选择树向左倒(也就是占据区间\([x-k,x]\))......
  • [SHOI2007]书柜的尺寸 题解
    题目链接设\(f_{i,t1,t2}\)表示前\(i\)本书,第一层的宽度为\(t1\),第二层的宽度为\(t2\),所需要的最小高度。第三层宽度\(t3=\sum_{i=1}^{i}t_i-t1-t2\)。但本题还有一个重要限制:每层的高度取决于该层最高的书,如果直接按照顺序加入书本,从\(dp\)的状态来看,无法确定新书本......
  • CCF-GESP 等级考试 2024年3月认证C++一级真题解析
    2024年03月真题1单选题第1题C++表达式(3-2)*3+5的值是()。A.-13B.8C.2D.0正确答案:B.8解析:首先计算括号中的表达式(3-2),得到(1)。接下来进行乘法运算(1*3),得到(3)。最后进行加法运算(3+5),得到(8)。因此,表达式的值是(8)。第2题C++......
  • 小猴编程周赛C++ | 字符串价值
    学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!附上汇总贴:小猴编程C++|汇总-CSDN博客【题目描述】一个字符串的价值定义为:该字符串所有字母价值之和,一个字母如果在字符串中是第一次出现,则该字母的价值为2,否则价值为1,并且......
  • 小猴编程周赛C++ | 环形最大子段和
    学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!附上汇总贴:小猴编程C++|汇总-CSDN博客【题目描述】给出一个长度为n的环形数组a1......
  • 小猴编程周赛C++ | 密码锁
    学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!附上汇总贴:小猴编程C++|汇总-CSDN博客【题目描述】小猴有一个密码锁,密码锁是由n个轮子组成,每个轮子上都写着数字a......
  • 题解:P6880 [JOI 2020 Final] オリンピックバス
    一个比较重要的性质:反转的边要在最短路上才会有贡献。我们可以先跑一遍最短路,记录下整颗最短路树,然后暴力的对每一条边进行判断,反转。我们建正反图各两个,分别以\(1\),\(n\)为起点。\(n\),\(1\)为终点。然后对每个图跑最短路,记录下最短路树。若不反转任何一条边,则答案为\(1\)......
  • 题解:CF1119D Frets On Fire
    大水题。首先,若区间内只有一根弦,不会对答案有贡献。我们思考如何对答案产生贡献。我们知道,对于每一个\(s_i\),都会产生一段\(s_i+r-l\)的连续序列,在对\(s\)数组排序后,若每个\(s_i+r-l\ges_{i+1}\)则答案为\(s_n+r-(s_1+l)+1\)。若够不到下一位呢?我们在\(s_n+r-(s_1+l......
  • UVA11922 Permutation Transformer 题解
    题目传送门前置知识无旋treap解法与luoguP3391【模板】文艺平衡树不同的是本题翻转后需要放到整个序列的末尾。由于需要翻转后放到末尾,故无旋Treap在维护文艺平衡树的过程中合并时跳着合并即可。代码#include<bits/stdc++.h>usingnamespacestd;#definelllong......