简要题意:(考虑到某些人搜题解只是懒得看题面)
特殊点从 \(1\) 号点出发,每次选择一个与当前选择连通块相连的点,加入连通块,并且把我们的特殊点向那个选的点移动一格。对每个点求是否能成为我们的特殊点的终点。\(1\) 处在一开始的连通块之中。

不错的一道题。但是如果要很快地写对需要冷静思考(像我就不知道在干什么)。像我这样的菜鸡看了题解才会……

先考虑简单的部分,即 \(W = 3\),只输出 \(1\) 的答案。

先根据特殊点的深度的奇偶性来判断一个点有没有可能(即 \(dep_x + n\) 的奇偶性)。

根据套路,如果有一个子树的大小大于总大小的一半,那么那个子树显然能贡献很多,但是不一定会无解。如果不存在,显然能构造出一个方案(即分成三部分,一个部分里只有一个,另外两个部分大小分别都小于一半,显然有解)。

所以现在只要考虑那个最大的子树,如果我们把它消的小了,那么还是有可能的。记 \(f_i\) 为向 \(i\) 走能造成的最小的相对深度(不是相对 \(i\) 而是相对走到 \(i\) 的那个点,即 \(i\) 也会对这个深度产生贡献。这样做能方便各种地方的细节)。

显然,考虑如果 \(u\) 向 最大的子树 \(v\) 走,此时如果 \(sz_u - sz_v - 1\) 即其他子树的大小是比 \(f_v\) 大的,又因为 \(sz_v > sz_u - sz_v - 1\),那么显然能构造出一种方案,使得 \(v\) 的贡献与 \(sz_u - sz_v - 1\) 相差不超过 \(1\) 。所以直接根据奇偶性进行转移,即 \(f_u = sz_u - 1 \mod 2\)。

但是如果这个比不上 \(f_v\) ,那么其他的子树肯定是要拿去消 \(f_v\) 的,所以 \(f_u = f_v - (sz_u - sz_v - 1) + 1\)。

所以现在已经做完这个简单的部分了。考虑其他点的情况。因为路径上的点是必经的,所以如果把这条路径缩成一个点,上述的过程依然能进行。(因为如果点可行,那就是对消的,那么在链上显然可以)

所以我们仍维护那个最大的子树。因为一条链都缩成一个点了,那么这些子树都是原树某个点的子树。因此不必要考虑换根DP的各种细节,直接类似上面的过程处理下去即可。

注意数据的清空。同时因为变量初始化的原因,以及转移没推清楚,先RE了一发,又WA成45了一发。

#include <bits/stdc++.h>const int MAXN = 100010;int head[MAXN], nxt[MAXN << 1], to[MAXN << 1], tot;
void addedge(int b, int e) {nxt[++tot] = head[b]; to[head[b] = tot] = e;nxt[++tot] = head[e]; to[head[e] = tot] = b;
}
int sz[MAXN], fir[MAXN], sec[MAXN];
int f[MAXN], ansl[MAXN], n;
int cmp(int a, int b) { // a >= breturn sz[a] == sz[b] ? f[a] <= f[b] : sz[a] > sz[b];
}
void gx(int & fir, int & sec, int v) {if (cmp(v, fir)) sec = fir, fir = v;else if (cmp(v, sec)) sec = v;
}
void dfs1(int u, int fa = 0) {sz[u] = 1;for (int i = head[u]; i; i = nxt[i])if (to[i] != fa) {dfs1(to[i], u);sz[u] += sz[to[i]];gx(fir[u], sec[u], to[i]);}if (!fir[u]) return ;int R = sz[u] - 1 - sz[fir[u]];if (R > f[fir[u]]) f[u] = sz[u] + 1 & 1; else f[u] = f[fir[u]] + 1 - R;// std::cout << u << ' ' << sz[u] << " : " << fir[u] << ' ' << sec[u] << " : " << f[u] << ' ' << R << std::endl;
}
void dfs2(int u, int fa = 0, int ma = 0, int dep = 0) {int t, v;gx(v = ma, t = 0, fir[u]);if (dep + n & 1)ansl[u] = n - dep - 1 - sz[v] >= f[v];for (int i = head[u]; i; i = nxt[i]) if (to[i] != fa) {gx(v = ma, t = 0, to[i] == fir[u] ? sec[u] : fir[u]);dfs2(to[i], u, v, dep + 1);}
}
int main() {// freopen("1.in", "r", stdin);std::ios_base::sync_with_stdio(false), std::cin.tie(0);int W, T; std::cin >> W >> T;while (T --> 0) {std::cin >> n;for (int i = 1, t1, t2; i < n; ++i) {std::cin >> t1 >> t2;addedge(t1, t2);}dfs1(1); dfs2(1);for (int i = 1; i <= (W == 3 ? 1 : n); ++i)std::cout << ansl[i];std::cout << '\n';memset(head, 0, n + 1 << 2); tot = 0;memset(ansl, 0, n + 1 << 2);memset(fir, 0, n + 1 << 2);memset(sec, 0, n + 1 << 2);memset(f, 0, n + 1 << 2);}return 0;
}

转载于:https://www.cnblogs.com/daklqw/p/11574871.html

【清华集训2017】榕树之心相关推荐

  1. 清华集训2017刷题记录

    2322. 「清华集训 2017」Hello world! 题意 一棵树每个点有点权,每次可以选择两个点\(s, t\),选择步长为\(k\),从\(s\)跳到\(t\)(不足\(k\)步直接到\(t ...

  2. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

  3. [LOJ#2329]「清华集训 2017」我的生命已如风中残烛

    [LOJ#2329]「清华集训 2017」我的生命已如风中残烛 试题描述 九条可怜是一个贪玩的女孩子. 这天她在一堵墙钉了 \(n\) 个钉子,第 \(i\) 个钉子的坐标是 \((x_i,y_i)\ ...

  4. 清华集训2017题解

    ioi赛制好评QAQ 好像啥都记不得了就不写游记了 Day 1 1.1 生成树计数(tree.cpp) 1.1.1. 题意 ​ 有 n≤30000n≤30000 n \le 30000 个点,第 ii ...

  5. 【luogu P4005 清华集训2017】小Y和地铁

    题目描述 小 Y 是一个爱好旅行的 OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的一条曲线,不同线路的交点处一定会设有 换乘站 . ...

  6. JZOJ 5490. 【清华集训2017模拟11.28】图染色

    Description Input 第一行包括两个整数N,M. 接下来M行每行两个整数u,v,代表存在一条里连接 u,v的无向边.可能存在重边自环. Output 降序输出所有不为0的F(i) .保留 ...

  7. JZOJ 5489. 【清华集训2017模拟11.28】海明距离

    Description 设有一长度为n的初始每个位置均为0的序列A.再给定一个长度为n的01序列B. 有Q个特殊的区间[li,ri],你可以选择将A中li到ri这些位置都变为1,当然你可以选择不变. ...

  8. JZOJ 5484. 【清华集训2017模拟11.26】快乐树

    Description 一棵树有n个节点,编号为0到n-1.有一条叫Owaski的狗在树上面走,每一次它可以从一个顶点走到它的任何一个相邻顶点.每个顶点有个可正可负的快乐度,Owaski也有一个快乐度 ...

  9. JZOJ 5483. 【清华集训2017模拟11.26】简单路径

    Description 给定一棵带边权的树,选择两条没有公共边的简单路径(长度可以为0),使得所有在任意一条路径上的边的异或和尽量大. Input 第一行一个数n表示点数,点的编号是0到n-1. 接下 ...

最新文章

  1. 花呗分期计算器_花呗分期最多能分多久?
  2. PHP的闭包函数匿名函数
  3. C代码+汇编 C的 函数汇编学习分析 rep stos dword ptr [edi]
  4. android调用虚拟摄像头方法,Android:如何在模拟器中使用网络摄像头?
  5. Linux Arch目录下处理器体系架构介绍
  6. 如何在不跳转的情况下实现用户登录
  7. 设计模式-行为型模式-命令模式
  8. 给树莓派超频[浙大嵌入式系统]
  9. MongoDB DBA 实践6-----MongoDB的分片集群部署
  10. tftp刷路由器 linux,开启tftp服务器 WIN7路由器开启tftp服务器命令方法 | 帮助信息-动天数据...
  11. potato土豆引流脚本,potato引流软件工具
  12. 安徽大学江淮学院计算机作业,安徽大学江淮学院
  13. 4行代码,Python搞定美图秀秀!
  14. 降级降薪去 Amazon ——左耳朵
  15. metersphere性能测试测试资源池添加以及修改并发数
  16. DocumentBuilderFactory.newInstance() 异常解决
  17. html5中画线效果标记是,HTML5画布中怎样绘制线?
  18. 不知道视频怎样提取音频?这里有详细教程分享
  19. android obb在哪,obb是什么文件 obb文件怎么用
  20. python数据分析实验报告_使用 Python 3 进行气象数据分析

热门文章

  1. HackerRank Week of Code 26
  2. 设计模式=相似模式区别
  3. javascript随机生成GUID
  4. RPC框架性能基本比较测试
  5. windows资源管理器进行ftp登录下载文件报“当前的安全设置不允许从该位置下载文件”...
  6. css:中文词不断开,整体换行
  7. SugarCRM - 如何让Contact页面的关系字段字段Account变为readonly
  8. 浅谈Struts2和Sturts1的区别
  9. 必须对手机内置业务制定规范防止后门
  10. 《关键对话》读书笔记作文3700字