令$a_{i}$为$i$的度数-1,那么$(x,s)$合法即等价于存在$S\subseteq [1,n],|S|=x$且$\sum_{k\in S}a_{k}=s$

引理:$(x,s)$合法的必要条件为$-z\le s-x\le z-2$

令$z$为$a_{i}$中为0的元素个数,考虑任意一个集合$S\subseteq [1,n]$,显然$-z\le \sum_{k\in S}a_{k}-|S|\le z-2$

具体的,考虑该式即为$\sum_{k\in S}(a_{k}-1)$,那么将所有$a_{k}<1$的项求和即为最小值,将所有$a_{k}\ge 1$的项求和即为最大值,不难发现前者即为$-z$,后者即为$\sum_{i=1}^{n}a_{i}-(n-z)=z-2$

不难发现,其所描述的即为该引理,也即得证

结论:令$mn(s)=\min_{(x,s)合法}x$和$mx(s)=\max_{(x,s)合法}x$,则$\forall mn(s)\le x\le mx(s),(x,s)$合法

(为了方便,若不存在$(x,s)$合法则定义$mn(s)$和$mx(S)$为$\pm\infty$,显然此时满足结论)

同样令$z$为$a_{i}$中为0的元素个数,显然$mn(s)$对应的方案必然一个0都不选,那么在其基础上再选$[0,z]$个0,即有$\forall mn(s)\le x\le mn(s)+z,(x,s)$合法

类似地,也可以得到$\forall mx(s)-z\le x\le mx(s),(x,s)$合法

由引理即有$mx(s)-mn(s)\le 2z-2$,因此两者区间相交,也即得证

由此,问题即$\forall s$求$mn(s)$和$mx(s)$,这个问题可以dp解决

具体的,(以$mn(s)$为例)令$f_{s}$为对应的答案,则$f_{s}=\min(f_{s},f_{s-a_{i}}+1)$

进一步的,将其对每一种物品(指相同的$a_{i}$)一起处理,假设有$x$个$a_{i}=k$,枚举$s$上选择的$k$个数,即可得到转移为$f_{s}=\min_{0\le i\le x}(f_{s-ik}+i)$,不难用优先队列$o(1)$求出后者

注意到物品种类数至多为$\sqrt{n}$,因此总复杂度为$o(n\sqrt{n})$,可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 #define ll long long
5 int n,x,y,l,r,a[N],tot[N],q[N],mx[N],mn[N],f[N];
6 ll ans;
7 int main(){
8 scanf("%d",&n);
9 memset(a,-1,sizeof(a));
10 for(int i=1;i<n;i++){
11 scanf("%d%d",&x,&y);
12 a[x]++,a[y]++;
13 }
14 for(int i=1;i<=n;i++)tot[a[i]]++;
15 memset(mn,0x3f,sizeof(mn));
16 memset(mx,-0x3f,sizeof(mx));
17 mn[0]=0,mx[0]=tot[0];
18 for(int i=1;i<=n;i++){
19 if (!tot[i])continue;
20 for(int j=0;j<i;j++){
21 l=1,r=0;
22 for(int k=j;k<=n;k+=i){
23 while ((l<=r)&&(mn[k]-k/i<=mn[q[r]]-q[r]/i))r--;
24 q[++r]=k;
25 while ((l<=r)&&(q[l]/i<k/i-tot[i]))l++;
26 f[k]=mn[q[l]]+(k-q[l])/i;
27 }
28 }
29 memcpy(mn,f,sizeof(f));
30 }
31 for(int i=1;i<=n;i++){
32 if (!tot[i])continue;
33 for(int j=0;j<i;j++){
34 l=1,r=0;
35 for(int k=j;k<=n;k+=i){
36 while ((l<=r)&&(mx[k]-k/i>=mx[q[r]]-q[r]/i))r--;
37 q[++r]=k;
38 while ((l<=r)&&(q[l]/i<k/i-tot[i]))l++;
39 f[k]=mx[q[l]]+(k-q[l])/i;
40 }
41 }
42 memcpy(mx,f,sizeof(f));
43 }
44 for(int i=0;i<=n;i++)ans+=max(mx[i]-mn[i]+1,0);
45 printf("%lld\n",ans);
46 return 0;
47 }

[atARC125F]Tree Degree Subset Sum的更多相关文章

  1. Solution -「ARC 125F」Tree Degree Subset Sum

    \(\mathcal{Description}\)   Link.   给定含有 \(n\) 个结点的树,求非负整数对 \((x,y)\) 的数量,满足存在 \(\exist S\subseteq V ...

  2. [leetcode]Binary Tree Maximum Path Sum

    Binary Tree Maximum Path Sum Given a binary tree, find the maximum path sum. The path may start and ...

  3. 【leetcode】Binary Tree Maximum Path Sum

    Binary Tree Maximum Path Sum Given a binary tree, find the maximum path sum. The path may start and ...

  4. 26. Binary Tree Maximum Path Sum

    Binary Tree Maximum Path Sum Given a binary tree, find the maximum path sum. The path may start and ...

  5. Subset sum problem

    https://en.wikipedia.org/wiki/Subset_sum_problem In computer science, the subset sum problem is an i ...

  6. Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum. For example: Given the below binary tree andsum =

    Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...

  7. 动态规划法(三)子集和问题(Subset sum problem)

      继续讲故事~~   上次讲到我们的主人公丁丁,用神奇的动态规划法解决了杂货店老板的两个找零钱问题,得到了老板的肯定.之后,他就决心去大城市闯荡了,看一看外面更大的世界.   这天,丁丁刚回到家,他 ...

  8. leetcode 124. Binary Tree Maximum Path Sum 、543. Diameter of Binary Tree(直径)

    124. Binary Tree Maximum Path Sum https://www.cnblogs.com/grandyang/p/4280120.html 如果你要计算加上当前节点的最大pa ...

  9. Partition Equal Subset Sum

    Given a non-empty array containing only positive integers, find if the array can be partitioned into ...

随机推荐

  1. 前段之jQuery

    一.jQuery介绍 jQuery是一个轻量级的.兼容多浏览器的JavaScript库. jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方便地进行Ajax交 ...

  2. 题解 CF736D Permutations

    link Description 现在,你有一个二分图,点数为 \(2n\). 已知这个二分图的完备匹配的个数是奇数. 现在你要知道,删除每条边后,完备匹配个数是奇数还是偶数. \(1\le n\le ...

  3. 题解 [HNOI/AHOI2018]毒瘤

    题目传送门 题目大意 给出一个 \(n\) 个点 \(m\) 条边的无向图,问有多少个点集满足点集中任意两点均不存在边相连. \(n\le 10^5,m-n\le 10\),答案对 \(9982443 ...

  4. SimpleDateFormat、Date和String互转

    今天在修改bug时遇到一个查询异常:根据时间段查询的时候,如果查询时间段含12点钟,那么能查到时间段之外的其他数据: 跟踪了数据流动发现,前同事写的程序中,有一处是讲前端传来时间字符串转为Date的一 ...

  5. Selenium获取动态图片验证码

    Selenium获取动态图片验证码 关于图片验证码的文章,我想大家都有一定的了解了. 在我们做UI自动化的时候,经常会遇到图片验证码的问题. 当开发不给咱们提供万能验证码,或者测试第三方网站比如知乎的 ...

  6. 【UE4 C++ 基础知识】<10>资源的引用

    2种引用方式 硬引用(Hard Reference) 即对象 A 引用对象 B,并导致对象 B 在对象 A 加载时加载 硬引用过多会导致运行时很多暂时用不到的资源也被加载到内存中 大量资源会导致进程阻 ...

  7. 【二食堂】Beta - Scrum Meeting 8

    Scrum Meeting 8 例会时间:5.22 20:00~20:10 进度情况 组员 当前进度 今日任务 李健 1. UI优化已经完成,顺带修复了一点小bug.issue 1. 文本导入.保存部 ...

  8. QEvent

    QEvent类是所有事件类的基类,每一个对象都包含事件参数.Qt的主事件循环(QCoreApplication::exec())从事件队列中接收本地窗口系统的事件,并将它们翻译成QEvent,将这些事 ...

  9. 你一定不知道的Unsafe用法

    Unsafe是什么 首先我们说Unsafe类位于rt.jar里面sun.misc包下面,Unsafe翻译过来是不安全的,这倒不是说这个类是不安全的,而是说开发人员使用Unsafe是不安全的,也就是不推 ...

  10. DDD领域驱动设计架构模式:防腐层(Anti-corruption layer)

    在微服务(Microservices)架构实践中,架构设计借用了DDD中的一些概念和技术,比如一个微服务对应DDD中的一个限界上下文(Bounded Context):在微服务设计中应该首先识别出DD ...