树上前缀和树状数组结合

news2024/9/20 8:34:43

在这里插入图片描述

怎么去分析这个题目,一开始我想的就是暴力dfs,接着枚举删除的节点,但是只过了百分之四十个点,代码如下:(这个代码有点像树形dp)

#include<bits/stdc++.h>
using namespace std;

#define int long long
const int N = (int)1e5+5;
int e[N],ne[N],h[N],idx = 0;
int n;
int a[N];
int vis[N]; // 设置分开的树 
void add(int a,int b){
	e[++idx] = b, ne[idx] = h[a],h[a] = idx;
}
int ans = 0;

int dfs(int node,int wei){ // 返回值是该节点的子节点的权重 
	int now = a[node]; // 该节点的权重
	int big = 0;
	int sum = 0;
	for(int i=h[node];i;i=ne[i]){
		int to = e[i];
		if(vis[to]) continue;
		int t = dfs(to,wei+now);
		sum += t; // 统计总的数量 
		big = max(big,t);
	}
	if(now<=wei&& now>=sum){
		ans ++;
		//cout << " 节点 " << node << endl;
	}
	return now+sum;
}

signed main(){
	cin >> n;
	for(int i=1;i<=n;i++){
		cin >> a[i];
	}
	int temp; cin >> temp;
	for(int i=2;i<=n;i++){
		int fa; cin >> fa;
		add(fa,i);
	}
	int last = 0;
	for(int i=2;i<=n+1;i++){
		ans = 0;    
		vis[i] = 1;
		dfs(1,0);
		vis[i] = 0;
		last = max(last,ans);
		//cout << endl;
	}
	cout << last;
	return 0;
}

但是复杂度太高了,那有没有什么办法呢,我们注意到,当我们删除一个节点的时候,影响的是什么?我们会失去以这个节点为树 的所有答案,但是,这个节点的祖先节点中 如果 存在之前不满足 w[u] > sum[u] 的,现在满足 w[u] > sum[u] - w[v] 的,这个要加上答案里面

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10,M=2e5+10;
ll n, w[N], sum[N], mark[N],ans[N],tr[M],idx,res;
map<ll, ll>m;
vector<ll>a[N],b;
ll lowbit(ll x) {
	return x & -x;
}
void add(int x, int val) {
	for (; x <= idx; x += lowbit(x))
		tr[x] += val;
}
ll query(int x) {
	ll res = 0;
	for (; x; x -= lowbit(x))
		res += tr[x];
	return res;
}
void dfs(int u, int fa, int all) {
	if (all >= w[u])
		mark[u] = 1;
	for (int i = 0; i < a[u].size(); i++) {
		int v = a[u][i];
		if (v == fa)
			continue;
		dfs(v, u, all + w[u]);
        ans[u]+=ans[v];
		sum[u] += sum[v];
	}
    if (mark[u]) {
        if (sum[u] <= w[u])
            ans[u]++;
        else b.push_back(sum[u] - w[u]);
    }
	sum[u] += w[u];
	b.push_back(sum[u]);
}
void dfs(int u, int fa) {
	if (mark[u] && w[u] < sum[u] - w[u])
		add(m[sum[u] - 2 * w[u]], 1);
	for (int i = 0; i < a[u].size(); i++) {
		int v = a[u][i];
		if (v == fa)continue;
		res = max(res, ans[1] - ans[v] + query(m[sum[v]]));
		dfs(v, u);
	}
	if (mark[u] && w[u] < sum[u] - w[u])
		add(m[sum[u] - 2 * w[u]], -1);
}
void solve() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> w[i];
	}
	for (ll i = 1; i <= n; i++) {
		ll fa;
		cin >> fa;
		a[fa].push_back(i);
		a[i].push_back(fa);
	}
	dfs(1, 0, 0);
	sort(b.begin(),b.end());
	for (int i = 0; i < b.size(); i++) {
		if (!m.count(b[i]))
			m[b[i]] = ++idx;
	}
	dfs(1,0);
	cout << max(res, ans[1]) << "\n";
}
int main() {
	int t = 1;
	//cin >> t;
	while (t--)
		solve();
}

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

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

相关文章

SHL笔试测评题型题库大揭秘适用公司通过技巧神助攻

⭕SHL题库外企应用的比较多&#xff0c;整体来看分为三类。 ✅第一类是综合能力&#xff0c;考察综合素质&#xff0c;要求36分钟完成24道题&#xff0c;适用范围最广。题型有安排时间问题、比例题、记忆题、排序题、日历题、图形变换题、图形推理题、拖线条题等等&#xff0c…

Linux_生产消费者模型

目录 1、生产消费者模型示意图 2、生产者消费者之间的关系 3、定义交易场所 4、实现生产消费者模型 5、伪唤醒 6、多生产多消费者的实际运用 7、POSIX信号量 7.1 初始化信号量 7.2 销毁信号量 7.3 等待信号量 7.4 发布信号量 8、生产消费的环形队列模型 8.1…

接口测试之测试原则、测试用例、测试流程详解

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、接口的介绍 软件测试中&#xff0c;常说的接口有两种&#xff1a;图形用户接口&#xff08;GUI&#xff0c;人与程序的接口&#xff09;、应用程序编程接口&…

AWS云服务器购买:亚马逊云服务器的价格真的那么贵吗?一年要花多少钱?

亚马逊云服务器是全球领先的云计算服务提供商之一&#xff0c;其服务覆盖全球多个地区&#xff0c;拥有众多的客户和合作伙伴。然而&#xff0c;对于很多人来说&#xff0c;AWS的价格一直是一个热门话题。那么&#xff0c;亚马逊云服务器的价格真的那么贵吗&#xff1f;一年要花…

python爬虫Selenium模块及测试案例详解

什么是selenium&#xff1f; &#xff08;1&#xff09;Selenium是一个用于Web应用程序测试的工具。 &#xff08;2&#xff09;Selenium 测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。 &#xff08;3&#xff09;支持通过各种driver&#xff08;FirfoxDrive…

粘包问题、mmap和分片上传

一、粘包问题&#xff1a; 如果一端要把文件发给另一端&#xff0c;要发送两个部分的数据&#xff1a;其一是文件名&#xff0c;用于对端创建文件&#xff1b;另一个部分是文件内容。服务端在接收文件名&#xff0c;实际上并不知道有多长&#xff0c; 所以它会试图把网络缓冲区…

怎么把照片变漫画?学会这几招让照片秒变漫画

在这个追求图片创意与趣味性的时代&#xff0c;照片的“变身”游戏正悄然风靡。 从滤镜的巧妙运用到拍摄姿势的创新突破&#xff0c;人们不断探索着让照片焕发新生的无限可能。 而今&#xff0c;一股将照片转化为漫画风格的新潮流正席卷而来&#xff0c;它不仅保留了照片的记…

【PPT方案】大数据湖建设方案

背 景&#xff1a;大数据湖的发展背景与建设理念 体 系&#xff1a;大数据湖体系规划与建设思路 生态圈&#xff1a;探索新兴业务入湖建设模式 共 享&#xff1a;大数据湖统一访问共享规划 运 营&#xff1a;大数据湖一体化运营管理建设 软件全套资料部分文档清单&…

恐怖数字暗影:猜中才能逃离

大家可以看看这个&#xff0c;也很有意思&#xff01; 猜数字游戏&#xff08;老六版&#xff09;-CSDN博客 1、 剧情介绍 在一个阴暗潮湿的古堡中&#xff0c;你独自一人走进了一间散发着诡异气息的房间。房间的正中央有一张古老的桌子&#xff0c;上面放着一本泛黄的羊皮卷…

Java二十三种设计模式-装饰器模式(7/23)

装饰器模式&#xff1a;动态扩展功能的灵活之选 引言 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;用于在不修改对象自身的基础上&#xff0c;通过添加额外的职责来扩展对象的功能。 基础知识&#xff0c;java设计模式总体来说设计…

MT19937

MT19937 文章目录 MT19937题型1 逆向extract_number[SUCTF2019]MT 题型2 预测随机数[GKCTF 2021]Random 题型3逆向twist[V&N2020 公开赛]Backtrace 题型4 逆向init扩展题型WKCTF easy_random 现成模块randcrack库Extend MT19937 Predictor库 MT19937是一种周期很长的伪随机…

【C++】深刻基础笔记

目录 关于debug&#xff1a; 多文件编译&#xff1a; 编译器工作原理 预处理&#xff1a; 如何将机器二进制转换成可以看懂的文件 链接器的工作原理 Pointers指针 Reference引用 C线程 程序如何从源文件变成exe可执行文件&#xff1f; 首先是预处理器#include <..…

斐波那契数列的多种解法 C++实现,绘图部分用Python实现

斐波那契数列的多种解法 C实现&#xff0c;绘图部分用Python实现 flyfish 斐波那契数列&#xff08;Fibonacci sequence&#xff09;是一个经典的数列&#xff0c;定义如下&#xff1a; { 0 if n 0 1 if n 1 F ( n − 1 ) F ( n − 2 ) if n > 1 \begin{cases} 0 &…

c++网络编程实战——开发基于ftp协议的文件传输模块(二) 配置ftp服务与手动执行ftp命令

配置FTP服务 一.前言 博主的环境是阿里云服务器&#xff0c;操作系统版本为 ubuntu20.04,一下所有操作都基于以上环境下进行的操作&#xff0c;同时为了简化操作我将开放同一个云服务器的不同端口&#xff0c;让它同时充当服务端和客户端&#xff0c;大家如果想测试效果更好且…

Java基础:类与对象,递归,方法

类与对象的区别和联系 1.类是抽象的,概念的他是数据类型 2.对象是具体的实际的,代表一个具体事务 3.类是对象的模板,对象是类的个体 **对象在内存中的存在形式** 基本数据类型在堆,引用类型如String,数组在方法区 对象的属性 属性基本说明 1.成员变量or成员属性 属性的定…

双向链表<数据结构 C版>

目录 关于链表的分类 双向链表结构体 初始化 尾插 头插 打印 判断是否为空 尾删 头删 查找 指定位置之后的插入 指定位置的删除 销毁 关于链表的分类 根据链表的三大特性&#xff0c;单向or双向、带头or不带头、循环or不循环&#xff0c;可将链表分为2*2*2&#xf…

利用ascp下载SRA Explorer中转录组数据

最近在windows系统里下载了MobaXterm可以远程登入服务器&#xff0c;处理RNA的数据&#xff0c;需要从NCBI数据库上下载数据。本文提供用虚拟机ubuntu或者linux系统下载Aspera的方法和问题解决&#xff0c;以及从NCBI上批量下载数据库、最后得到一个项目里的所有fastq文件。 A…

前端:Vue学习-2

前端&#xff1a;Vue学习-2 1. vue的生命周期2. 工程化开发和脚手架Vue CLI2.1 组件化开发2.2 scoped解决样式冲突2.3 data是一个函数2.4 组件通信2.5 非父子通信- event bus事件&#xff0c;provide&inject 3.v-model原理->实现父子组件双向绑定4. sync 修饰符->实现…

谷粒商城实战笔记-42-前端基础-Vue-生命周期和钩子函数

下面是Vue官网关于生命周期及不同阶段的钩子函数的图示。 Vue 实例生命周期是指从一个组件被创建到最终被销毁的整个过程。 在这一过程中&#xff0c;Vue 提供了一系列的“钩子”函数&#xff0c;在生命周期的不同阶段执行自定义的代码。 以下是 Vue 对象生命周期的主要阶段…

C语言实现二叉树以及二叉树的详细介绍

目录 1.树概念及结构 1.1树的概念 1.2树的相关概念 1.3树的表示 2.二叉树概念及结构 2.1二叉树的概念 2.2特殊的二叉树 2.3二叉树的性质 2.4二叉树的存储结构 3.二叉树顺序结构--特殊的二叉树--堆及其实现 3.1堆的概念及结构 3.2堆的实现 3.2.1堆的结构 3.2.2堆…