2021杭电多校第二场 1002——I love tree

【AI方案集】AI与人机协作相结合的智能法律咨询系统.docx AI技术方案以算力、算法、数据三角协同为核心,通过搭建标准化的数据预处理、模型训练与边缘云端协同部署流程,将计算机视觉、自然语言处理、机器学习等核心能力深度融入业务场景,既实现自动化流程降本提效,又通过精准的模式识别与预测分析为管理层提供数据驱动的决策支撑,最终完成从通用AI技术到行业定制化场景的适配落地,为企业数字化转型提供可落地的技术路径。 立即下载

题目大意

给你一棵树,有两种操作
1、将路径 uuu 到 vvv 上的点按照与 uuu 的距离,加上 1 4 9⋯i21 \ 4 \ 9 \cdots i^21 4 9⋯i2
2、问节点 xxx 的值为多少

解题思路

树链剖分 + 线段树
首先我们可以进行一个树链剖分,这样便于处理操作1。
对于操作1,我们首先找出 uuu 与 vvv 的 lcalcalca
对于树链 uuu 到 lcalcalca,我们每个节点所加的值为
(dep[t]−dep[u]+1)2(dep[t] - dep[u] + 1)^2(dep[t]−dep[u]+1)2
化简一下
dep[t]2−2×(dep[u]−1)×dep[t]+(dep[u]−1)2dep[t]^2 - 2\times (dep[u] - 1) \times dep[t] + (dep[u] - 1)^2dep[t]2−2×(dep[u]−1)×dep[t]+(dep[u]−1)2
我们可以开三个线段树维护这三个值,我们发现,对于每个点的 dep[t]dep[t]dep[t] 是确定的,所以我们只需要记录一下这个多项式的系数即可。
对于树链 vvv 到 lcalcalca,每个节点所加的值为
(dep[t]−(2×dep[lca]−dep[x]−1))2(dep[t] - (2\times dep[lca] - dep[x] - 1))^2(dep[t]−(2×dep[lca]−dep[x]−1))2
化简一下
dep[t]2−2×(2×dep[lca]−dep[x]−1)×dep[t]+(2×dep[lca]−dep[x]−1)2dep[t]^2 - 2\times (2\times dep[lca] - dep[x] - 1) \times dep[t] + (2\times dep[lca] - dep[x] - 1)^2dep[t]2−2×(2×dep[lca]−dep[x]−1)×dep[t]+(2×dep[lca]−dep[x]−1)2

Code

#include <bits/stdc++.h>
#define ll long long
#define qc ios::sync_with_stdio(false); cin.tie(0);cout.tie(0)
#define fi first
#define se second
#define PII pair<int, int>
#define PLL pair<ll, ll>
#define pb push_back
using namespace std;
const int MAXN = 2e5 + 7;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const ll mod = 1e9 + 7;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
    while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
int n, m;
int fa[MAXN], sz[MAXN], top[MAXN], dfn[MAXN], son[MAXN], dep[MAXN];
int tim;
struct Tree{
	struct T{
		int l, r;
		ll sum, add;
	}tree[MAXN << 2];
	void pushup(int rt){
		tree[rt].sum = tree[rt << 1].sum + tree[rt << 1 | 1].sum;
	}
	void build(int l, int r, int rt){
		tree[rt].l = l;
		tree[rt].r = r;
		tree[rt].add = 0;
		tree[rt].sum = 0;
		if(l == r) return ;
		int m = (l + r) >> 1;
		build(l, m, rt << 1);
		build(m+1, r, rt << 1 | 1);
	}
	void pushdown(int rt){
		if(tree[rt].add){
			tree[rt << 1].add += tree[rt].add;
			tree[rt << 1].sum += (tree[rt << 1].r - tree[rt << 1].l + 1) * tree[rt].add;
			tree[rt << 1 | 1].add += tree[rt].add;
			tree[rt << 1 | 1].sum += (tree[rt << 1 | 1].r - tree[rt << 1 | 1].l + 1) * tree[rt].add;
			tree[rt].add = 0;
		}
	}
	ll query(int L, int R, int rt){
		if(L <= tree[rt].l && tree[rt].r <= R)
			return tree[rt].sum;
		pushdown(rt);
		int m = (tree[rt].l + tree[rt].r) >> 1;
		ll ret = 0;
		if(L <= m)
			ret += query(L, R, rt << 1);
		if(m < R)
			ret += query(L, R, rt << 1 | 1);
		return ret;
	}
	void update(int L, int R, ll x, int rt){
		if(L <= tree[rt].l && tree[rt].r <= R){
			tree[rt].sum += (tree[rt].r - tree[rt].l + 1) * x;
			tree[rt].add += x;
			return ;
		}
		pushdown(rt);
		int m = (tree[rt].l + tree[rt].r) >> 1;
		if(L <= m)
			update(L, R, x, rt << 1);
		if(m < R)
			update(L, R, x, rt << 1 | 1);
		pushup(rt);
	}
}tree[3];
int head[MAXN];
struct edge{
	int to, next;
}e[MAXN << 1];
int tot;
void init(){
	memset(head, -1, sizeof(head));
	tot = 0;
}
void add(int u, int v){
	e[tot].to = v;
	e[tot].next = head[u];
	head[u] = tot++;
}
void dfs1(int x, int f){
	dep[x] = dep[f] + 1;
	sz[x] = 1;
	fa[x] = f;
	int maxx = 0;
	for(int i = head[x]; ~i; i = e[i].next){
		int v = e[i].to;
		if(v == f) continue;
		dfs1(v, x);
		sz[x] += sz[v];
		if(sz[v] > maxx){
			maxx = sz[v];
			son[x] = v;
		}
	}
}
void dfs2(int u, int t ){
	top[u] = t;
	dfn[u] = ++tim;
	if(!son[u]) return;
	dfs2(son[u], t);
	for(int i = head[u]; ~i; i = e[i].next){
		int v = e[i].to;
		if(v == fa[u] || v == son[u]) continue;
		dfs2(v, v);
	}
}
int LCA(int x, int y){
	while(top[x] != top[y]){
		if(dep[top[x]] > dep[top[y]]) swap(x, y);
		y = top[y];
		y = fa[y];
	}
	return dep[x] > dep[y] ? y : x;
}
void slove(int x, int y){
	int lca = LCA(x, y);
	ll p = dep[x] + 1;
	int xx = x;
	while(top[x] != top[lca]){
		tree[0].update(dfn[top[x]], dfn[x], 1, 1);
		tree[1].update(dfn[top[x]], dfn[x], -2*p, 1);
		tree[2].update(dfn[top[x]], dfn[x], p*p, 1);
		x = fa[top[x]];
	}
	tree[0].update(dfn[lca], dfn[x], 1, 1);
	tree[1].update(dfn[lca], dfn[x], -2*p, 1);
	tree[2].update(dfn[lca], dfn[x], p*p, 1);
	tree[0].update(dfn[lca], dfn[lca], -1, 1);
	tree[1].update(dfn[lca], dfn[lca], 2*p, 1);
	tree[2].update(dfn[lca], dfn[lca], -p*p, 1);
	p = 2*dep[lca] - dep[xx] - 1;
	while(top[y] != top[lca]){
		tree[0].update(dfn[top[y]], dfn[y], 1, 1);
		tree[1].update(dfn[top[y]], dfn[y], -2*p, 1);
		tree[2].update(dfn[top[y]], dfn[y], p*p, 1);
		y = fa[top[y]];
	}
	tree[0].update(dfn[lca], dfn[y], 1, 1);
	tree[1].update(dfn[lca], dfn[y], -2*p, 1);
	tree[2].update(dfn[lca], dfn[y], p*p, 1);
}
ll query(int x){
	return dep[x] * dep[x] * tree[0].query(dfn[x], dfn[x], 1) +  dep[x] * tree[1].query(dfn[x], dfn[x], 1) + tree[2].query(dfn[x], dfn[x], 1);
}
void solve(){
	init(); 
	cin >> n;
	for (int i = 1; i <= n-1; ++i){
	    int u, v;
		cin >> u >> v;
		add(u, v);
		add(v, u);
	}
	dfs1(1, 1);
	dfs2(1, 1);
	for (int i = 0; i <= 2; ++i){
		tree[i].build(1, n, 1);
	}
	int q;
	cin >> q;
	while(q--){
		int op;
		cin >> op;
		if(op == 1){
			int u, v;
			cin >> u >> v;
			slove(u, v);
		}
		else{
			int x;
			cin >> x;
			cout << query(x) << "\n";
		}
	}
}

int main()
{
    #ifdef ONLINE_JUDGE
    #else
       freopen("in.txt", "r", stdin);
       freopen("out.txt", "w", stdout);
    #endif

    qc;
    int T;
    // cin >> T;
    T = 1;
    while(T--){

        solve();
    }
    return 0;
}

picture again 立即下载

相关推荐

计算机二级通关宝典1计算机二级通关宝典

计算机二级通关宝典1计算机二级通关宝典

【训练题49:树剖 + 线段树标记】I love tree | HDU6962 | 杭电多校二 02题

题意 I love tree | HDU6962 | 杭电多校二 02题 给定一棵树,有 nnn 个节点,每个点初始权值为 000 有 qqq 次操作: 第一种操作,询问点 xxx 的权值 第二种操作,让 x 到 yx\ 到\ yx 到 y 的简单路径增加权值,点与 xxx 的距离为 ddd ,那么权值增加 (d+1)2(d+1)^2(d+1)2 假设某条路径为 {x1,x2,x3,x4,x5}\{x_1,x_2,x_3,x_4,x_5\}{x1​,x2​,x3​,

溢流眼泪的博客 355

AI聚合api网关系统源码+部署教程

AI聚合api网关系统源码+部署教程

杭电2021多校第二场 HDU 6962 I love tree

题面 题目传送门(HDU 6962 I love tree) Given a tree with n nodes and q operations, there are two kinds of operations. 1 a b : for a chain <a, b>, increase the value of x2 to the x-th point on this chain for example the chain from a to b=(x1,x2,x3,x4,x5),aft

东君不爱惜 754

MobaXterm终端工具个人学习版安装包及常用配置备份

资源包含 MobaXterm 个人版的安装包以及日常运维常用的基础配置备份文件。适用于网络工程师及运维人员用于日常的服务器管理、SSH 连接及串口调试。 压缩包内附带了个人整理的软件使用技巧与配置说明(仅供个人学习参考)。请各位同行下载后注意,技术工具请尽量支持官方正版,本资源仅供个人测试与交流使用,切勿用于商业环境。

机械臂的「抽风」自救指南:从万向节死锁到毫米级丝滑抓取

机械臂的「抽风」自救指南:从万向节死锁到毫米级丝滑抓取

JAVA 位操作符

JAVA 位操作符 |(位或): int i=5;//二进制101 int j=6;//二进制110 //i|j 111 =>7 i|j结果转成十进制是7; &(位与): int i=5;//二进制101 int j=6;//二进制110 //i&j 100 =>4 i&j结果转成十进制是4; ^(异或): int i=5;//二进制101 int j=6;//二进制110 //i^j 011 =>3 i^j结果转成十

weixin_45730866的博客 248

科技中介服务机构如何借助平台提升技术撮合服务的专业性与响应速度?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

2021杭电多校第二场 I love counting

I love counting 题目链接 题意 给定一个含有n个元素的数组C。 对这个数组进行查询操作,每次查询给出四个值L、R、a和b。 问L--R之间有多少种ccc​使得,(c 异或 a)≤b(c\ 异或\ a)\le b(c 异或 a)≤b​。(如果Ci=Cj=cC_i=C_j=cCi​=Cj​=c​,则只算作一种) 思路 这道题和思路和杭电第一场的Xor sum很像(01字典树),最好把上一场的补了再看这一题,这一题比上一题更麻烦,因为还得用到树状数组。Xo

Moyan的博客 724

产业园区如何利用AI技术提升科技成果转化服务的响应速度与转化成功率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

11232131231231是的

11232131231231是的

树链剖分 ---- 2021杭电多校 1002 I love tree[详解]

题目链接 题目大意: 就是给你一颗树 树上每个点的初始权值为000 现在有两个操作 <1,a,b><1,a,b><1,a,b>对于aaa到bbb路径上所有点加上到aaa的距离的平方和 <2,a><2,a><2,a>询问aaa点的权值 解题思路: 对于树链上的修改问题我们很容易想到树链剖分 但是怎么对于每个点距离aaa的距离不一样那么累加的权值也不一样怎么办? 首先我们知道对于树链剖分上面的线段树是用时间戳dfn时间戳dfn时间

weixin_45630722的博客 264

基于双向Buck-Boost电路的锂电池储能充电+放电控制Simulink仿真

内容概要:本文档详细介绍了一种基于双向Buck-Boost电路的锂电池储能系统充放电控制的Simulink仿真模型,重点实现了充电与放电过程中双向能量流动的精确控制。通过Simulink平台构建完整的电路拓扑与控制系统,采用电压、电流双闭环控制策略,有效提升了系统的稳定性与能量转换效率。文档不仅提供了详细的仿真建模方法,还结合参考文献增强了理论支撑,具有较高的科研与工程应用价值。此外,文中列举了大量电力电子领域的相关仿真资源,涵盖LLC谐振变换器、PFC电路、PWM整流器、状态估计等多种技术方向,形成了一个综合性强、覆盖面广的技术资料库,便于研究人员拓展学习和复用设计。; 适合人群:电气工程、自动化、新能源等相关专业的研究生、科研人员及从事电力电子系统设计的工程师。; 使用场景及目标:①研究锂电池储能系统的双向能量管理与高效充放电控制策略;②掌握基于Simulink的电力电子系统建模与闭环控制器设计方法;③为科研项目、毕业设计或工程开发提供可复现的仿真案例与技术支持。; 阅读建议:建议结合文档中提供的参考文献与外部资源链接,系统性地学习Buck-Boost电路的工作原理与控制理论,优先理解基础拓扑运行机制后再深入双闭环控制策略的设计与参数整定,同时可参照同系列其他仿真案例进行对比分析与拓展实践。

储能双向Buck-Boost+模型预测电流控制+电压下垂控制仿真【附参考文献】(Simulink仿真实现)

内容概要:本文详细介绍了基于Simulink平台构建的储能双向Buck-Boost变换器仿真模型,重点实现了模型预测电流控制(MPC)与电压下垂控制相结合的先进控制策略。该系统通过精确预测电感电流与动态调节母线电压,有效提升了储能系统在充放电切换过程中的动态响应速度、运行稳定性与抗扰动能力。模型充分考虑了实际应用场景中的非理想因素,结合参考文献进行了算法优化与参数设计,增强了方案的技术可行性与工程实用价值,适用于微电网、分布式能源系统及多储能单元并联运行的能量协调管理。; 适合人群:电气工程、自动化、新能源技术及相关领域的科研人员、研究生以及从事电力电子变换器与智能电网控制系统研发的工程师。; 使用场景及目标:①深入研究双向DC-DC变换器在储能系统中的高性能控制方法;②掌握模型预测控制与下垂控制的协同设计原理及其在复杂工况下的动态调节机制;③为微电网能量管理、多源协同控制、电压频率支撑等关键技术提供可靠的仿真验证平台。; 阅读建议:建议结合提供的Simulink模型与参考文献进行系统学习,重点关注控制器结构设计、预测模型建立及控制参数整定过程,可通过调整负载突变、设定不同工作模式等方式开展仿真实验,深入理解控制策略的鲁棒性与适应性表现。

【Trans论文复现】基于Agent的电力市场深度决策梯度(深度强化学习)算法建模研究(Python代码实现)

内容概要:本文详细介绍了“Plecs全桥LLC谐振变换器仿真模型”这一技术资源,聚焦于利用PLECS仿真工具对隔离型全桥LLC谐振变换器进行建模、参数设计与性能分析。该资源系统阐述了LLC谐振变换器的工作原理,涵盖谐振参数设计、软开关实现机制、效率优化等关键技术环节,并配套提供了完整的仿真模型、设计报告与计算书,便于用户深入理解其在高效率、软开关功率转换中的优势与应用。研究内容不仅支持理论学习,还可用于控制策略的验证与优化设计,具有较强的工程实践价值。; 适合人群:具备电力电子技术基础知识,从事开关电源、高频功率变换器研发及相关领域研究的工程技术人员与高校研究生。; 使用场景及目标:①用于全桥LLC谐振变换器的教学演示与原理学习;②支持科研人员开展高效DC-DC变换器的建模、仿真与优化设计;③为掌握PLECS在电力电子系统仿真中的高级应用提供详实案例。; 阅读建议:建议结合PLECS仿真软件进行实际操作,通过运行仿真模型并对照设计文档,深入理解电路各模块功能、参数设置依据及软开关实现条件,重点关注谐振腔参数对系统效率与动态响应的影响,以全面提升对LLC变换器工作特性的认知水平与工程设计能力。

三电平维也纳VIENNA双闭环控制整流器仿真(Simulink仿真实现)

内容概要:本文档系统介绍了“三电平维也纳VIENNA双闭环控制整流器”的Simulink仿真资源,重点涵盖电压电流双闭环控制、中点电位平衡控制及SVPWM调制等核心技术,服务于高精度电力电子系统的建模与优化。资源包不仅包含三相维也纳整流器、双有源桥DAB变换器、LLC谐振变换器等多种典型拓扑的仿真模型,还整合了Mathcad计算书、参考文献、MATLAB代码及设计报告等配套材料,突出科研复现与工程设计双重价值。特别针对控制策略优化、软开关技术实现、最小应力控制等前沿方向提供顶级EI期刊级别的复现案例,强化理论深度与实践指导意义。; 适合人群:面向具备电力电子、自动控制或电气工程等相关专业背景的研究生、科研人员及从事新能源、电力变换系统开发的工程技术人员,尤其适合正在进行高性能整流器与DC-DC变换器研究的专业人士。; 使用场景及目标:①支持高校与科研机构在三电平整流器、功率因数校正(PFC)、DC-DC变换器等领域开展控制系统建模与算法验证;②助力高质量学术论文复现(如EI/SCI期刊)、硕士/博士课题研究、毕业设计及企业级项目开发;③深入掌握SVPWM调制、双闭环动态调节、中点电位平衡控制等关键电力电子控制技术的实现机制与参数整定方法。; 阅读建议:建议结合提供的完整资源目录循序渐进地学习,优先研读控制框图与数学建模部分,理解控制逻辑与参数设计原理后,再通过Simulink平台进行仿真实验与参数调试,注重理论推导与仿真结果的对比分析,全面提升科研创新能力与工程实践能力。

【用于无人机控制的深度强化学习】使用深度确定性策略梯度通过连续状态空间中的过渡来控制倾转旋翼无人机(Matlab代码实现)

内容概要:本文围绕Plecs全桥LLC谐振变换器的仿真模型展开,重点介绍了基于Plecs或Simulink平台构建的全桥LLC谐振变换器的建模方法与仿真分析过程。内容涵盖LLC谐振变换器的工作原理、关键参数设计、PFM(脉冲频率调制)控制策略的实现,以及谐振腔的精确建模与仿真验证。通过该仿真模型,可深入分析变换器在不同负载条件下的效率表现、软开关实现情况、电压增益特性及动态响应性能,适用于高频高效电源系统的设计与优化。文档还配套提供了完整的仿真模型、设计报告与计算书等参考资料,有助于读者系统掌握LLC变换器的设计流程与工程应用要点。; 适合人群:具备电力电子与电源变换基础知识,从事高频开关电源、DC-DC变换器设计等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于高校科研中LLC谐振变换器的建模与先进控制策略研究;②指导企业研发人员完成高效率电源产品的仿真验证与优化设计;③作为电力电子技术课程的教学案例,帮助学生理解谐振变换器的动态特性、软开关机理与系统级仿真方法。; 阅读建议:建议读者结合所提供的仿真模型与设计文档,逐步搭建并调试全桥LLC变换器系统,重点关注谐振参数的匹配原则、PFM控制逻辑的实现细节以及软开关的实现条件,并通过对比不同工况下的仿真结果,深入分析控制策略对系统效率与动态性能的影响,以实现理论学习与工程实践的深度融合。

jp-host-release.apk

jp-host-release.apk

上一篇: dfs序与树链剖分
下一篇: 树上启发式合并(dsu on tree)
Linda_yezi_coder
博客等级 码龄7年 20粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值