先考虑枚举最后的点,并以其为根

首先,操作祖先-后代关系是没有意义的,因为以后必然有一次操作会操作祖先使其返回原来的位置,那么必然不如操作后代和那一个点(少一次操作)

考虑某一次操作,总深度和恰好减2,因此若有解,操作次数为深度和的一半

考虑dp,令$f_{k}$表示以$k$为根的子树经过若干次操作后,最小的深度和

考虑加入一棵以$son$为根的子树,有三种情况:

1.$f_{son}$大于之前所有子树内部节点的深度和,那么之前的子树中节点不在内部操作,全部与这棵子树抵消,剩下的深度即为$f_{k}$

2.之前子树内部最小的答案也大于了这棵子树内部的深度和,那么用这棵子树的深度和去抵消之前的深度

3.可以证明,一定有方案使得其能够比较完美的匹配,换言之根据奇偶性判断剩下0或1

更具体的,记$g_{k}$表示以$k$为根的子树内部初始深度和(相对于$k$),$sz_{k}$表示以$k$为根的子树内不节点个数,转移如下($g_{k}$是不断加入子树,即记录之前所有子树内部深度和):
$$
f_{k}=\begin{cases}(f_{son}+sz_{son})-g_{k}(g_{k}<f_{son}+sz_{son})\\ f_{k}-(g_{son}+sz_{son})(f_{k}>g_{son}+sz_{son})\\ (f_{k}+g_{son}+sz_{son})\mod\ 2\end{cases}
$$
(关于$g_{k}$的转移是$g_{k}=g_{k}+g_{son}+sz_{son}$)

最后判定$f_{root}$即可,时间复杂度为$o(n^{2})$,可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 2005
4 #define ll long long
5 struct ji{
6 int nex,to;
7 }edge[N<<1];
8 int E,n,x,y,ans,head[N],sz[N],g[N],f[N];
9 char s[N];
10 void add(int x,int y){
11 edge[E].nex=head[x];
12 edge[E].to=y;
13 head[x]=E++;
14 }
15 void dfs(int k,int fa){
16 sz[k]=g[k]=f[k]=0;
17 if (s[k]=='1')sz[k]=1;
18 for(int i=head[k];i!=-1;i=edge[i].nex)
19 if (edge[i].to!=fa){
20 dfs(edge[i].to,k);
21 sz[k]+=sz[edge[i].to];
22 if (g[k]<f[edge[i].to]+sz[edge[i].to])f[k]=f[edge[i].to]+sz[edge[i].to]-g[k];
23 else{
24 if (g[edge[i].to]+sz[edge[i].to]<f[k])f[k]-=g[edge[i].to]+sz[edge[i].to];
25 else f[k]=((f[k]+g[edge[i].to]+sz[edge[i].to])&1);
26 }
27 g[k]+=g[edge[i].to]+sz[edge[i].to];
28 }
29 }
30 int main(){
31 scanf("%d%s",&n,s+1);
32 memset(head,-1,sizeof(head));
33 for(int i=1;i<n;i++){
34 scanf("%d%d",&x,&y);
35 add(x,y);
36 add(y,x);
37 }
38 ans=n*n;
39 for(int i=1;i<=n;i++){
40 dfs(i,0);
41 if (!f[i])ans=min(ans,g[i]/2);
42 }
43 if (ans==n*n)ans=-1;
44 printf("%d",ans);
45 }

[atAGC034E]Complete Compress的更多相关文章

  1. 「AGC034E」 Complete Compress

    「AGC034E」 Complete Compress 显然可以枚举根. 然后把某两棵棋子同时往深度浅的方向提,即对不存在祖先关系的两个棋子进行操作. 如果能到达那么就更新答案. 问题转化为如何判定能 ...

  2. @atcoder - AGC034E@ Complete Compress

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 N 个点的树,编号为 1, 2, ..., N.第 i ...

  3. AT4995-[AGC034E] Complete Compress【树形dp】

    正题 题目链接:https://www.luogu.com.cn/problem/AT4995 题目大意 \(n\)个点的一棵树,上面有一些棋子,每次可以选择两个棋子移动到他们之间的路径上相邻的点上, ...

  4. 30个HTML初学者建议

    The most difficult aspect of running Nettuts+ is accounting for so many different skill levels. If w ...

  5. 【AtCoder】AGC034

    AGC034 刷了那么久AtCoder我发现自己还是只会ABCE(手动再见 A - Kenken Race 大意是一个横列,每个点可以跳一步或者跳两步,每个格子是空地或者石头,要求每一步不能走到石头或 ...

  6. WC2021 题目清单

    Day2 上午 <IOI题型与趣题分析> 来源 题目 完成情况 备注 IOI2002 Day1T1 Frog 已完成 IOI2002 Day1T2 Utopia IOI2002 Day1T ...

  7. 多校联训 DP 专题

    [UR #20]跳蚤电话 将加边变为加点,方案数为 \((n-1)!\) 除以一个数,\(dp\) 每种方案要除的数之和即可. 点击查看代码 #include<bits/stdc++.h> ...

  8. use zlib lib to compress or decompress file

    If you want to compress or decompress file when writing C++ code,you can choose zlib library,that's ...

  9. NYOJ 1067 Compress String(区间dp)

    Compress String 时间限制:2000 ms  |  内存限制:65535 KB 难度:3 描写叙述 One day,a beautiful girl ask LYH to help he ...

随机推荐

  1. 10.10 Rewrite 实战

    将baidu.com跳转到www.baidu.com server { listen 80; server_name baidu.com; rewrite ^/ http://www.baidu.co ...

  2. FastAPI 学习之路(六)查询参数,字符串的校验

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  3. K12教培从业者转型指南 换个赛道依然可以再创辉煌

    随着"双减"政策的落地,属于K12教培机构的时代逐渐拉上帷幕,面对机会不再的K12教培行业,约70万机构和近千万的从业人员面临转型问题.压力之下,留下或离开?对广大K12教培机构从 ...

  4. Java:并发笔记-02

    Java:并发笔记-02 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 3. 共享模型之管程-1 本章内容-1 共享问题 synchronized 线程安全分 ...

  5. [no code][scrum meeting] Beta 4

    例会时间:5月16日11:30,主持者:伦泽标 下次例会时间:5月18日11:30,主持者:叶开辉 一.工作汇报 人员 昨日完成任务 明日要完成的任务 乔玺华 完成整体框架设计与登录逻辑 与后端对接 ...

  6. C语言编程基础有网盘资料哦

    刚开始看STM32的库函数,会有很多疑惑,例如指针怎么用,结构体跟指针怎么配合,例如函数的参数有什么要求,如何实时更新IO口的数据等.如果重新进行C语言的学习,那么要学很久才能够系统地认识.本文则将比 ...

  7. 从零开始的DIY智能家居 - 基于 ESP32 的智能水浊度传感器

    前言 家里有个鱼缸养了几条鱼来玩玩,但是换水的问题着实头疼,经常一个不注意就忘记换水,鱼儿就没了.o(╥﹏╥)o 在获得 Spirit 1 边缘计算机 后就相当于有了一个人智能设备服务器,可以自己开发 ...

  8. nod_1004 n^n的末位数字(二分快速幂)

    题意: 给出一个整数N,输出N^N(N的N次方)的十进制表示的末位数字. Input 一个数N(1 <= N <= 10^9) OutPut 输出N^N的末位数字 思路: EASY,,,, ...

  9. hdu 3038 How Many Answers Are Wrong(并查集)

    题意: N和M.有N个数. M个回答:ai, bi, si.代表:sum(ai...bi)=si.如果这个回答和之前的冲突,则这个回答是假的. 问:M个回答中有几个是错误的. 思路: 如果知道sum( ...

  10. hdu 5175 Misaki's Kiss again(GCD和异或)

    题意: 给一个数N. 如果GCD(N,M) = N XOR M,则称M是一个kiss   1<=M<=N 问总共有多少个kiss.并且列出所有的值. 思路: 思路一:枚举M.有大量的GCD ...