Codeforces841D dfs+脑洞

该博客主要介绍了如何解决Codeforces 841D竞赛题目。题目要求在给定的无向图中,通过选择某些边确保每个点的度数模2等于其权值或等于-1。作者采用DFS策略,从叶子节点开始,当遇到权值为1的节点时,在其与父节点间添加边,确保取反操作正确。若根节点状态无法满足要求(即权值为1),则检查是否存在权值为-1的节点,通过沿路径取反来调整。最后,如果不存在权值为-1的节点,则输出-1,表示无法满足条件。
摘要由CSDN通过智能技术生成

题目链接:http://codeforces.com/contest/841/problem/D


题意:给你一个n个点m条边的联通无向图,有重边无自环,每个点有一个权值d,d[i]={-1,0,1},要求在图中选择一些边使得对于图中的任意点 i 有度数x%2==d[i]或者d[i]==-1.


思路:考虑一条边都不选的时候,那么d[i]==1的点将不满足要求,我们就必须要给它加一条边。如果我们用dfs来维护这个过程,对于d[i]>=0的点,添边的过程实际上是d[i]取反的过程,我们从叶子结点向上搜索,对于每一棵子树u(u为父节点),如果u的子节点v d[v]==1,我们就在u和v之间连一条边,表现为d[u](d[u]!=-1)和d[v]取反,由于对一个节点进行取反并不影响他的子节点的状态,所以当我们将这个过程进行完毕后只有根节点的状态是不确定的,那么对于根节点u,如果d[u]==0或者d[u]==-1,那么此时选取的边已经符合要求,如果d[u]==1,考虑如果它的所有子节点中,存在一点x d[x]==-1,那么我们遍历从x到u的路径,并沿途取反,此时这条路径上只有u的状态会发生改变,其他的状态均不会发生改变,此时d[u]==0,符合题意要求,输出即可。因此输出-1的条件就

CodeForces - 616D是一个关于找到一个序列中最长的第k好子段的起始位置和结束位置的问题。给定一个长度为n的序列和一个整数k,需要找到一个子段,该子段中不超过k个不同的数字。题目要求输出这个序列最长的第k好子段的起始位置和终止位置。 解决这个问题的方法有两种。第一种方法是使用尺取算法,通过维护一个滑动窗口来记录\[l,r\]中不同数的个数。每次如果这个数小于k,就将r向右移动一位;如果已经大于k,则将l向右移动一位,直到个数不大于k。每次更新完r之后,判断r-l+1是否比已有答案更优来更新答案。这种方法的时间复杂度为O(n)。 第二种方法是使用枚举r和双指针的方法。通过维护一个最小的l,满足\[l,r\]最多只有k种数。使用一个map来判断数的种类。遍历序列,如果当前数字在map中不存在,则将种类数sum加一;如果sum大于k,则将l向右移动一位,直到sum不大于k。每次更新完r之后,判断i-l+1是否大于等于y-x+1来更新答案。这种方法的时间复杂度为O(n)。 以上是两种解决CodeForces - 616D问题的方法。具体的代码实现可以参考引用\[1\]和引用\[2\]中的代码。 #### 引用[.reference_title] - *1* [CodeForces 616 D. Longest k-Good Segment(尺取)](https://blog.csdn.net/V5ZSQ/article/details/50750827)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Codeforces616 D. Longest k-Good Segment(双指针+map)](https://blog.csdn.net/weixin_44178736/article/details/114328999)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值