首页 > 其他分享 >NOI2023 D2T1 贸易

NOI2023 D2T1 贸易

时间:2023-09-07 13:33:50浏览次数:37  
标签:sz dep sum rightsquigarrow int NOI2023 贸易 dis D2T1

图中不存在横插边,\(u \rightsquigarrow v\) 可拆成 \(u \rightsquigarrow \operatorname{lca}(u, v) \rightsquigarrow v\) 计算。

对 \(u \rightsquigarrow \operatorname{lca}(u, v)\),不可能走第二类道路,树形 DP 统计每条边被经过的次数并累加答案即可,时间复杂度 \(\mathcal O(2^n)\)。

具体地,令 \(sum(u)\) 表示点 \(u\) 对答案的贡献,则有 \(sum(fa_u) \gets sum(u) + sz_u \times a_u\)。

瓶颈在 \(\operatorname{lca}(u, v) \rightsquigarrow v\) 上。

令 \(f(u, k)\) 表示从点 \(u\) 深度为 \(k\) 的祖先出发到 \(u\) 的最短路长度。

对于每一条第二类边 \(x \to y\),它能更新满足 \(v \rightsquigarrow x \to y \rightsquigarrow u(dep_y > dep_u > dep_v > dep_x)\) 的 \(f(u, dep_v)\),即 \(f(u, dep_v) = d_{u, x} + w_{x, y} + d_{y, v}\)。

时间复杂度 \(\mathcal O(n^2m)\)。

同时有 ,类似于 Floyd,时间复杂度 \(\mathcal O(2^nn^2)\) 。

统计 \(fa_v \rightsquigarrow u\) 的答案时,有 \(ans \gets f(u, dep_v - 1) \times (sz_v + 1) + sum(v \oplus 1) + sz_{v \oplus 1} \times a_{v \oplus 1}\),其中 \(\oplus\) 为 按位异或,时间复杂度 \(\mathcal O(2^n n)\)。

总时间复杂度为 \(\mathcal O(2^nn^2)\)。

Bonus

本题中可以利用 \(dep_u = \log_2 u\) 和 \(sz_u = 2^{n - dep_u} - 1\) 来递推处理,去掉 dfs 带来的常数,同时代码也更精简。

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int MAXN = 18, MOD = 998244353;

int n, m, a[1 << MAXN], dep[1 << MAXN], sz[1 << MAXN];
ll dis[1 << MAXN], sum[1 << MAXN], f[1 << MAXN][MAXN];

int main() {
	ios_base::sync_with_stdio(0); cin.tie(nullptr), cout.tie(nullptr);
	cin >> n >> m; int tot = (1 << n) - 1; sz[1] = (1 << n) - 1;
	for (int i = 2; i <= tot; i++) {
		cin >> a[i], dis[i] = dis[i >> 1] + a[i];
		dep[i] = dep[i >> 1] + 1, sz[i] = (1 << (n - dep[i])) - 1;
	}
	for (int i = tot; i >= 2; i--) sum[i >> 1] += sum[i] + 1ll * sz[i] * a[i];
	memset(f, 0x3f, sizeof(f));
	while (m--) {
		int x, y, w;
		cin >> x >> y >> w;
		for (int v = y; v > x; v >>= 1) {
			for (int u = (v >> 1); u >= x; u >>= 1) {
				f[v][dep[u]] = min(f[v][dep[u]], dis[u] - dis[x] + w + dis[y] - dis[v]);
			}
		}
	}
	for (int u = 1; u <= tot; u++) {
		for (int v = (u >> 1); v; v >>= 1) {
			for (int k = dep[v] - 1; k >= 0; k--) {
				f[u][k] = min(f[u][k], f[u][dep[v]] + f[v][k]);
			}
		}
	}
	ll ans = 0;
	for (int u = tot; u; u--) {
		(ans += sum[u]) %= MOD;
		for (int v = u; v > 1; v >>= 1) {
			if (f[u][dep[v] - 1] < f[0][0]) (ans += f[u][dep[v] - 1] % MOD * (sz[v] + 1) + sum[v ^ 1] + 1ll * sz[v ^ 1] * a[v ^ 1]) %= MOD;
		}
	}
	cout << ans;
	return 0;
}

标签:sz,dep,sum,rightsquigarrow,int,NOI2023,贸易,dis,D2T1
From: https://www.cnblogs.com/chy12321/p/17684605.html

相关文章

  • “指针跃动”受邀参加全球贸易服务峰会
    “指针跃动”受邀参加全球贸易服务峰会有“服”同享共赢未来引子在全球化日益盛行的今天,贸易不再仅仅是物质的交流,更涉及到服务、理念、文化和科技的共享。中国国际服务贸易交易会全球贸易服务峰会,就是这个趋势的集中体现。在这次峰会上,“指针跃动”受邀参加中国......
  • NOI2023Day2T2
    \(36pts\)\(O(tqn^2)\)暴力即可\(40pts\)对于最朴素的暴力优化,从头到尾扫,如果已经当前位字符比出优先级,那么直接能判断了,没必要往后跑了,第15个性质B的也给跑过了,我没料到,不过数据强一点其实和20pts没区别\(性质A(60pts)\)没有想出来\(性质B(72pts)\)写这个性质只有12pts,但......
  • 基于springboot的贸易行业crm系统
    随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了基于springboot的贸易行业crm系统的开发全过程。通过分析基于springboot的贸易行业crm系统管理的不足,创建了一个计算机管理基于springboot的贸易行业crm系统的方案。文章介绍了基于spr......
  • (PC+WAP)汽车贸易网站源码 货物运输快递物流网站pbootcms模板
    PbootCMS内核开发的网站模板,该模板适用于货物运输、汽车贸易、快递物流等企业,当然其他行业也可以做,只需要把文字图片换成其他行业的即可;PC+WAP,同一个后台,数据即时同步,简单适用!附带测试数据!       材料自取,免费下载:提取码:ckib  友好的seo,所有页面均都能完全自定义......
  • 【NOI2023】合并书本
    Description传送门SolutionPart1考虑一棵合并树,令\(ls_u,rs_u\)表示\(u\)的左右儿子,\(d_u\)表示\(u\)子树的最大深度,\(c_u\)表示\(u\)被合并的次数,令所有非叶非根节点对应\(2^d-1\)的和为\(S\),则答案为\(\sum_{i=1}^nc_iw_i+S\)。可以发现,我们只关心\(c......
  • 各省数字贸易指数数据计算(peek获取与next传值的使用)
    需求:工作中需要计算各省数字贸易指数数据,需要首先利用peek获取栈顶元素,然后通过n.next进行顶端元素传值,最后利用综合指数法来进行合一计算和存储,用于后续的深度数据挖掘。解决:classNode(object):definit(self,val):self.val=val#指向元素的值self.next=NoneclassSt......
  • 全球贸易集成平台震撼上线,免费试用赢取精美礼品
    全球贸易行业一直以来都面临着各种挑战和复杂的操作流程。然而,随着科技的不断进步和跨境贸易的日益发展,一个集物流服务、外贸服务、供应商管理和企业风控管理于一体的全新跨境贸易集成平台AnyCase4.0应运而生。经过多年的沉淀和精心打磨,AnyCase4.0以其全面升级的功能和便捷的操作体......
  • lg9483 [NOI2023] 合并书本
    考虑对合并过程建一棵树。对于一个点\(x\),定义\(a_x\)表示它向上合并的时候,对答案造成的重量贡献的系数。定义一个点的层级\(d_x\)为它的两个儿子层级的较大值\(+1\)。我们称\(d\)更小的层级为更深的层级。那么层级为\(i\)的非根非叶子节点会对答案造成\(2^i-1\)的......
  • NOI2023 打金记
    扔到cnblogs上。##Day-4最后一场模拟赛,肯定要用力打啊!然而一题不会,呜呜呜。于是开始拼暴力,写了$90+60+60=210$,结果挂成$40+60+60=160$。T1我将题目转化为:对于一个排列,每次只改动三个位置,要求某个数的出现位置,我用了fhq-treap!维护一个桶就好了,不知道自己......
  • NOI2023 题解
    打的太shaber了,于是补补题。D1T1扫描线。首先我们可以容斥一下,答案为被一种操作覆盖到的减去被两种操作覆盖到的加上被三种操作覆盖到的。首先考虑只被一种操作覆盖到的,这很简单,直接上个区间颜色段推平就好了,顺便去了个重。接下来是有被斜线覆盖到的,这样的点数为\(O(nk)\)......