Color a Tree

题目链接

好不可做?可以尝试一下DP贪心网络流。DP 似乎没法做,网络流也不太行,所以试一下贪心。

考虑全局中最大权值的那个点,如果它没父亲,那么一定会先选它;否则,选完它父亲就一定先选它。于是我们可以把它缩成一个点。

但是我们并不知道缩点后的权值是多少,这样就没法继续缩下去。我们考虑一对被缩点的父子 \(x,y\),以及全局中的另一个点 \(a\),什么时候会先选 \(a\),什么时候先选 \(x,y\)。如果先选 \(x,y\),那么就有 \(x + 2y + 3a \le a + 2x + 3y\),整理得 \(a \le \dfrac{x + y}{2}\),即我们可以把点中的均值当作点权。

于是并查集 + 堆模拟即可。注意重载运算符时当均值相同时要比较其余变量,否则可删堆将出错。

struct node {
ll val, siz;
int cur;
bool operator <(const node a) const {
if (val * a.siz != siz * a.val) return val * a.siz < siz * a.val;
else if (val != a.val) return val < a.val;
else if (siz != a.siz) return siz < a.siz;
return cur < a.cur;
}
node operator +(const node a) const {
memo += siz * a.val;
return (node){val + a.val, siz + a.siz, cur};
}
bool operator ==(const node a) const { return cur == a.cur && val == a.val && siz == a.siz; }
}ans, tmp[N];
struct Heap {
priority_queue<node> q, w;
inline node top() { while (w.size() && q.top() == w.top()) q.pop(), w.pop(); return q.top(); }
inline void del(node x) { w.push(x); }
inline void push(node x) { q.push(x); }
inline int size() { return q.size() - w.size(); }
}hp;
int v[N];
int fa[N];
bool vis[N];
int find(int cur) { return fa[cur] == cur ? cur : fa[cur] = find(fa[cur]); } int main() {
int n, r;
read(n), read(r);
ans = (node){0, 0, 0};
while (n || r) {
memo = 0;
for (register int i = 1; i <= n; ++i) read(v[i]), tmp[i] = (node){v[i], 1, i}, hp.push(tmp[i]), fa[i] = i;
for (register int i = 1; i < n; ++i) {
int u, v; read(u), read(v); fath[v] = u;
}
while (hp.size()) {
node nd = hp.top(); hp.del(nd);
int rt = nd.cur, faa = find(fath[rt]);
if (!faa || vis[faa]) { ans = ans + nd; vis[rt] = true; continue; }
hp.del(tmp[faa]);
tmp[faa] = tmp[faa] + tmp[rt]; fa[rt] = fath[rt];
hp.push(tmp[faa]);
}
printf("%lld\n", memo + ans.val);
ans = (node){0, 0, 0};
while (hp.q.size()) hp.q.pop();
while (hp.w.size()) hp.w.pop();
for (register int i = 1; i <= n; ++i) fath[i] = 0, vis[i] = false; read(n), read(r);
}
return 0;
}

排列

题目链接

题意较为难懂,可以理解成,如果第 \(i\) 个数跑到了第 \(j\) 个位置,那么 \(j\) 及之前的位置就都不能有 \(a\) 值为 \(i\) 的数。换句话说,值为 \(i\) 的数能够出现,当且仅当第 \(i\) 个数已经出现。

题意转化以后就比较好做了。我们可以把这种限制关系用边来表示一下,结果应该是基环树森林。显然如果有环一定无解,那么结果是森林。然后再看最小化的那个值,发现实际上和 Color a Tree 本质相同,于是直接搬过来即可。

Color a Tree & 排列的更多相关文章

  1. POJ 2054 Color a Tree

    贪心....                    Color a Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions:  ...

  2. Color a Tree[HDU1055]

    Color a Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  3. Color a Tree HDU - 6241

    /* 十分巧妙的二分 题意选最少的点涂色 使得满足输入信息: 1 x的子树涂色数不少于y 2 x的子树外面涂色数不少于y 我们若是把2转化到子树内最多涂色多少 就可以维护这个最小和最大 如果我们二分出 ...

  4. POJ 2054 Color a Tree解题报告

    题干 Bob is very interested in the data structure of a tree. A tree is a directed graph in which a spe ...

  5. Poj2054 color a tree && [HNOI/AHOI2018]排列

    https://zybuluo.com/ysner/note/1120723 题面 原题 某省选强化题 大致意思是给你一颗树,选父亲后才能选儿子. 每个点对答案的贡献为你在第几次选这个点 × 该点权值 ...

  6. hdu 6241 Color a Tree 2017 CCPC 哈理工站 L

    Bob intends to color the nodes of a tree with a pen. The tree consists of NN nodes. These nodes are ...

  7. HDU - 6241 :Color a Tree(不错的二分)

    Bob intends to color the nodes of a tree with a pen. The tree consists of NN nodes. These nodes are ...

  8. POJ 2054 Color a Tree#贪心(难,好题)

    题目链接 代码借鉴此博:http://www.cnblogs.com/vongang/archive/2011/08/19/2146070.html 其中关于max{c[fa]/t[fa]}贪心原则, ...

  9. UVA - 1205 Color a Tree

    大意就是给你一颗树,每个点有一个权值w[i],求一个排列使得 所有的父亲都在儿子前面 并且排列的权值最小. 排列的权值在这里定义为 Σ i * w[p[i]]   ,其中p[i] 是排列第i个位置的元 ...

随机推荐

  1. 注重代码习惯,Python零基础从这本书籍开始!

    笨办法学 Python是Zed Shaw 编写的一本Python入门书籍.适合对计算机了解不多,没有学过编程,但对编程感兴趣的朋友学习使用.这本书以习题的方式引导读者一步一步学习编 程,从简单的打印一 ...

  2. Python3中,map()函数、filter()函数、reduce()函数的比较

    1.map(function,iterable):function为函数,或者lambda表达式,iterable是可迭代的序列,即对iterable中的每个item执行一遍function或者lam ...

  3. 基于索引的QA问答对匹配流程梳理

    知识库(主要是标准的QA信息)匹配需求是对已经梳理出的大量标准QA对信息进行匹配,找出最符合用户问题的QA对进行回复,拆分主要的处理流程主要为如下两点: 标准QA信息入库索引: 通过对用户提出的问题进 ...

  4. FreeAnchor 国科大

  5. LeetCode 763划分字母区间 详解

    题目详情 字符串 S 由小写字母组成.我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段.返回一个表示每个字符串片段的长度的列表. 示例 1: 输入: S = "ab ...

  6. 高吞吐量消息系统—kafka

    现在基本上大数据的场景中都会有kafka的身影,那么为什么这些场景下要用kafka而不用其他传统的消息队列呢?例如rabbitmq.主要的原因是因为kafka天然的百万级TPS,以及它对接其他大数据组 ...

  7. 不用虚机不用Docker使用Azure应用服务部署ASP.NET Core程序

    一般我们写好了应用程序想要部署发布它,要么发布到物理机,要么发布到虚拟机,要么发布到容器来运行它.现在有了Azure应用服务,我们可以完全不用管这些东西,只管写好自己的代码,然后使用VisualStu ...

  8. Revit二次开发——非模态窗口的事件处理

    一.起因    自己在写revit二开时,有一个Winform窗体按钮点击事件需要 触发调用事务进行处理,结果出现“异常“Starting a transaction from an external ...

  9. 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统 | 前言

    介绍 大家好我是初久,一名从业4年的.Net开发攻城狮,从今天开始我会和大家一起对企业开发中常用的技术进行分享,一方面督促自己学习,一方面也希望大家可以给我指点出更好的方案,我们一起进步. 项目背景 ...

  10. 【TTS】文本转语音?如何不调用第三方api来实现,使用pyttsx3

    @ 目录 前言 安装pyttsx3 实现TTS接口 后言 前言 本次的实现需求有点困难,所以也就记录下来,别到时候都忘了. 首先先不说正题,有兴趣的可以看一看: 1.目标是实现一个可以传一个文本就返回 ...