codeforces Round#332Div2 题解

codeforces Round#332Div2

AB

签到题

比较激动,纷纷WA了一发。

C

  • 把数组h复制给a,然后对a数组排序。
  • ha数组,求前缀和,有多少个位置满足\(\sum a[i] = \sum h[i]\), 就最多能分成多少块。

D

  • 我们枚举更短的那条边,这样的边不会太多。
  • 然后求,更长的那条边。

E

符合xxx限定条件的图的计数问题。数据范围很状压。

我们用dp[mask][root]表示,集合mask里的点,以root为根,不违背限定条件的方案数。

接下来考虑dp[mask][root]是怎样转移而来的。

x为集合mask - {root}中最小的元素。

枚举包含元素xmask的子集newmask作为root的一棵子树。
然后我们可以在newmask中选择一个根newroot.

接下来我们判断,枚举的newmask,newroot是否合法。

对于一条已知的边。

  • u!=root,v!=root,如果unewmask中,v不在newmask中,则不合法。
  • root相连的,且在newmask中的点,至多只有一个【root最多只能和newmask中的一个点相连】。如果恰有一个,那么这个点就是newroot, 如果没有,那我们就枚举newroot

对于一组已知的LCAlca(a,b)=c

  • 如果c=root,a,b都在newmask中,不合法。
  • 如果cnewmask中,a,b有一个不在newmask中就GG了。因为这样的话,cnewmask对应的子树里面,a,b至少有一个在newmask子树外面。

对于合法的newroot,newmask

\(dp[mask][root] = \sum dp[newmask][newroot]*dp[mask-newmask][root]\)

原文地址:https://www.cnblogs.com/RUSH-D-CAT/p/9736154.html

时间: 2024-08-24 10:21:15

codeforces Round#332Div2 题解的相关文章

Codeforces Round #541 题解

codeforces Round #541 C 题意 给你100个人,让你将它们围成一个圆,使得:"任意相邻的两人身高差的绝对值" 中的最大值 最小 题解 显然的构造方法:先排序,让所有人1 2 报数,报2的出列,排尾变排头接到报 1 的原队列后面 证明: 显然这样的构造方法保证身高差最大为 max{(a[i+2]-a[i]) }(i=1..n,环状,a[i]升序): 我们可以说明对于任意的i,身高差至少为(a[i+2]-a[i]), 如果我们将每个人看成一个点,相邻关系看成一条无向边

CFEducational Codeforces Round 66题解报告

CFEducational Codeforces Round 66题解报告 感觉丧失了唯一一次能在CF上超过wqy的机会QAQ A 不管 B 不能直接累计乘法打\(tag\),要直接跳 C 考虑二分第\(k\)小的值 那么问题就变成了 每一个数变成了\([x-mid,x+mid]\)的一段区间,如果有一个位置被覆盖了超过\(k\)次 那么\(mid\)一定合法 类似括号匹配 每次碰到左端点就贡献+1 右端点就统计答案然后-1 维护答案的同时顺便维护位置就好了 #include<cstdio>

Codeforces Educational Codeforces Round 54 题解

题目链接:https://codeforc.es/contest/1076 A. Minimizing the String 题意:给出一个字符串,最多删掉一个字母,输出操作后字典序最小的字符串. 题解:若存在一个位置 i 满足 a[i] > a[i+1],若不删除 a[i] 则后续操作不可能更优. 1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define ull unsigned

Educational Codeforces Round 55 题解

题解 CF1082A [Vasya and Book] 史上最难A题,没有之一 从题意可以看出,翻到目标页只有三种办法 先从\(x\)到\(1\),再从\(1\)到\(y\) 先从\(x\)到\(n\),再从\(n\)到\(y\) 直接从\(x\)到\(y\) 三种的必要条件分别是 \((y-1)\mod d \equiv 0\) \((n-y)\mod d \equiv 0\) \(|x-y|\mod d \equiv 0\) 所以如果上面三种都不满足的话就输出\(-1\) 不然就取最小的输出

Codeforces Round 596 题解

万幸的是终于碰上了一场上分好场. 不幸的是一开始差点不会 A. 万幸的是想了个不那么稳的结论过了 pretest. 不幸的是罚时很高,而且慌得一比. 万幸的是然后半个小时内把 B 和 C 码了. 不幸的是然后就只能看着排名一点一点掉了. 万幸的是最后 A 没被叉掉. 不幸的是我居然没敢去叉人. 万幸的是我就是叉了 10 个人排名也不会上涨超过 5. 不幸的是我每掉一名都会少涨两三分. 万幸的是我没去打隔壁的 ZR. 不幸的是我发现这场 ZR 我一题不会,打了就会掉分-- 2A 没仔细想,但是应该

Codeforces Round #616 题解

A题 我们注意到如果存在两个奇数,那么就能满足题目条件,所以我们就从头寻找两个奇数,没有的话就是无解 #include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<vector> #include<string> #include<cstring> #include<map> using namespace st

Codeforces Educational Codeforces Round 57 题解

传送门 Div 2的比赛,前四题还有那么多人过,应该是SB题,就不讲了. 这场比赛一堆计数题,很舒服.(虽然我没打) E. The Top Scorer 其实这题也不难,不知道为什么这么少人过. 考虑枚举那人的分数和有多少人和他同分,推一下就会发现我们只需要知道\(calc(sum,n,top)\)表示\(sum\)分,分给\(n\)个人,分数小于\(top\),的方案数. 好像不是很好直接搞,考虑容斥,枚举一下至少有几个人不满足条件即可. #include<bits/stdc++.h> na

Codeforces Round 564 题解

很抱歉让标题把您骗进来了. 这是一场打得最失败的div1. 作为一个橙名一题都不会…… 旁边紫名的PB怒切3题,div2的也随便玩玩出了div1b/div2d…… 这名字颜色也太有水分了. 也就只会2A和2B了,写一写吧. 2A 水题.代码咕,也会一直咕下去. 2B 简单构造. 首先发现 $|r_1-r_n|+|c_1-c_n|\ge n-1$.那么令 $r_1=c_1=1,r_n=\lfloor\frac{n}{2}\rfloor,c_n=\lceil\frac{n}{2}\rceil$ 时

Codeforces Round #612题解

A题 只需要找到A中后面跟的最长的p串是几个即可 #include<iostream> #include<cstring> #include<string> #include<map> #include<vector> #include<cstdio> using namespace std; int main(){ int t; cin>>t; string s; int n; int i; while(t--){ ci