CF1481F AB Tree 题解

技术CF1481F AB Tree 题解 CF1481F AB Tree 题解Link.
Codeforces
Luogu
Description.
给定 \(n\) 个点的树,\(1\) 是根,染出

CF1481F AB树题解

Link.

题目泛做解题报告许昊然

洛古

Description.

给定\(n\)个点的树,\(1\) 是根,染出\(k\)个白点\(n-k\)个黑点。

求出最少的本质不同的从根走到某个节点连成的字符串数,并构造。

Solution.

首先考虑没有\(k\)的限制,肯定每层染相同。

那么最小值肯定是\(\ max \\ text { dep } _ I \ })。

考虑最大值,发现最大可能是\(\ max \\ text { dep } _ I \ { 1 \ }),证明参考下文构造。

所以直接背包判断最大值是不是\(\ max \\ text { dep } _ I \ } \),是就直接背包输出方案,否则就用另一种方法构造。

但是朴素背包是\(O(\frac{n^2}\omega)\)的,空间都开不下。

但是本质不同的数量是\(O(\sqrt n)\)的,优化成了\(O(\ sqrt n \ log n \ frac { n } {})\)。

看上去很能过,就写了。

然后构造的话就直接按层构造,然后把叶子非叶子分开。

然后最左边、最上面全都染成黑色,否则染成白色。

考虑证明,分界点如果在叶子节点中,证明显然,否则证明显然。

然后就做完了。

Coding.

点击查看代码//是啊,你就是那只鬼了,所以被你碰到以后,就轮到我变成鬼了{{{

#包括ebit/stdc .h

使用命名空间标准;typedef长ll长

模板类型名Tinline无效读取(T x)

{

x=0;char c=getchar(),f=0;

for(;c48 | | c57c=getchar()) if(!(c^45)f=1;

for(;c=48c=57c=getchar())x=(x1)(x3)(c^48);

FX=-x : x;

}

templatetypename T,typename.Linline void read(T x,L.l) {read(x),read(l.);}//}}}

const int N=100005int n,K,rr[N],idt,rrt,vs[N],rs[N],dg[N];

bitsetNdp[5266];向量v[N],cn[N],id[N],e[N],VI;

线内无效拉动(int nw,int vl)

{

if(nw==0)返回;否则if(dp[nw-1][vl])拉(VL西北一区);

否则rr[ rrt]=nw,pull(nw-1,VL-VI[NW-1]);

}

内联空dfs(int x,int d) {v[d].push _ back(x);对于(auto y:e[x]) dfs(y,d 1),dg[x],dg[y];}

int main()

{

read(n,K),DP[0][0]=1;int mxd=0;for(int i=2,x;I=n;(一)读(x),e[x].push _ back(I);//dep出现次数

dfs(1,1);for(int I=1;I=n;(一)如果(!.空的,空的.size()].push_back(i),mxd=I;//出现次数次数

for(int I=1;I=n;(一)如果(!cn[i].empty())//相当于多重背包的元素

{

int cnt=cn[i].size(),gg=0,NW=1;

for(;ggcntgg=nw,nw=1)

{

idt,vi.push_back(i*min(nw,CNT-gg));//第建立个背包里的所有资料执行防止

for(int j=gg;jcntjgg西北;(j)身份证.push _ back(cn[I][j]);

}

}

for(int I=1;I=idtI)DP[I]=DP[I-1]|(DP[I-1]VI[I-1]);

int wh=0;for(int I=K;I=0;I-)if(DP[IDT][I]){ wh=I;打破;}

pull(idt,wh);for(int I=1;I=RRti)for(auto x : id[RR[I]])vs[x]=1;

if(wh==K)

{

printf('%d\n ',mxd);

for(int I=1;I=n;i ) if(vs[i])为(自动w :v[I])RS[w]=1;

for(int I=1;I=n;I)放入char(' b '-RS[I]);

返回putchar('\n '),0;

}else printf('%d\n ',mxd 1);

int fg=1,x=K,y=n-K;for(int I=1;I=n;(一)

{

分类开始,开始.end(),[](int a,int b){ return DG[a]DG[b];});

xyswap(x,y),fg^=1:0;for(size _ t j=0;合资企业.size();j)

rs[v[i][j]]=fg,x -,(!xswap(x,y),fg^=1:0);

}

for(int I=1;I=n;I)放入char(' b '-RS[I]);

返回putchar('\n '),0;

}

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/37481.html

(0)

相关推荐

  • jquery中如何增加子节点

    技术jquery中如何增加子节点这篇文章主要讲解了“jquery中如何增加子节点”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“jquery中如何增加子节点”吧!

    攻略 2021年11月16日
  • 抖音刷人气,网页版抖音刷人气平台?

    技术抖音刷人气,网页版抖音刷人气平台?代刷平台点击网址即可直接进入,这是国内首家支持人工刷抖音粉丝、抖音双击、抖音播放量、抖音上热门的网站,有兴趣的就来试试吧!小编我的收听量都是在这刷的,安全、靠谱、价格也便宜!强烈推荐

    测评 2021年11月11日
  • 有哪些Go加密解密算法

    技术有哪些Go加密解密算法这篇文章主要讲解了“有哪些Go加密解密算法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有哪些Go加密解密算法”吧!md5MD5信息摘要算法是一

    攻略 2021年10月27日
  • 渗的组词,2021年琥珀课文的生字组词

    技术渗的组词,2021年琥珀课文的生字组词2021年《琥珀》课文的生字组词渗的组词:怒(nù),怒火、怒吼、怒骂、怒斥、发怒、怒气冲冲、怒发冲冠、怒目而视。吼(hǒu),吼叫、怒吼、一声吼。
    脂(zhī),油脂、胭脂、脂

    生活 2021年10月24日
  • 如何使用mysqldump备份异机恢复数据库

    技术如何使用mysqldump备份异机恢复数据库这篇文章给大家分享的是有关如何使用mysqldump备份异机恢复数据库的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用mysqldump备份异

    攻略 2021年11月2日
  • 智能机怎么刷机,nokla智能机怎么刷机

    技术智能机怎么刷机,nokla智能机怎么刷机有两种刷机。1软刷:恢复出厂设置 2硬刷:(个人不建议)刷机前要备份好重要数据像手机号码什么的 。下面是硬刷过程(搜索粘贴的)  一、准备  1、下载navifirm  2、下

    生活 2021年10月22日