首页 > 其他分享 >Weekly Contest 387

Weekly Contest 387

时间:2024-03-09 22:34:50浏览次数:29  
标签:nums int Contest add grid 387 new public Weekly

Problem A

Distribute Elements Into Two Arrays I

思路

按照题意模拟即可.

代码

class Solution {
    public int[] resultArray(int[] nums) {
        int n = nums.length;
        int[] ans = new int[n];
        int[] arr1 = new int[n];
        int[] arr2 = new int[n];
        int l = 1;
        int r = 1;
        arr1[0] = nums[0];
        arr2[0] = nums[1];
        for(int i = 2;i<n;++i){
            if(arr1[l-1]>arr2[r-1]){
                arr1[l++] = nums[i];
            }
            else{
                arr2[r++] = nums[i];
            }
        }
        int i = 0;
        for(int j = 0;j<l;++j){
            ans[i++] = arr1[j];
        }
        for(int j = 0;j<r;++j){
            ans[i++] = arr2[j];
        }
        return ans;
    }
}

Problem B

Count Submatrices with Top-Left Element and Sum Less Than k

思路

二维数组前缀和

代码

class Solution {
    public int countSubmatrices(int[][] grid, int k) {
        int n = grid.length;
        int m = grid[0].length;
        int[][] dp = new int[n+1][m+1];
        // dp[0][0] = grid[0][0];
        int cnt = 0;
        for(int i = 1;i<=n;++i){
            for(int j = 1;j<=m;++j){
                dp[i][j] = dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+grid[i-1][j-1];
                if(dp[i][j]<=k){
                    ++cnt;
                }
            }
        }
        return cnt;
        
    }
}

Problem C

Minimum Operations to Write the Letter Y on a Grid

思路

题目不难 按照坐标枚举 求出Y型区域每个数字出现的次数以及非Y型区域每个数字的出现次数,然后枚举两部分的最终字符即可

代码

class Solution {
    public int minimumOperationsToWriteY(int[][] grid) {
        int n = grid.length;
        int[] cnt = new int[3];
        for(int i = 0;i<n;++i){
            for(int j = 0;j<n;++j){
                cnt[grid[i][j]]++;
            }
        }
        int[] Y_cnt = new int[3];
        int d = (n+1)/2;
        for(int i = 0;i<d;++i){
            Y_cnt[grid[i][i]]++;
            Y_cnt[grid[i][n-i-1]]++;
            Y_cnt[grid[i+d-1][d-1]]++;
        }
        Y_cnt[grid[d-1][d-1]]-=2;
        cnt[0]-=Y_cnt[0];
        cnt[1]-=Y_cnt[1];
        cnt[2]-=Y_cnt[2];
        int s1 = cnt[0]+cnt[1]+cnt[2];
        int s2 = Y_cnt[0]+Y_cnt[1]+Y_cnt[2];
        int ans  = n*n*n;
        for(int i = 0;i<3;++i){
            for(int j = 0;j<3;++j){
                if(i==j){
                    continue;
                }
                int cal = s1-cnt[i]+s2-Y_cnt[j];
                ans = Math.min(ans,cal);
            }
        }
        return ans;
        
    }
}
        

Problem D

Distribute Elements Into Two Arrays II

思路

主要问题在于如何两个有序的序列,其他的按照题意模拟即可
比赛时使用的python现有的数据结构进行的模拟 对于 greaterCount则使用二分查找实现
实际上应该使用两个树状数组进行实现,要注意题目中数的取值范围是1e9 所以应该先离散化再取值

代码

比赛代码

def greaterCount(heap, val):
    l = 0
    r = len(heap)
    while(l<r):
        mid= (l+r)>>1
        if(heap[mid]<val):
            l = mid+1
        else:
            r = mid
    return l+1

def distribute(nums):

    arr1 = [nums[0]]
    arr2 = [nums[1]]
    h1 = [-nums[0]]
    h2 = [-nums[1]]
    for i in range(2, len(nums)):
        count1 = greaterCount(h1, -nums[i])
        count2 = greaterCount(h2, -nums[i])
        if count1 > count2:
            bisect.insort_left(h1, -nums[i])
            arr1.append(nums[i])
        elif count1 < count2:
            bisect.insort_left(h2, -nums[i])
            arr2.append(nums[i])
        else:
            if len(arr1) <= len(arr2):
                bisect.insort_left(h1, -nums[i])
                arr1.append(nums[i])
            else:
                bisect.insort_left(h2, -nums[i])
                arr2.append(nums[i])
    result = arr1 + arr2
    return result
class Solution:

    def resultArray(self, nums: List[int]) -> List[int]:
        return distribute(nums)

补题代码

class Solution {
    public int greaterCount(BIT b,int val,int cnt){
        return cnt - b.getSum(val);
    }
    public int[] resultArray(int[] nums) {
        TreeSet<Integer> tree = new TreeSet<Integer>();
        for(int num:nums){
            tree.add(num);
        }
        Map<Integer,Integer> map = new HashMap<>();
        int i = 1;
        for(int k:tree){
            map.put(k,i++);
            
        }
        List<Integer> l1 = new ArrayList<>();
        List<Integer> l2 = new ArrayList<>();
        l1.add(nums[0]);
        l2.add(nums[1]);
        int cnt1 = 1;
        int cnt2 = 1;
        BIT t1 = new BIT(i);
        BIT t2 = new BIT(i);
        t1.add(map.get(nums[0]),1);
        t2.add(map.get(nums[1]),1);
        for( i = 2;i<nums.length;++i){
            int g1 = greaterCount(t1,map.get(nums[i]),cnt1);
            int g2 = greaterCount(t2,map.get(nums[i]),cnt2);
            // System.out.println(" "+g1+ " " + g2);
            if(g1>g2||(g1==g2&&cnt1<=cnt2)){
                ++cnt1;
                l1.add(nums[i]);
                t1.add(map.get(nums[i]),1);
            }
            else{
                ++cnt2;
                l2.add(nums[i]);
                t2.add(map.get(nums[i]),1);
            }
        }
        int[] ans = new int[nums.length];
       
        l1.addAll(l2);
        for(int j = 0;j<nums.length;++j){
            ans[j] = l1.get(j);
        }
        return ans;
    }
}
class BIT {
    
    int n;
    int[] tr;
    BIT(int n){
        this.n = n;
        tr = new int[n+1];
    }
    public static int lowbit(int x){
        return x&-x;
    }
    public  void add(int x,int v){
        while(x<=n){
            tr[x]+=v;
            x+=lowbit(x);
        }
    }
    public int getSum(int k){
        int ret = 0;
        while(k>0){
            ret+=tr[k];
            k-=lowbit(k);
        }
        return ret;
    }

}

总结

本场简单 成功AK 但是第四题的思路不清晰 补学了下树状数组

标签:nums,int,Contest,add,grid,387,new,public,Weekly
From: https://www.cnblogs.com/baihualiaoluan/p/18063508

相关文章

  • CF387B George and Round 题解
    考虑采用双指针法解决此题。首先需要对\(a,b\)数组排序,并且维护两个指针\(l,r\),分别指向\(a,b\)两个数组中的元素。接着循环移动\(r\)指针,每次都尝试匹配\(a_l\)和\(b_r\):若\(a_l\leb_r\),则说明\(a_l=b_r\)或可以采用减少\(b_r\)的方式使\(a_l=b_r\),这......
  • CF contest 1935 Round 932 (Div. 2) A-D题解
    CodeforcesRound932(Div.2)A-D题解CodeforcesRound932(Div.2)绪言很菜,AB速度慢,卡在C,想DP,但是时间优化不下来,说服自己\(2\times10^3\)能过\(n^3\),D稍微简单,但是没看D,遂掉分。A.EntertainmentinMAC给你一个字符串\(s\)和一个偶整数\(n\)。你可以对它进行两种运......
  • AtCoder Regular Contest 171
    Preface小补一场ARC,D还是很有意思的但想了半天不会,鉴定为纯纯的彩笔A-NoAttacking考虑怎么放rook能使得留下来能放pawn的格子数量最多,手玩一下会发现先按照\((2,2),(4,4),(6,6),\cdots\)的顺序放,放满后再接着放\((1,1),(3,3),(5,5),\cdots\)是最优的手玩一下可以得出在放......
  • AtCoder Beginner Contest 343
    A-WrongAnswer(abc343A)题目大意给定\(a,b\),输出\(c\),使得\(a+b\neqc\)解题思路从\(0\)开始枚举\(c\)的取值即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio(false);cin.......
  • AtCoder Beginner Contest 321
    \[\large\text{Round12:AtCoderBeginnerContest321}\]一言:只要你在,我便无所不能。——进击的巨人感觉只有最后一道题有点意思,其他的就是时间问题,但是速度还是不够快,思维要跟上啊。有意思的是,周考考了回退背包,这里居然又来一次。。\(\text{G:ElectricCircuit}......
  • AtCoder Regular Contest 171
    \[\large\text{Round13:AtCoderRegularContest171}\]一言:我并不是要失去自由,而是要去收获那无可替代的不自由。——SSSS.电光机王几年没写了,但是我们仍然要捡回来!没啥好写的,T1,T2能力范围之内,T3不会,T4感觉很好,但是没做出来。\(\text{D:RollingHash}\)这题无论......
  • AtCoder Beginner Contest 298
    \[\large\text{Round5:AtCoderBeginnerContest298(VP)}\]一言:成一事者,是失之不渝的愚者;毁一事者,是停滞不前的贤者。——不正经的魔法讲师\(\text{Ex:SumofMinofLength}\)这次比赛总体难度不是很大,可能也是我第一次自己独立做出\(\text{Ex}\)。(虽然不是场切......
  • AtCoder Beginner Contest 315
    \[\large\text{Round6:AtCoderBeginnerContest315}\]一言:愿悲、爱恋、你和宇宙以及那颗星辰,能够永远拥抱我们。——THEBEYOND-機動戦士ガンダム40周年纪念曲这场打的一般,主要还是一开始网卡爆了把心态弄得很不好,一定程度上影响了发挥。\(\text{G:Ai+Bj+Ck......
  • AtCoder Beginner Contest 310
    \[\large\text{Round8:AtCoderBeginnerContest310(VP)}\]一言:虚伪的眼泪,会伤害别人,虚伪的笑容,会伤害自己。——反叛的鲁鲁修\(\text{F}\)竟然没有第一时间想到状压,还是太蒟了。。\(\text{F:Make10Again}\)这题看到一个子集,再加上子集和的范围只需要考虑小于......
  • AtCoder Beginner Contest 313
    \[\large\text{Round2:AtCoderBeginnerContest313(VP)}\]一言:当我拔出第二把剑时,就是为了我所爱之人——刀剑神域这场比赛真的是大败而归,只A了\(A,B,C,E\)。。。虽然但是,\(F,G\)确实不可做,但是\(D\)题还是有点可惜了。\(\text{D:OddorEven}\)感觉考场......