1592 C. Bakry and Partitioning

2024-04-12 18:38
文章标签 partitioning 1592 bakry

本文主要是介绍1592 C. Bakry and Partitioning,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意

有一颗树,问你能不能分成至少2个至多k个连通分量,并且每个连通分量的异或值都相同。

解析

设每个点的异或之和为xo

  1. 根据异或的性质,如果xo为0,那么说明可以分成两个区间,其两个区间的异或之和一定为0。
  2. 如果xo不为0,我们要分成m个区间,每个区间为xo,如果我们能分成10个区间,那么一定能分成8个区间,因为我们可以选择相邻的三个连通分量构成一个大连通分量,其异或值还是为xo,因此,我们最后分成的奇数个连通分量的最小值是3。
  3. 现在题目转化成,能不能分成3个连通分量,异或值相同。
  4. 思路很简单,dfs遍历每个点的所有子树,如果其自身和子树的异或之和为xo,那么就断链并且记录个数cnt++,断链的方式就是给父节点返回0。
  5. 如果最后cnt>=3 && k>=3 那么表示满足题意。

代码

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=1e5+5;
vector<int>g[N];
int r[N];
int xo=0,cnt=0;
void init(int n){xo=0;cnt=0;for(int i=0;i<=n;i++){g[i].clear();}
}
int dfs(int x,int pre){int son=r[x];for(int j:g[x]){if(pre!=j){son^=dfs(j,x);}}if(son==xo){son=0;cnt++;}return son;
}void solve(){int n,m;scanf("%d%d",&n,&m);init(n);for(int i=1;i<=n;i++){scanf("%d",&r[i]);xo=xo^r[i];}for(int i=1;i<n;i++){int a,b;scanf("%d%d",&a,&b);g[a].push_back(b);g[b].push_back(a);}dfs(1,1);if((cnt>=3 && m>=3) || xo==0){puts("YES");}else{puts("NO");}
}
int main() {int t ;scanf("%d",&t);while(t--){solve();}return 0;
}

这篇关于1592 C. Bakry and Partitioning的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/897921

相关文章

PostgreSQL分区表(partitioning)应用实例详解

https://www.jb51.net/article/97937.htm   PostgreSQL分区表(partitioning)应用实例详解  更新时间:2016年11月22日 10:25:58   作者:小灯光环    我要评论   这篇文章主要为大家详细介绍了PostgreSQL分区表(partitioning)应用实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

【UVA】11584-Partitioning by Palindromes(动态规划)

动态规划。 如果 j + 1 ~ i是回文,那么 dp[i] = min=(dp[j] + 1);  判断j + 1~ i是不是回文可以进行预处理,方法是枚举中心,之后向两边伸张,(需要枚举2次,一次是偶数回文,一次是奇数回文) 13993253 11584 Partitioning by Palindromes Accepted C++ 0.132 2014-08-05 08:2

【LeetCode】Palindrome Partitioning III

leetcode DP 深搜 回文串 1 Palindrome Partitioning 问题来源:Palindrome Partitioning 该问题简单来说就是给定一个字符串,将字符串分成多个部分,满足每一部分都是回文串,请输出所有可能的情况。        该问题的难度比较大,很可能第一次遇到没有思路,这很正常。下面我们一点点分析,逐步理清思路。先不考虑所有的情况,针对一个

lightoj 1044 Palindrome Partitioning(dp)

题意:给定字符串S,问可以划分的最小回文串数量 思路:定义dp[i]为以i开头的字符串中回文串的最小划分数. dp[i] = min(dp[j] + 1 | i <= j < n && S[i...j]是回文串) 边界,dp[i] = n-i+1. /************************************************ Author: fisty* Crea

**Palindrome Partitioning

题目: https://leetcode.com/problems/palindrome-partitioning/ Given a string s, partition s such that every substring of the partition is a palindrome. Return all possible palindrome partitioning

**Palindrome Partitioning II

题目: Given a string s, partition s such that every substring of the partition is a palindrome. Return the minimum cuts needed for a palindrome partitioning of s. For example, given s = "aab", R

uva 11584 Partitioning by Palindromes | dp

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=show_problem&problem=2631 算是刚开始认真做dp吧,觉得dp真的好神奇,而且在做之前的省赛题(浙江)时,总能发现一两道是dp。虽说这题是在看了别人的思路下写出来的,不过对我而言,还是益处很大的,写写博

PostgreSQL分区表(partitioning)应用实例

前言 项目中有需求要垂直分表,即按照时间区间将数据拆分到n个表中,PostgreSQL提供了分区表的功能。分区表实际上是把逻辑上的一个大表分割成物理上的几小块,提供了很多好处,比如: 查询性能大幅提升删除历史数据更快可将不常用的历史数据使用表空间技术转移到低成本的存储介质上 那么什么时候该使用分区表呢?官方给出的指导意见是:当表的大小超过了数据库服务器的物理内存大小则应当使用分区表,接

LeetCode 题解(152): Palindrome Partitioning

题目: Given a string s, partition s such that every substring of the partition is a palindrome. Return all possible palindrome partitioning of s. For example, given s = "aab", Return [["aa","

Partitioning by Palindromes UVA - 11584 (LIS/DP)

点下看看能不能打开:https://vjudge.net/problem/34398/origin 题目大意:输入小写字母字符串,然后分割成尽量少的回文串,例如:recacer本身就是回文串,fastcar只能分成7个,aaadbccb最少为3个为:aaa   d  bccb ps:紫书p275  ps:记得以前做过关于回文串的dp,那个是比较复杂的了,属于区间dp的。 对于这个题的话,要