bzoj 1086 王室联邦 (dfs,构造)

2023-10-13 04:58
文章标签 构造 dfs bzoj 联邦 1086 王室

本文主要是介绍bzoj 1086 王室联邦 (dfs,构造),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:

思路:

     首先我们dfs,如果一个节点v的儿子u所在的子树大于等于B,那么就把这个子树当作一个省份,对于这种情况,省会是u,v其实都可以。如果一个儿子u所在的子树小于B,可以先暂存起来,继续遍历其他儿子,当暂存的数量大于等于B的时候,将暂存的都归为一个省,省会为v,因为会暂存的子树大小为B-1,所以这样产生的子树大小最大为2B-2,在处理完所有子树,就把v也加入到暂存的地方返回去,这里能看出,一个栈很适合处理这个过程。
    这样一路处理下来,只剩下一个问题,最后,我可能还剩下一个包含根节点的最大B-1个节点的暂存节点。因为我们之前说子树最大为2B-2,所以直接把剩下的暂存节点归到上一个省份里面即可(记得改省会)
    我们可以注意到,我们这样的分块其实只能保证块大小,不能保证连通性

错误及反思:

    有人说是树上莫队前置题目,主要是为了理解树上分块的大致思路。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 1100;
vector<int> son[N];
int n,b;
int ans[N],sh[N],tot=1;
stack<int> s;
void dfs(int now,int fa){int si=s.size();for(int i=0;i<son[now].size();i++){if(son[now][i]!=fa){dfs(son[now][i],now);//if(now==6) printf("#%d\n",s.size()-si);if(s.size()-si>=b){while(s.size()!=si){ans[s.top()]=tot;s.pop();}sh[tot++]=now;}}}s.push(now);
}
int main(){scanf("%d%d",&n,&b);for(int i=0;i<n-1;i++){int ta,tb;scanf("%d%d",&ta,&tb);son[ta].push_back(tb);son[tb].push_back(ta);}dfs(1,1);while(!s.empty()){ans[s.top()]=tot-1;s.pop();}sh[tot-1]=1;tot--;printf("%d\n",tot);for(int i=1;i<=n;i++) printf("%d ",ans[i]);puts("");for(int i=1;i<=tot;i++) printf("%d ",sh[i]);
}

这篇关于bzoj 1086 王室联邦 (dfs,构造)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

将一维机械振动信号构造为训练集和测试集(Python)

从如下链接中下载轴承数据集。 https://www.sciencedirect.com/science/article/pii/S2352340918314124 import numpy as npimport scipy.io as sioimport matplotlib.pyplot as pltimport statistics as statsimport pandas

PHP序列化用到的构造:__sleep() __wakeup()

串行化serialize可以把变量包括对象,转化成连续bytes数据. 你可以将串行化后的变量存在一个文件里或在网络上传输. 然后再反串行化还原为原来的数据. 你在反串行化类的对象之前定义的类,PHP可以成功地存储其对象的属性和方法. 有时你可能需要一个对象在反串行化后立即执行. 为了这样的目的,PHP会自动寻找__sleep和__wakeup方法.   当一个对象被串行化,PHP会

leetcode刷题(97)——106. 从中序与后序遍历序列构造二叉树

根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树: 3/ \9 20/ \15 7 看下后序和中序遍历的框架: void traverse(TreeNode root) {trave

leetcode刷题(97)——105. 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7 1.先回顾前序遍历和中序遍历的框架: void traverse(TreeNode root) {//

day16--513.找树左下角的值+112. 路径总和+106.从中序与后序遍历序列构造二叉树

一、513.找树左下角的值 题目链接:https://leetcode.cn/problems/find-bottom-left-tree-value/ 文章讲解:https://programmercarl.com/0513.%E6%89%BE%E6%A0%91%E5%B7%A6%E4%B8%8B%E8%A7%92%E7%9A%84%E5%80%BC.html 视频讲解:https://www

poj 1564 Sum It Up -- DFS 递归

题意:给一个数 t ,以及 n 个数,求 n 个数中的几个数加起来的和为 t 的情况有多少种。 注意:题目要求相同的组合方式不能出现2次,即 “3 4 1 1 1 1 ” 的结果为:“1+1+1”。 思路:一个  for  循环遍历一遍,每个 i 表示以当前数为起点开始一次DFS递归,当所遍历的和为 t 时,输出该组合方式,如果大于 t 则返回,小于则往下递归。以二维数组保存已经输出过的数据,

构造,析构,垃圾回收

构造函数 基本概念 在实例化对象时 会调用的用于初始化的函数 如果不写,默认存在一个无参构造函数 构造函数的写法 1.没有返回值 2.函数名和类名必须相同 3.没有特殊需求时,一般都是public的 4.构造函数可以被重载 5.this代表当前调用该函数的对象自己 class Person{public string name;public int age;//类中是允许自己

网易构造队列

#include<bits/stdc++.h>using namespace std;int main(){int T;cin>>T;while(T--){int n;cin>>n;vector<int>v;queue<int>Q;int i,j;for(i=0; i<n; i++)Q.push(i);while(!Q.empty()) //队列不空,执行循环{in

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-14模型构造

14模型构造 import torchfrom torch import nnfrom torch.nn import functional as F#通过实例化nn.Sequential来构建我们的模型, 层的执行顺序是作为参数传递的net1 = nn.Sequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256,10))"""nn.

Linux 内核权限提升漏洞CVE-2024-1086三种修复方法

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 一、漏洞概述 漏洞成因: Netfilter是Linux内核中的一个数据包处理模块,它可以提供数据包的过滤、转发、地址转换NAT功能。 2024年3月28日,监测到 Linux kernel权限