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. JS DOM笔记

    js的组成     ECMAScript:JS的语法     DOM:页面文档对象模型     BOM:浏览器对象模型     web APIs     是浏览器提供的一套操作浏览器功能和页面元素的A ...

  2. javascript逻辑运算与循环笔记

        短路运算(逻辑中断)     1.短路运算的原理:当有多个表达式(值)时,左边的表达式值可以确定结果的时候就不再继续运算右边的表达式的值     2.逻辑与 &&     如果 ...

  3. Ambiguous mapping. Cannot map 'xxxController' method

    @GetMapping public JsonResp<List<DtoLandRegion>> getLandRegionList() { List<DtoLandRe ...

  4. C#设计模式之22-模板方法模式

    模板方法模式(Template Method Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/429 访 ...

  5. Escalate_my_privilege 靶机

    1:扫描主机ip 2:扫描端口发现 22 80 111 3:目录扫描,发现一些平常的页面 4:进入robots.txt发现一个类型命令行的界面,查看是个低权限,但是在home目录下的armour发现密 ...

  6. 【算法•日更•第三十期】区间动态规划:洛谷P4170 [CQOI2007]涂色题解

    废话不多说,直接上题:  P4170 [CQOI2007]涂色 题目描述 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符 ...

  7. PAT 2-07. 素因子分解(20)

    题目链接:http://www.patest.cn/contests/ds/2-08 题目意思:long int范围内的正整数N进行素因子分解. 直接整除即可,不需要素数筛选 代码如下: #inclu ...

  8. 第1章 RDD概念 弹性分布式数据集

    第1章 RDD概念  弹性分布式数据集 1.1 RDD为什么会产生 RDD是Spark的基石,是实现Spark数据处理的核心抽象.那么RDD为什么会产生呢? Hadoop的MapReduce是一种基于 ...

  9. Nginx进程模型

    多进程模式 在开始介绍Nginx的进程模型之前先说明下:Nginx也支持Single Master单进程模式,但是这个模式效率较低,一般只用在开发环境.所以不是本文介绍的重点. Nginx默认采用多进 ...

  10. Spark on Yarn运行时加载的jar包

    spark on yarn运行时会加载的jar包有如下: spark-submit中指定的--jars $SPARK_HOME/jars下的jar包 yarn提供的jar包 spark-submit通 ...