首页 > 其他分享 >第 365 场周赛 (依赖树, 环形滑动窗口,内向基环树)

第 365 场周赛 (依赖树, 环形滑动窗口,内向基环树)

时间:2023-11-02 16:22:04浏览次数:43  
标签:pre 周赛 target nums int max 基环树 365 deg

本题可以发现一些枚举的技巧,在枚举多个值的时候,自己有时候脑袋晕晕的,会把变量的更新顺序搞混,此时,可以用依赖树来解决。

如同本题:

class Solution:
    def maximumTripletValue(self, nums: List[int]) -> int:
        res = pre_max = pre_dif = 0

        for x in nums:
            res = max(res, pre_dif * x)
            pre_dif = max(pre_dif, pre_max - x)
            pre_max = max(pre_max, x)
           '''
          res -> pre_dif -> pre_max 按照拓扑序来更新变量就不会出问题
        ''' return res

 

 

 我们可以将一个数组无限的拼起来,找到元素和为target的最小子数组,可以预想在 nums + nums + nums + ... 这样的数组中做滑动窗口

1 2 3 | 1 2 3  | 1 2 3... 

可以发现我们在滑动窗口时,窗口内的元素由多个nums和一个前缀和一个后缀组成。

窗口内的nums个数为: target // sum(nums)

所以本题在分析到这里后,只要考虑前一个nums的前缀和后一个nums的后缀(这个后缀可能是跨过了nums),其实就是在 nums + nums这个大数组中,任意地方插入我们 target//sum(nums)个nums就是答案。

class Solution:
    def minSizeSubarray(self, nums: List[int], target: int) -> int:
        total = sum(nums)
        n = len(nums)
        ans = inf
        left = 0
        s = 0

        for right in range(n * 2):
            s += nums[right % n]
            while s > target % total:
                s -= nums[left % n]
                left += 1
            if s == target % total:
                ans = min(ans, right - left + 1)

        if ans == inf:
            return -1
        return ans + target // total * n

 

 

 

 这个题目给的图有个特点,出度都是1,且有n个点n条边,是一个内向基环树。

处理基环树问题时,首先是要找环,可以使用拓扑排序来找环。

有向图中可以建立反向边,从入度为0的点开始进行拓扑排序,最后那几个点度数不会为0,不会被加入队列;无向图中度数为2的那些点就是基环上的点。

本题我们先建立反向边找到基环,然后从基环上的点进行遍历。

基环上的点可达的点数就是环的大小。基环外的子树可达的点就是其到基环点的距离+基环大小。这个距离就是其到基环的深度。

class Solution:

    '''
        每个点都只有一条出边, 并且有n个点,n条边,是内向基环图
    '''

    def countVisitedNodes(self, g: List[int]) -> List[int]:
        n = len(g)
        rg = [[] for _ in range(n)]
        deg = [0] * n

        for x, y in enumerate(g):
            rg[y].append(x)
            deg[y] += 1

        q = deque(i for i, d in enumerate(deg) if d == 0)
        while q:
            x = q.popleft()
            y = g[x]
            deg[y] -= 1
            if deg[y] == 0:
                q.append(y)

        ans = [0] * n

        def rdfs(x: int, depth: int) -> None:
            ans[x] = depth
            for y in rg[x]:
                if deg[y] == 0:   # 是树枝边
                    rdfs(y, depth + 1)
        
        for i, d in enumerate(deg):
            if d <= 0:
                continue
            ring = []
            x = i
            while True:
                deg[x] = -1
                ring.append(x)
                x = g[x]
                if x == i:
                    break
                
            for x in ring:
                rdfs(x, len(ring))

        
        return ans

 

标签:pre,周赛,target,nums,int,max,基环树,365,deg
From: https://www.cnblogs.com/zk6696/p/17805688.html

相关文章

  • 【蓝桥杯】1024 第 2 场算法双周赛(1~5)
    【蓝桥杯】1024第2场算法双周赛新生【算法赛】-蓝桥云课(lanqiao.cn)#include<iostream>usingnamespacestd;intmain(){printf("15");return0;}铺地板【算法赛】-蓝桥云课(lanqiao.cn)只要面积乘积是\(6\)的倍数即可,特判一下宽和高#include<bits/s......
  • Microsoft 365 E5 开启邮件转发
    首先:连接ExchangeOnlinePowerShell:然后输入代码:Connect-ExchangeOnline-UserPrincipalNameyouremailher@yourdomainhere.comEnable-OrganizationCustomizationSet-HostedOutboundSpamFilterPolicy-IdentityDefault-AutoForwardingModeOnGet-HostedOutboundSpamFilt......
  • Microsoft 365:如何借助Power Virtual Agents来打造智能客服方案
    Blog链接:https://blog.51cto.com/13969817从ChatGPT问世后,微软的Microsoft365权限产品也陆续拥抱AI,比如PowerVirtualAgents就可以使用生成式AI在几分钟内创建强大的聊天机器人,不需要开发人员的帮助,开箱即用的解决方案,快速地响应客户和员工的需求,适用于相关问题客服支持、相关产......
  • 第 369 场周赛(简单位运算,分类讨论,dfs,树形dp)
     简单位运算模拟classSolution{public:intfindKOr(vector<int>&nums,intk){vector<int>bit(32,0);for(inti=0;i<31;i++){intcnt=0;for(autox:nums){if(x>>......
  • Acwing127周赛第三题 构造矩阵 (套路)
    题目链接:构造矩阵题目描述我们希望构造一个n×m的整数矩阵。构造出的矩阵需满足:每一行上的所有元素之积均等于k。每一列上的所有元素之积均等于k。保证k为1或−1。请你计算,一共可以构成出多少种不同的满足条件的矩阵。由于结果可能很大,你只需要输出对109+7......
  • 第 116 场双周赛(双指针,背包问题,线段树+lz标记)
     本题为双指针和贪心。当我们遇到奇数个0或1时,直接将下一位改变即可。classSolution{public:intminChanges(strings){intn=s.size();intres=0;intl=0,r=-1;while(r++<n-1){if(s[l]==s[r])......
  • 第 116 场双周赛
    不知道为什么今天晚上脑子里想的全是递归  说实话四道题看了都不是很有思路也不是没有思路吧而是知道怎么做但是感觉写不出来而且莫名其妙想的全是递归的解法可能是因为浏览量最高的那篇文章也是递归22:43-23:10差不多30min写了两道题 第一题(22:58AC)100094. 子数......
  • Acwing.第126场周赛
    Acwing.第126场周赛比赛链接之前忘记整理上传了,不能有遗留问题A.蜗牛爬井蜗牛在n米深的井底往上爬,每天清晨到傍晚向上爬5米,夜间又滑下来4米,请问像这样从某天清晨开始,第几天爬到井口?输入格式一个正整数n。输出格式一个整数,表示爬到井口的天数。思路:就是一个比较简答......
  • 2023级HAUT新生周赛题解汇总
    2023级HAUT新生周赛(零)熟悉周赛规则专场:2023级HAUT新生周赛(一)@21级学长专场(张子豪,张鑫,李昊阳):2023级HAUT新生周赛(二)@曹瑞峰专场:2023级HAUT新生周赛(三)@22级学姐专场(杨焱,刘振歌,周欣滢):2023级HAUT新生周赛(四)@牛浩然专场:2023级HAUT新生周赛(五)@陈兰锴专场:......
  • P3657 题解
    是不是有点恶意评分了题目链接Sol看完题目就想到了这个题。这道题同样是求线段,不过这个加了点限制,发现一个点最多连4条边出去,暴力连边的复杂度是正确的,于是就把这题变成黄了。利用刚刚那道题的trick,把边按左端点排序后右端点的LIS就是答案。这里给一个更方便的做法,不用......