题目描述

You are given a tree with $ n $ nodes. For each node, you either color it in $ 0 $ or $ 1 $ .

The value of a path $ (u,v) $ is equal to the MEX $ ^\dagger $ of the colors of the nodes from the shortest path between $ u $ and $ v $ .

The value of a coloring is equal to the sum of values of all paths $ (u,v) $ such that $ 1 \leq u \leq v \leq n $ .

What is the maximum possible value of any coloring of the tree?

$ ^{\dagger} $ The MEX (minimum excluded) of an array is the smallest non-negative integer that does not belong to the array. For instance:

  • The MEX of $ [2,2,1] $ is $ 0 $ , because $ 0 $ does not belong to the array.
  • The MEX of $ [3,1,0,1] $ is $ 2 $ , because $ 0 $ and $ 1 $ belong to the array, but $ 2 $ does not.
  • The MEX of $ [0,3,1,2] $ is $ 4 $ because $ 0 $ , $ 1 $ , $ 2 $ , and $ 3 $ belong to the array, but $ 4 $ does not.

输入格式

Each test contains multiple test cases. The first line of input contains a single integer $ t $ ( $ 1 \le t \le 10^4 $ ) — the number of test cases. The description of test cases follows.

The first line of each test case contains a single integer $ n $ ( $ 1 \le n \le 2 \cdot 10^5 $ ) — the number of nodes in the tree.

The following $ n-1 $ lines of each test case contains $ 2 $ integers $ a_i $ and $ b_i $ ( $ 1 \leq a_i, b_i \leq n, a_i \neq b_i $ ) — indicating an edge between vertices $ a_i $ and $ b_i $ . It is guaranteed that the given edges form a tree.

It is guaranteed that the sum of $ n $ across all test cases does not exceed $ 2 \cdot 10^5 $ .

考虑 dp。

正着dp 不好做,先设所有的路径的 mex 都是 2,然后减去不为 2 的路径的贡献。

路径的 mex 不为 2,当且仅当两个路径在一个同色连通块中。

考虑对极大同色连通块进行 dp,一个极大 \(j\) 色连通块的贡献是 \(\frac{i(i+1)(j+1)}2\)

发现黑白染色的代价是 \(1.5n\) 左右的,所以最优方案里极大同色连通块是 \(O(\sqrt{n})\) 级别的。

所以可以直接树形dp,可以证明总复杂度是 \(O(\sqrt{n})\) 的。

但是空间开不下?

儿子节点只会在父亲时才会 dp 到,所以父亲用完就释放掉。由于一个点只开了 \(sz_x\) 大小的数组,所以空间是 \(O(n)\) 的。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5,INF=1e9;
int t,n,hd[N],e_num,sz[N],ss;
vector<int>dp[N][2];
int ans;
struct edge{
int v,nxt;
}e[N<<1];
int read()
{
int s=0;
char ch=getchar();
while(ch<'0'||ch>'9')
ch=getchar();
while(ch>='0'&&ch<='9')
s=s*10+ch-48,ch=getchar();
return s;
}
void add_edge(int u,int v)
{
e[++e_num]=(edge){v,hd[u]};
hd[u]=e_num;
e[++e_num]=(edge){u,hd[v]};
hd[v]=e_num;
}
void dfs(int x,int y)
{
sz[x]=1;
dp[x][0].resize(2);
dp[x][1].resize(2);
for(int i=hd[x];i;i=e[i].nxt)
{
if(e[i].v==y)
continue;
dfs(e[i].v,x);
dp[x][0].resize(min(ss,sz[x]+sz[e[i].v]+1),INF),dp[x][1].resize(min(ss,sz[x]+sz[e[i].v]+1),INF);
int r1=INF,r2=INF;
for(int j=1;j<dp[e[i].v][0].size();j++)
{
r1=min(r1,dp[e[i].v][0][j]+j*(j+1)/2);
r2=min(r2,dp[e[i].v][1][j]+j*(j+1));
}
for(int k=dp[x][0].size()-1;k;k--)
{
dp[x][0][k]+=r2;
dp[x][1][k]+=r1;
for(int j=max(1,k-sz[x]);j<k&&j<dp[e[i].v][0].size();j++)
{
dp[x][0][k]=min(dp[x][0][k],dp[e[i].v][0][j]+dp[x][0][k-j]);
dp[x][1][k]=min(dp[x][1][k],dp[e[i].v][1][j]+dp[x][1][k-j]);
}
}
dp[e[i].v][0].clear(),dp[e[i].v][1].clear();
dp[e[i].v][0].shrink_to_fit(),dp[e[i].v][1].shrink_to_fit();
sz[x]+=sz[e[i].v];
}
}
int main()
{
t=read();
while(t--)
{
n=read();
ss=sqrt(n)*2;
for(int i=1;i<=n;i++)
{
dp[i][0].clear(),dp[i][0].shrink_to_fit();
dp[i][1].clear(),dp[i][1].shrink_to_fit();
hd[i]=0;
}
e_num=0;
for(int i=1;i<n;i++)
add_edge(read(),read());
dfs(1,0);
ans=INF;
for(int i=1;i<dp[1][1].size();i++)
ans=min({ans,dp[1][0][i]+i*(i+1)/2,dp[1][1][i]+i*(i+1)});
printf("%lld\n",n*(n+1LL)-ans);
}
}

[CF1830D] Mex Tree的更多相关文章

  1. [CF1527D] MEX Tree (lca)

    题面 给你一棵 n n n 个结点的树,对于所有的 k ∈ [ 0 , n ] k\in[0,n] k∈[0,n] ,求出 M E X = k {\rm MEX}=k MEX=k 的路径数量. 一条路 ...

  2. SPOJ COT3 Combat on a tree(Trie树、线段树的合并)

    题目链接:http://www.spoj.com/problems/COT3/ Alice and Bob are playing a game on a tree of n nodes.Each n ...

  3. UOJ#266. 【清华集训2016】Alice和Bob又在玩游戏 博弈,DSU on Tree,Trie

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ266.html 题解 首先我们可以直接暴力 $O(n^2)$ 用 sg 函数来算答案. 对于一个树就是枚举 ...

  4. 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex

    题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...

  5. 【BZOJ3585】mex

    Description 有一个长度为n的数组{a1,a2,-,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Input 第一行n,m. 第二行为n个数. 从第三行開始,每行一个询问l, ...

  6. Educational Codeforces Round 23 F. MEX Queries 离散化+线段树

    F. MEX Queries time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  7. CF1083C Max Mex 线段树

    题面 CF1083C Max Mex 题解 首先我们考虑,如果一个数x是某条路径上的mex,那么这个数要满足什么条件? 1 ~ x - 1的数都必须出现过. x必须没出现过. 现在我们要最大化x,那么 ...

  8. 【线段树】【CF1083C】 Max Mex

    Description 给定一棵有 \(n\) 个点的树,每个节点有点权.所有的点权构成了一个 \(0~\sim~n - 1\) 的排列.有 \(q\) 次操作,每次操作 \(1\) 为交换两个点的点 ...

  9. codeforces:MEX Queries分析和实现

    首先说明一下MEX,设S是自然数集合N的一个子集,那么S的MEX则为min(N\S),即不包含于S的最小自然数. 题目大意是存在一个空集S,提供n组输入(n<10^5),每组输入对应下面的一个指 ...

  10. HDU 4747 Mex(线段树)(2013 ACM/ICPC Asia Regional Hangzhou Online)

    Problem Description Mex is a function on a set of integers, which is universally used for impartial ...

随机推荐

  1. 糟了糟了,总部被SD画完都Q了,这篇深入浅出贴助你早日实现Stable Diffusion自由

    我也不想标题党,可乐高积木版的总部大楼就是好萌啊! 我是憨憨,一个不会画画的设计师.过去半年里,AI绘画曾经多次引爆公众讨论,网络上那些精致的二次元同人插画.堪比真人的AI穿搭博主.打破次元壁的赛博C ...

  2. 【JMeter】使用BeanShell写入内容到文件

    使用BeanShell写入内容到文件 目录 使用BeanShell写入内容到文件 一.前言 二.提取 三.写入 一.前言 ​ 在我们日常工作中,可能会遇到需要将请求返回的数据写入到文件中.在我们使用J ...

  3. 虾皮shopee根据ID取商品详情 API 返回值说明

    ​ item_get-根据ID取商品详情  注册开通 shopee.item_get 公共参数 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼接在URL中) secr ...

  4. Go语言中匿名嵌套和类型嵌套的区别

    在Go语言中,匿名嵌套结构体和与类型同名的嵌套结构体不是完全等价的,它们有一些重要的区别.以下是它们之间的主要区别: 字段访问: 匿名嵌套结构体:当你使用匿名嵌套结构体时,内部结构体的字段可以被直接访 ...

  5. Springboot 实现QQ登录(界面跳转)

    Springboot 实现QQ登录(界面跳转) 现在第三方登录已经变成主流app的登录方式了 今天记录一下如何给自己的网站实现第三方登录(这里以QQ登录为例) 准备工作 首先确保你准备好你自己网站的域 ...

  6. 异常:no transaction is in progress

    转载请注明出处: 在使用  @Scheduled 注解创建了一个定时任务,并通过定时任务不断向mysql写入数据,写入数据的方式是通过 jpa 的方式,在代码运行的过程中出现错误:no transac ...

  7. Vue2系列(lqz)——Vue基础

    文章目录 Vue介绍 一 模板语法 1.1 插值 1.1.1 概述 1.1.2 案例 二 指令 2.1 文本相关指令 2.2 事件指令 2.3 属性指令 三 class与style 3.1 class ...

  8. 文心一言 VS 讯飞星火 VS chatgpt (110)-- 算法导论10.2 1题

    一.用go语言,单链表上的动态集合操作 INSERT 能否在 O(1)时间内实现?DELETE 操作呢? 文心一言: 在单链表中,INSERT 和 DELETE 操作的时间复杂度通常是 O(n),其中 ...

  9. CF1363C

    题目简化和分析: 首先注意特判 $ x $ 在叶子节点上 ( 即度为 \(1\) ). 因为每人都采用最优策略所以不可能有人执着的为别人开路. 就是不在同一颗子树上挣扎,会从外围不断清理. 但是每步必 ...

  10. We Need More Bosses 题解

    We Need More Bosses 题目大意 给定一张图,找到两个点,使得这两个点之间的所有路径必须经过的边最多. 思路分析 我们先来思考一下如果已知两个点,怎么求两个点之间必须经过的边的数量. ...