首页 > 其他分享 >洛谷 P9479 - [NOI2023] 桂花树

洛谷 P9479 - [NOI2023] 桂花树

时间:2023-07-29 16:46:50浏览次数:40  
标签:洛谷 int NOI2023 P9479 某条 msk sim 树上 dp

显然,

  • 条件一等价于在 \(T'\) 中,\(1\sim n\) 组成的虚树等于它本身。

  • 条件二等价于 \(1\sim i\) 组成的虚树上点的标号不超过 \(i+k\)。

我们考虑在原树的基础上依次添加 \(n+1\sim n+m\) 这 \(m\) 个点。添加一个点 \(i\) 时,它与原树的位置关系可能有以下几种:

  • 挂在原树上某个点的下面。
  • 挂在原树上某条边的中间。
  • 原树上某条边分裂出一个编号比它大的点 \(j\),然后将 \(i\) 挂在 \(j\) 下面。

我们考虑,对于第三种情况,我们不直接将这样的 \(i\) 加入虚树,而是维护一个集合 \(S\),如果遇到这样的 \(i\),就往 \(S\) 中加入 \(i\),然后到扫描到 \(j\) 的时候再处理这样的 \(i\)。那么一个性质是,假设我们当前扫描到 \(i\)(还没处理加入 \(i\) 的贡献),那么 \(S\) 中的所有元素都必须 \(\ge i-k\)。这样可能的 \(S\) 只有 \(2^k\) 种。我们考虑 \(dp_{i,msk}\) 表示现在加入完 \(n+1\sim n+i\),\(\forall x\),\(x\in S\) 当且仅当 \(msk\) 的第 \(n+i-x\) 位为 \(1\)。那么我们考虑处理 \(i+1\) 时可能发生的转移:

  • \(i+1\) 挂在原树上某个点的下面,有 \(n+i+|S|\) 种可能,转移到 \(dp_{i+1,2·msk}\)。
  • \(i+1\) 挂在原树上某条边的中间,有 \(n+i+|S|-1\) 种可能,转移到 \(dp_{i+1,2·msk}\)。
  • \(i+1\) 作为上述第三种情况中某个“\(i\)“出现,有 \(n+i+|S|-1\) 种可能,转移到 \(dp_{i+1,2·msk+1}\)。
  • \(i+1\) 作为上述第三种情况中某个“\(j\)“出现,那么我们枚举它消灭掉的是哪个 \(i\),设为 \(x\),那么转移到 \(dp_{i+1,2(msk-2^x)}\)。

时间复杂度 \(Tmk2^k\)。

const int MAXP=1024;
const int MOD=1e9+7;
int n,m,k,f[MAXP+5],g[MAXP+5];
void add(int &x,int v){((x+=v)>=MOD)&&(x-=MOD);}
void solve(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=2;i<=n;i++)scanf("%*d");
	memset(f,0,sizeof(f));f[0]=1;
	for(int i=0;i<m;i++){
		memset(g,0,sizeof(g));
		for(int j=0;j<(1<<k);j++)if(f[j]){
			int tmp=j;
			while(tmp){
				int lw=tmp&(-tmp);tmp^=lw;
				if(((j^lw)<<1)<(1<<k))add(g[(j^lw)<<1],f[j]);
			}
			int c=n+i+__builtin_popcount(j);
			if((j<<1)<(1<<k)){
				add(g[j<<1],1ll*(c*2-1)*f[j]%MOD);
				add(g[j<<1|1],1ll*(c-1)*f[j]%MOD);
			}
		}swap(f,g);
	}printf("%d\n",f[0]);
}
int main(){
	int qu;scanf("%*d%d",&qu);
	while(qu--)solve();
	return 0;
}

标签:洛谷,int,NOI2023,P9479,某条,msk,sim,树上,dp
From: https://www.cnblogs.com/tzcwk/p/luogu-P9479.html

相关文章

  • NOI2023游记
    DAY-1到达NOI赛场成都七中!太美丽了成七哎呦,这不考场吗乐!来成七报道,各种拍照领资料,折腾半天才到寝室。宿舍没有电梯(拎箱子累死我了),差评空调吹完还是好热,差评床好小虽然只是正常寝室床大小,差评晚上折腾半天终于睡着了DAY0这一天我们开始了万众瞩目的开幕式,然而年轻的......
  • NOI2023游记
    凡事有最后一次,就会有第一次。这个赛季,我第一次以正式选手参加NOIP,第一次参加联合省选,第一次进入浙江省队,第一次参加NOI。第一次和别人交换徽章,尽管认识的人不多;第一次Day2翻盘,尽管翻得不是很彻底;第一次拿到了真正意义上的牌子,尽管心有不甘。谁也不知道这第一次是否会是最后......
  • NOI2023 退役记
    Day-1和我校好多同学一起乘坐很久没坐过的飞机抵达了成都。在换徽章活动中和不少OIer交换了徽章:c03订的\(25\)个徽章很快就换完了,接着我订的\(40\)个徽章换完了,不久Linshey订的\(70\)个徽章也都换完了。不久前的福建省队集训出了两道群论题都不会,所以这几天都在做......
  • 洛谷P4407 电子词典
    读完这题我马上就想到了题解trie+dfs的爆搜解法,这种解法思维难度很低,算个模拟,很容易想到但是我们稍微计算一下复杂度,就可以发现达到了\(1e8\)级别(\(26*20*20*1e4\),即对于每一个待查字符串(\(1e4\)),枚举每一个位置(\(20\)),每一个位置枚举26个字母(\(26\)),然后再在trie树上匹配(\(20\)))害......
  • NOI2023 翻盘记
    DAY-1(2023.7.22)早上五点半起床赶飞机,是一个人坐飞机哦。飞机晚起飞了四十分钟,但是坐飞机太好玩啦!落地后我跟着接机大巴到了成都七中,但是教练还没到,没法签到,只能先拿着饭票去吃饭。吃过午饭教练到了,结果学籍卡有问题,还是不给签,没绷住。其他同学陆陆续续到了。我在门口的房......
  • NOI2023 游记
    对于大部分OIer而言,能在短暂又漫长的竞赛生涯中参加一次神圣的NOI是一件无上光荣的事。记得省选Day1考完后,因审题问题而T1挂零的我在酒店里痛哭不止,那时我就说,能到NOI一游,我的OI生涯便无憾了。历经四个月的摸爬滚打,凭借一张阴差阳错拿到的入场券,我带着残存的一点朝气、不多的脑子......
  • The Final —— NOI2023
    终于到这一天了。Day0试机的时候讲了有SelfEval这个东西,很好啊!CCF终于愿意改善一点选手参赛体验了。笔试AK了。非常相信日报“不必担心睡不着,因为国赛不可能使人睡着”,似乎睡的还可以?Day1进场看题。T1不是扫描线板子吗?斜线就爆枚一下就行,比去年还简单?T2感觉没啥......
  • 洛谷 P1347 排序 - 拓扑排序
    P1347排序题意依次给一些具有排序关系的序列,问你在能否在若干个序列之后确定元素的顺序、判断元素关系存在矛盾、判断无法确认元素顺序思路对于每一个排序关系均进行toposort,后面就是toposort判环(出现矛盾),toposort判顺序,无法确认唯一关系。详见代码或看洛谷题解区代码......
  • NOI2023 最后一战记
    7.20出发!似乎南京天气不太好,本来18:50的航班延误到22:20,最后只能在机场干等三小时。飞机到1:00才到目的地,合着算两点多才找到地方住。7.21上午继续补题解,晚上来了点小小的川菜震/撼。睡觉前打generals.io1v1碰到了Kubic,和他打了半个小时左右就睡了。7.22上午实在......
  • noi2023 游记
    ?~7.1学考。7.2晚上打了把arc。F原题过了。找了一整场E的规律,最后找出来一个奇怪的东西/oh。7.3联考是我的模拟赛。去武汉。7.4早上模拟赛t1跑两次km没清空,t3没写完。晚上感觉很困,想先去开场div2练练手。先打开了个div2的f,看了会儿突然发现怎么d2F=d1D!!于......