CF814 D. An overnight dance in discotheque [树形dp+提前处理祖先需要的状态]

传送门

[前题提要]:本题的树形dp的思考方式既考虑子孙需要的贡献以及提前预处理出祖先节点所需要的状态,感觉是我几乎没有碰到过的姿势,平时遇到的大部分的树形dp大都是单单考虑子树的贡献以及限制,感觉很新,故写篇博客记录一下

当然本题具有一个更为"简单"的贪心解法?但是本人更喜欢dp做法(正确性更为显然一点),所以贪心做法在这里就不再赘述了.


当然,一切的一切在于我们需要先看出圆的重叠关系等价于一棵树才行.这个当时我注意到重叠次数相同的圆其实是互不干扰的时候(相当于可以单独考虑),就想到了.那么我们先按照包含关系建出一棵树.

那么按照一般的思路,我们不难想到使用 d p [ u ] dp[u] dp[u]来记录一个 u u u子树最优方案下的最大面积.那么我们考虑如何从 v v v转移到 u u u.我们会发现很难转移,因为此时 v v v的贡献和其的最大面积,也就是 d p [ u ] dp[u] dp[u]不是正比关系,而是和它的最小面积成正比关系(因为v的贡献此时是v子树中处于偶数覆盖的面积).并且我们此时还需要两堆的面积(因为u放在一个位置只会导致一堆的面积变化)以及堆的奇偶性.显然的我们无法同时维护出上述关系.造成上述问题的主要关键在于我们对于u节点的放置选择影响到了v子树的贡献(也就是以为此时我们只是计算出了v子树在面对偶偶的状态下的最大面积,当u节点加入了贡献的时候v子树此时面对的情况就不再是偶偶的情况了,那么此时之前的最优子结构就不在存在了).但是如果我们记录出了 v v v子树对于各个状态下的贡献,那么我们就可以把它拿过来用而不用管最大/最小面积了(因为放了u的情况对于v来说,只是将偶偶的先置情况改为了奇偶或者偶奇,所以无论u怎么变化,我们都能找到一个最优子结构与之对应).

我们继续分析,就会发现一颗子树只需要记录4种状态就行.分别为奇奇,偶偶,奇偶,偶奇.那么此时我们考虑使用 d p [ u ] [ 0 / 1 ] [ 0 / 1 ] dp[u][0/1][0/1] dp[u][0/1][0/1]来记录 u u u子树面临先置条件为上述四种状态下的最优面积.那么此时我们就会发现十分好转移了.首先的,我们会发现当 u u u随意的放置在一堆上形成一个新的状态,这个状态对于所有的 v v v都是一样的.也就是说所有 v v v面对的相同的先置条件是可以放在一起来考虑的.那么对于每一种状态,我们的u可以选择放在左边或者放在右边,直接转移即可.具体看代码部分.


下面是具体的代码部分:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define root 1,n,1
#define ls (rt<<1)
#define rs (rt<<1|1)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define pd __gnu_pbds
inline ll read() {ll x=0,w=1;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';return x*w;
}
inline void print(__int128 x){if(x<0) {putchar('-');x=-x;}if(x>9) print(x/10);putchar(x%10+'0');
}
#define maxn 1000000
#define int long long
const double eps=1e-8;
const long double PI=acos(-1.0);
#define	int_INF 0x3f3f3f3f
#define ll_INF 0x3f3f3f3f3f3f3f3f
struct Circle{int x,y,r;long double area;int id;bool operator < (const Circle &rhs) const {return area<rhs.area;}
}cir[maxn];
vector<int>edge[maxn];
int get_dis(int x1,int y1,int x2,int y2) {return (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
}
long double dp[maxn][2][2];
//u节点面临的限制状态是一堆为奇数/偶数,另外一堆是奇数/偶数的情况下,u子树贡献的最大面积
void dfs(int u,int pre_u) {long double g[2][2];memset(g,0,sizeof g);for(auto v:edge[u]) {if(v==pre_u) continue;dfs(v,u);for(int i=0;i<=1;i++) {for(int j=0;j<=1;j++) {g[i][j]+=dp[v][i][j];//显然的在这个限制状态下,u随便选一个位置,所有的v遇到的限制状态都是一样的}}}for(int i=0;i<=1;i++) {for(int j=0;j<=1;j++) {dp[u][i][j]=max({g[i^1][j]+1.0*(i&1?-1:1)*cir[u].area,g[i][j^1]+1.0*(j&1?-1:1)*cir[u].area});}}
}
int fa[maxn];
signed main() {int n=read();for(int i=1;i<=n;i++) {cir[i].x=read();cir[i].y=read();cir[i].r=read();cir[i].area=PI*cir[i].r*cir[i].r;cir[i].id=i;}sort(cir+1,cir+n+1);for(int i=1;i<=n;i++) {vector<int>v;for(int j=i+1;j<=n;j++) {if(get_dis(cir[i].x,cir[i].y,cir[j].x,cir[j].y)<=cir[j].r*cir[j].r) {edge[j].push_back(i);fa[i]=j;break;}}}long double ans=0;for(int i=1;i<=n;i++) {if(fa[i]==0) {dfs(i,0);ans+=dp[i][0][0];}}printf("%.9Lf\n",ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/37752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis Plus条件构造器使用

1Wrapper&#xff1a; 条件构造抽象类&#xff0c;最顶端父类 1.1 AbstractWrapper&#xff1a; 用于查询条件封装&#xff0c;生成 sql 的 where 条件 1.2 QueryWrapper&#xff1a; Entity 对象封装操作类&#xff0c;不是用lambda语法 1.3 UpdateWrapper&#xff1a; Update…

【工具分享】Nuclei

文章目录 NucleiLinux安装方式Kali安装Windows安装 Nuclei Nuclei 是一款注重于可配置性、可扩展性和易用性的基于模板的快速漏洞验证工具。它使用 Go 语言开发&#xff0c;具有强大的可配置性、可扩展性&#xff0c;并且易于使用。Nuclei 的核心是利用模板&#xff08;表示为简…

前端学习笔记(2406261):jquery使用checkbox控制页面自动刷新

文章目录 需求登录页面主页面 API用户登录login获取数据getdata 代码登录页面主页面 关于后端 需求 这是一个物联网的演示项目&#xff0c;web端能够实时显示后台数据的变化&#xff0c;其流程非常简单&#xff1a; 用户登录登录成功后显示主界面面主界面进入后自动显示数据数…

仓库管理系统19--盘存管理

原创不易&#xff0c;打字不易&#xff0c;截图不易&#xff0c;多多点赞&#xff0c;送人玫瑰&#xff0c;留有余香&#xff0c;财务自由明日实现 1、什么是盘存 盘存也叫盘库&#xff0c;盘库是指对一个仓库、库房或者商店的库存进行全面清点和核对的过程。在盘库过程中&am…

L03_Redis知识图谱

这些知识点你都掌握了吗?大家可以对着问题看下自己掌握程度如何?对于没掌握的知识点,大家自行网上搜索,都会有对应答案,本文不做知识点详细说明,只做简要文字或图示引导。 Redis 全景图 Redis 知识全景图都包括什么呢?简单来说,就是“两大维度,三大主线”。 Redis …

IDEA中导入Maven项目

IDEA中导入Maven项目 方式1&#xff1a;使用Maven面板&#xff0c;快速导入项目 打开IDEA&#xff0c;选择右侧Maven面板&#xff0c;点击 号&#xff0c;选中对应项目的pom.xml文件&#xff0c;双击即可 说明&#xff1a;如果没有Maven面板&#xff0c;选择 View > Appe…

qt 开发笔记 动态链接库应用

1.概要 1.1 需求 库有两种&#xff0c;动态库和静态库&#xff0c;这里说的是动态库&#xff1b;动态库的加载方式有两种&#xff0c;一直是静态的一种是动态的&#xff0c;这里的静态加载是指静态加载动态&#xff0c;是一种加载动态库的方式。也有一种动态加载的方式&#…

打造你的第一个STM32步进电机控制器:详细教程与实战技巧

1. 引言 步进电机因其精确的位置控制和较高的响应速度&#xff0c;在自动化设备、3D打印机、CNC机床等领域广泛应用。本文将详细介绍如何使用STM32微控制器来控制步进电机&#xff0c;从理论到实践&#xff0c;帮助读者全面掌握这一重要技术。 STM32系列微控制器以其强大的性…

51单片机第7步_ctype.h库函数

本章重点学习ctype.h库函数。 //介绍C51库函数ctype.h的使用; #include <REG51.h> //包含头文件REG51.h,使能51内部寄存器; #include <ctype.h> //bit isalpha( unsigned char value ); //检查输入参数value是否为英文字母,若是英文字母,则返回1,若不是英文字…

Font Awesome 文件类型图标

Font Awesome 文件类型图标 Font Awesome 是一个广泛使用的图标库,它提供了大量的矢量图标,可以轻松地与各种网页和应用程序集成。这些图标涵盖了多种类别,包括文件类型图标。在本文中,我们将探讨 Font Awesome 提供的一些常见的文件类型图标,以及如何在项目中使用它们。…

探索LangChain-Chatchat 0.3:一体化Agent与强大RAG模型的全面入门指南

介绍 LangChain-Chatchat 支持RAG和Agent0.3版本跟大模型解耦,支持Xinference、Ollama、LocalAI、FastChat、One API,可以非常方便的切换各个模型,本文只是介绍XinferenceXorbits Inference (Xinference) 是一个开源平台&#xff0c;用于简化各种 AI 模型的运行和集成。借助 X…

数据结构速成--查找

由于是速成专题&#xff0c;因此内容不会十分全面&#xff0c;只会涵盖考试重点&#xff0c;各学校课程要求不同 &#xff0c;大家可以按照考纲复习&#xff0c;不全面的内容&#xff0c;可以看一下小编主页数据结构初阶的内容&#xff0c;找到对应专题详细学习一下。 目录 …

STM32CubeMx的学习记录系列(1) - 软件的下载与点灯

目录 因为最近要学STM32的嵌入式AI开发&#xff0c;但它于是基于STM32CubeMX开发的&#xff0c;就顺便把这个学了。 直接百度STM32CubeMX&#xff0c;到意法的官网去下载。下载过程就看这篇博客 https://blog.csdn.net/as480133937/article/details/98885316 点灯 选择芯片&…

内网渗透:内网基础信息收集

Windows&#xff1a; whoami:查看当前当前主机名和登录用户名 whoami /user : 打印当前主机名和输出SID ​ SID的最后一个数字&#xff1a; 1000&#xff1a;普通管理员 500&#xff1a;administrator 501&#xff1a;Guest 516&#xff1a;域控 544&#xff1a;域管理员 net…

002 SpringMVC入门项目搭建

文章目录 HelloController.javaspringmvc.xmlweb.xmlpom.xmlhello.jsp http://localhost:8080/showView http://localhost:8080/showData HelloController.java package com.springmvc.controller;import org.springframework.stereotype.Controller; import org.springframewo…

ArtTS语言基础类库内容的学习(2.10.1)

上篇回顾&#xff1a; ArkTS开发系列之Web组件的学习&#xff08;2.9&#xff09; 本篇内容&#xff1a;ArtTS语言基础类库-异步同步并发内容的学习(2.10.1&#xff09; 一、知识储备 1. 异常并发 Promise和Async/await提供异步并发能力&#xff0c;是标准的JS异步语法 Pr…

Scala的Actor模型:并发编程的革命性抽象 摘要

标题&#xff1a;Scala的Actor模型&#xff1a;并发编程的革命性抽象 摘要 Scala语言以其强大的函数式编程特性和并发模型而闻名。Actor模型作为Scala并发编程的核心&#xff0c;提供了一种高效、可靠的并行处理方式。本文将深入探讨Scala的Actor模型&#xff0c;包括其设计理…

亿发微商城:从社交流量到生意增量,拓客+变现双收益

亿发微商城提供私域经营必备的系统 、服务和技术支持等全套解决方案。省去开发成本&#xff0c;还原品牌调性&#xff0c;打通社交渠道&#xff0c;经营私域会员&#xff0c;带来传统电商和线下门店之外的生意增量。

揭秘Etched AI:三个哈佛辍学00后挑战英伟达,推出Transformer专用ASIC芯片sohu

人工智能领域最近掀起了一股新的热潮&#xff0c;三位哈佛辍学的00后本科生创建了Etched AI&#xff0c;并成功推出了一款超强AI芯片sohu&#xff0c;直指英伟达的AI芯片帝国。这款芯片被誉为比英伟达H100快20倍&#xff0c;吸引了众多科技界的关注。本文将深入探讨Etched AI及…

“实时数据大屏2k、4k、8k”这样做【高级前端必备技能之一】

&#x1f525;废话不多先上效果图 &#x1f525;划重点 新手程序员需要注意以下几点&#xff1a; 我们需要进行充分的技术调研&#xff0c;进行技术选型产品&#xff0c;UI&#xff0c;再三确认效果图是否确定&#xff0c;避免后续出现返工的情况 不能拿到效果图之后&#x…