\(\text{Problem}\)

A君和B君在玩一种叫做新红黑树的游戏,即在一棵由红枝和黑枝构成的树上轮流砍树枝,每次砍一枝,A君每次只能砍红枝,B君每次只能砍黑枝,当其中某人已经没有树枝砍的时候,由另外一人砍,直到砍完全部树枝。树枝是带权的,每个人的总分是他砍的树枝的权值之和,那些由于其他树枝被砍掉而与根失去联系的树枝会自动消失。每次由A君先砍,设“D=A君的得分-B君的得分”,A君想让D最大,而B君想让D最小,A君和B君都是极其聪明的人,他们始终以最优策略进行整个游戏,你知道最后的D值是多少吗?

\(1\le n\le 20\)

\(\text{Solution}\)

考虑两个 \(dfs\) 互相暴搜,二进制记录边信息

然后记忆化

以前没打过,今天考场一遍过了?!

比较慢,其实可以预处理删边后同时影响的边的二进制信息

这样就不需要每次删边后再一条一条边的删去子树影响

\(\text{Code}\)

#include <cstdio>
#include <cstring>
#include <vector>
#define RE register
using namespace std; const int N = 25, INF = 2e9;
int n, f[1<<21][2], dep[N];
struct edge{int u, v, c, w;}e[N];
vector<int> g[N]; void prepare(int x, int fa)
{
dep[x] = dep[fa] + 1;
for(RE int i = 0; i < n - 1; i++)
{
if (e[i].u == x && e[i].v ^ fa)
{
prepare(e[i].v, x), g[x].push_back(i);
for(RE int j = 0; j < g[e[i].v].size(); j++) g[x].push_back(g[e[i].v][j]);
}
else if (e[i].v == x && e[i].u ^ fa)
{
prepare(e[i].u, x), g[x].push_back(i);
for(RE int j = 0; j < g[e[i].u].size(); j++) g[x].push_back(g[e[i].u][j]);
}
}
} int dfs1(int s);
int dfs2(int s);
int dfs1(int s)
{
if (f[s][0] != -INF) return f[s][0];
if (s == (1 << n - 1) - 1) return 0;
int ret = -INF, bz = 0;
for(RE int i = 0; i < n - 1; i++)
{
if (((s >> i) & 1) || (e[i].c != 1)) continue;
int ss = (s | (1 << i)), x = e[i].u, y = e[i].v;
if (dep[x] < dep[y]) swap(x, y);
for(RE int j = 0; j < g[x].size(); j++) ss |= (1 << g[x][j]);
ret = max(ret, e[i].w - dfs2(ss)), bz = 1;
}
if (!bz) return -dfs2(s);
return f[s][0] = ret;
}
int dfs2(int s)
{
if (f[s][1] != -INF) return f[s][1];
if (s == (1 << n - 1) - 1) return 0;
int ret = -INF, bz = 0;
for(RE int i = 0; i < n - 1; i++)
{
if (((s >> i) & 1) || (e[i].c != -1)) continue;
int ss = (s | (1 << i)), x = e[i].u, y = e[i].v;
if (dep[x] < dep[y]) swap(x, y);
for(RE int j = 0; j < g[x].size(); j++) ss |= (1 << g[x][j]);
ret = max(ret, e[i].w - dfs1(ss)), bz = 1;
}
if (!bz) return -dfs1(s);
return f[s][1] = ret;
} int main()
{
scanf("%d", &n), ++n;
for(RE int i = 0; i < n - 1; i++)
scanf("%d%d%d%d", &e[i].u, &e[i].v, &e[i].c, &e[i].w), ++e[i].u, ++e[i].v;
prepare(1, 0);
for(RE int i = 0; i < (1 << n - 1); i++) f[i][0] = f[i][1] = -INF;
printf("%d\n", dfs1(0));
}

JZOJ 1075. 【GDKOI2006】新红黑树的更多相关文章

  1. 二叉搜索树、AVL平衡二叉搜索树、红黑树、多路查找树

    1.二叉搜索树 1.1定义 是一棵二叉树,每个节点一定大于等于其左子树中每一个节点,小于等于其右子树每一个节点 1.2插入节点 从根节点开始向下找到合适的位置插入成为叶子结点即可:在向下遍历时,如果要 ...

  2. 红黑树(R-B Tree)

    R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树.红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black). ...

  3. Linux CFS调度器之pick_next_task_fair选择下一个被调度的进程--Linux进程的管理与调度(二十八)

    1. CFS如何选择最合适的进程 每个调度器类sched_class都必须提供一个pick_next_task函数用以在就绪队列中选择一个最优的进程来等待调度, 而我们的CFS调度器类中, 选择下一个 ...

  4. Linux进程调度策略的发展和演变--Linux进程的管理与调度(十六)

    1 前言 1.1 进程调度 内存中保存了对每个进程的唯一描述, 并通过若干结构与其他进程连接起来. 调度器面对的情形就是这样, 其任务是在程序之间共享CPU时间, 创造并行执行的错觉, 该任务分为两个 ...

  5. Linux进程调度与抢占

    一.linux内核抢占介绍 1.抢占发生的必要条件 a.preempt_count抢占计数必须为0,不为0说明其它地方调用了禁止抢占的函数,比如spin_lock系列函数.b.中断必须是使能的状态,因 ...

  6. Java 容器 LinkedHashMap源码分析2

    一.类签名 LinkedHashMap<K,V>继承自HashMap<K,V>,可知存入的节点key永远是唯一的.可以通过Android的LruCache了解LinkedHas ...

  7. Linux进程调度策略的发展和演变(转)

    转发:http://blog.csdn.net/gatieme/article/details/51701149  1 前言 1.1 进程调度 内存中保存了对每个进程的唯一描述, 并通过若干结构与其他 ...

  8. Linux 调度器发展简述

    引言 进程调度是操作系统的核心功能.调度器只是是调度过程中的一部分,进程调度是非常复杂的过程,需要多个系统协同工作完成.本文所关注的仅为调度器,它的主要工作是在所有 RUNNING 进程中选择最合适的 ...

  9. sicily 题目分类

    为了方便刷题,直接把分类保存下来方便来找. 转自:http://dengbaoleng.iteye.com/blog/1505083 [数据结构/图论] 1310Right-HeavyTree笛卡尔树 ...

  10. linux内核中的数据结构

    http://vinllen.com/linuxnei-he-zhong-de-shu-ju-jie-gou/ https://zhuanlan.zhihu.com/p/58087261 https: ...

随机推荐

  1. python-函数的参数与返回值

    Python函数 4.1.函数初识 在编写程序的过程中,有某一功能代码块出现多次,但是为了提高编写的效率以及代码的重用,所以把具有独立功能的代码块组织为一个小模块,这就是函数 就是一系列Python语 ...

  2. 【重难点总结】DMA与kafka零拷贝机制之间的关系

    一.DMA介绍 1.概念 DMA(Direct Memory Access,直接存储器访问) 是一种内存访问技术,独立于CPU, 直接读.写系统存储器.外设等 主存与I/0设备之间使用DMA控制器控制 ...

  3. 重学c#系列——linq(1) [二十七]

    前言 简单介绍一下linq,linq很多人其实用的很熟练了,但是有些人不知道自己用的是linq. 正文 在介绍linq 之前,先介绍一下集合. public interface ICollection ...

  4. 0停机迁移Nacos?Java字节码技术来帮忙

    摘要:本文介绍如何将Spring Cloud应用从开源Consul无缝迁移至华为云Nacos. 本文分享自华为云社区<0停机迁移Nacos?Java字节码技术来帮忙>,作者:华为云PaaS ...

  5. Django框架模板语法传值-过滤器-标签-自定义过滤器,标签,inclusion_tag

    目录 一:模版语法传值 1.模板语法两个书写方式 2.模板语法 3.测试模板语法是否可以把python支持的基本数据类型传入到前端 4.index.html 5.django模板语法取值方式 二:过滤 ...

  6. NOIP-2022游寄

    NOIP-2022游寄 Day 1 虽然没有上次去南京CSP-S那么激动,但还是有点小开心的,毕竟能水掉两天课.Phigros重度沉迷患者,推了4个小时的分.坐右前方那哥们好卷,在车上写图论-- JS ...

  7. 洛谷P2196例题分析

    [NOIP1996 提高组] 挖地雷(原题) 题目描述 在一个地图上有\(N\)个地窖\((N \le 20)\),每个地窖中埋有一定数量的地雷.同时,给出地窖之间的连接路径.当地窖及其连接的数据给出 ...

  8. 笑死,面试官又问我SpringBoot自动配置原理

    面试官:好久没见,甚是想念.今天来聊聊SpringBoot的自动配置吧? 候选者:嗯,SpringBoot的自动配置我觉得是SpringBoot很重要的"特性"了.众所周知,Spr ...

  9. 真实世界的人工智能应用落地——OpenAI篇 ⛵

    作者:韩信子@ShowMeAI 深度学习实战系列:https://www.showmeai.tech/tutorials/42 本文地址:https://www.showmeai.tech/artic ...

  10. Python实验报告(第5章)

    实验5:字符串及正则表达式 一.实验目的和要求 学会使用字符串的常用操作方法和正确应用正则表达式 二.实验环境 软件版本:Python 3.10 64_bit 三.实验过程 1.实例01:使用字符串拼 ...