首页 > 其他分享 >P8867 [NOIP2022] 建造军营

P8867 [NOIP2022] 建造军营

时间:2023-09-22 21:45:23浏览次数:47  
标签:方案 连通 连通性 不选 儿子 P8867 军营 NOIP2022

这道题想了很久,终于想出来了,非常抽象。

经过一番无脑推导,我们发现u里面有没有军营,是否与根连通,u的子树有没有军营,……都对方案数有影响,然后我就一直修修改改,事实证明,当发现越来越多题目条件中被忽略的细节时,一定不要嫌麻烦,要从头开始设置状态。

首先我们发现,子树中有没有军营对于与子树相连的边选不选是有影响的,也就是说对状态多了一个限制:有没有军营。

然后就会想:子树如果没有军营,儿子边可选可不选;有军营,就一定要选……等等,一定要选吗?如果只选了一个儿子,而且u没有军营的话,其实是可以不选的,然后我尝试加加减减乘乘除除。然后你会发现,子树有军营,但是没和v连在一起,就算儿子边选了,u和军营还是不连通,……根本算不出来……于是整理一下思路。

我们注意到,dp难以转移的关键在于子树中军营与u的连通性(只选一个儿子,可以不连通,选了多个儿子,又一定要连通)。

  1. 如果子树中恰好只有一个儿子v,T(v)中有军营,那么它与u是否连通是无所谓的。

  2. 如果子树中有超过两个儿子v,T(v)中都有军营,那么它们就一定要与u连通(也就一定要与v连通)。

考虑T(v),此时多了一个限制条件,即“T(v)中的军营与v是否连通”。

f(u,0)表示没有军营的方案数。
f(u,1)表示有军营,并且军营与u连通的方案数。
f(u,2)表示有军营,并且军营与u不连通的方案数。

由于每次分类是不重不漏的,所以答案就是有军营的方案,也就是有军营、连通或有军营、不连通的和,即f(u,1)+f(u,2)。

考虑转移(记u到儿子的边为儿子边):

f(u,0):因为T(u)都没有军营,(其实可以用公式算,但是我懒),所以每个儿子都一定不选,而且儿子边选也可以,不选也可以,所以就是每个2*f(v,0)乘起来,最后乘上u自身的方案(没有军营,方案等于点的方案乘上边的方案,也就是\(1\times 2^{cnte(u)}\))。

f(u,1):先考虑单个儿子v,如果T(v)里面有军营(注意,不是v里面有军营,这也是之前推错的原因),那么它一定要和u连通,也就是边一定选:1*f(v,1);如果T(v)没有军营,那么边可选可不选,也就是2f(v,0),注意到这里是分类,所以用加法原理,每个子树的方案就是 \(f(v, 1) + 2f(v, 0)\)。

自然地想到,每个儿子用乘法原理乘起来就行了,最后再乘上u的方案即可。

这里重点来了:每次写完转移之后,都要考虑这样转移是否充要。上述写法就是说:所有儿子,要么选并且连通,要么不选的方案数。而这样的集合里面有没有军营的方案数,而状态定义中是要求一定要有军营的,所以要减去多出来的方案。

我们会发现,全部不选,也就是u不选点,儿子也不选点,那么也就是T(u)没有军营,那不就是f(u,0)么?

所以减去f(u,0)就行了。

f(u,2):同样,考虑单个儿子v,……

然后你就会发现方案数统计多了,这时候把所有方案画出来,一一与题设比对,找出不合法的方案,并将其剔除。

于是我们发现,如果军营不与u连通,那么只能有一个子树有军营。(不然两个军营之间没有保护的边,不符合题意)。

所以我们枚举这个有军营的儿子,其它儿子都没有军营,儿子边自然是可选可不选。因为这个有军营的儿子与u不相连,考虑儿子边的选法:选,则v和u相连了,军营不能和v连通,所以是f(v,2);不选,则v和u不相连,那么军营和v连不连通就无所谓了,所以是f(v,2)+f(v,1)。合起来就是2f(v,2)+f(v,1)。其它儿子都不能选,那么用一个累乘和逆元搞一下就行了。

上述选法会统计恰好一个子树有军营,且与u不连通的方案数,符合状态设计。

然后就拿下啦!

CODE

总结一下:

  1. 推导的时候,肯定会逐渐发现一些没有注意到的题目细节要求,当细节越来越多,状态会越来越乱,此时要重新定义状态。
  2. 列出所有发现的要求,列出来,抽象概括出若干个能够符合所有要求的根本要求,比如本题的根连通性和是否有军营。
  3. 然后根据每一个要求,依次分类讨论,其实本来是要有4类的,但是因为没有军营就不需要考虑连通性了(都没有点哪来连通性问题),所以本题只有3个状态。
  4. 推出式子之后记得返回去检查这样统计出来的方案数是否充要。
  5. 树形DP,可以先考虑每一个儿子,然后推出一个必要条件的方案数(每一个儿子都必须这样),然后再剔除不合法的方案(其实几乎所有情况都是状态定义中有要求至少XXX,但是求出来的情况包括了全部都没有的情况)。

标签:方案,连通,连通性,不选,儿子,P8867,军营,NOIP2022
From: https://www.cnblogs.com/zhangchenxin/p/17723410.html

相关文章

  • 【22NOIP提高组】建造军营(barrack)
    include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constllM=1e9+7;llfast_pow(lla,llb){llres=1;while(b>0){if(b&1)res=(resa)%M;;a=(aa)%M;b>>=1;}returnres;}constintN=6e5+5;intn,m;structEdge{intu,......
  • P8868 [NOIP2022] 比赛
    https://www.luogu.com.cn/problem/P8868我学会了历史和!在一阵扫描线过后,你会发现,\([l,r]\)的所有子区间的答案,就一定是扫到\(i\)的时候,加上\([k,i]\)的答案,\(k\lei,i\in[l,r]\),然后又因为只有当\(i\gel\)的时候,才能对左端点在\([l,r]\)的答案贡献,因此,你会发现这个东......
  • 【题解】NOIP2022
    怎么看T3也不是那么难,可是为啥赛时就是被卡死了[难过]不补\(B\)题了,ad-hoc。A.种花题目描述:小C决定在他的花园里种出\(\texttt{CCF}\)字样的图案,因此他想知道\(\textttC\)和\(\textttF\)两个字母各自有多少种种花的方案;不幸的是,花园中有一些土坑,这些位置无法种......
  • CSP&NOIP2022游记
    今年是最后一年了,真的是来划水的了已经无欲无求了,只是最好能有个七级吧,要是没有也无所谓,反正我自始至终都是个OI废物已经完全回归whk咯谢幕之战,你会变好,还是更烂?冷知识:从去年CSP结束至今,Bosun在LG上只做了9题初赛前一天住了旅馆,周边玩了一下,感觉苏州古城区真的是一点意思也......
  • 【游记】NOIP2022 游记
    updateon:2023.6.7名字回归正常了,说明没有大寄。Day0具体细节忘记了,就迷迷糊糊地到了酒店(司机倒车技术不错)。晚上又跟lzh,fj,xwk,玩generals.io。2V2,我跟lzh一队,不知道玩了多少把,一直都是我们赢,他们心态直接崩了,不跟我们玩了。发现时间已经21:00,赶紧复习模板,发现还有......
  • [NOIP2022] 比赛
    \(\mathcalLink\)大半年前,我在没有难题的NOIP大败而归,以一个耻辱的分数。注意到询问具有分治性。考虑类似线段树一样拆分询问,然后考虑跨过\(\textit{mid}\)的子区间贡献。对于一个固定的\(r\),考虑\(l\)的贡献。记\(f\),\(g\)分别代表\(A\)和\(B\)对应区间的最值......
  • NOIP2022游寄
    挂大分+考试失误(还是食力不够/kk)\(Day\)-\(114514\)至\(Day\)-\(1\)whk+口胡题目+Water(大部分时候都是Water)。\(Day0\)一整天都在疯狂打板子。图论打了\(5,6\)个,数据结构\(5,6\)个,数论\(10\)多个。网课关了摄像头就是水。晚上被很多\(dalao\)祝福,希望rp++。躺......
  • 「回忆录」NOIP2022游寄
    都已经过去半年了才来更的屑距离CSP还有一周左右的时间,我们停课了,然后来了东校。Al:“为了庆祝我们在一起学习,下午我们考试!”???好像就呆了\(1\)天半,因为疫情,我们要提前出发去日照,然后中午家长们紧急把东西送来,Al跑回一区把ycc和zxs接来,三区的wxf和fjh下午也来了,然......
  • NOIP2022 简要题解
    前言作为一名退役OIer,借着此比赛来复健。大部分题目都是口胡(没啥好写的),spj题手写了代码,A了。难度不算特别高,但是赛场上拿到高分略有压力(退役了可以瞎bb)。个人认为应该......
  • NOIP2022游记
    NOIP2022游记今年是第二次考NOIP了,去年第一次考的时候没学过什么东西,混了个省二。今年以高中生的身份考,不仅仅是要省一,还得拿个不错的名次,任务不小。考试当天早上校园里......