首页 > 其他分享 >[NOI2023] 贸易

[NOI2023] 贸易

时间:2023-12-18 19:22:22浏览次数:29  
标签:ch int dis NOI2023 ls 贸易 now mod

题意:

给定一棵深度为 \(n\) 的完美二叉树,根节点为 \(1\),对于所有非 \(1\) 的点,都有一条连到其父亲的边权为 \(a_i\) 的单向边,除此之外,还给定了 \(m\) 条单向边(\(u \rightarrow v)\),边权为 \(w\),保证 \(u\) 是 \(v\) 的祖先,求 \(\sum_{i=1}^{2^n-1}\sum_{j=1}^{2^n-1}dis(i,j)\),其中 \(dis(i,j)\) 表示 \(i\) 到 \(j\) 的最短路,如果无法到达,则 \(dis(i,j)=0\)。

\(n \le 18\)。

分析:

考虑枚举每个点 \(x\),然后快速统计到达其的最短路之和,即 \(\sum dis(y,x)\)。

  • \(y\) 在 \(x\) 的子树内,这是简单的,显然 \(y\) 只会走树边。记 \(g(u)\) 表示 \(u\) 子树内的所有点到 \(u\) 的最短路之和。不难发现 \(g(u) = g(ls) \times a_{ls} \times siz_{ls} + g(rs) \times a_{rs} \times siz_{rs}\)。
  • \(y\) 不在 \(x\) 的子树内,此时 \(y\) 只能通过 \(y \rightarrow lca(x,y) \rightarrow x\) 的路径到达,因此在 \(lca\) 处统计答案。而 \(y \rightarrow lca(x,y)\) 只会走树边,可以用 \(g\) 来计算;而 \(lca(x,y) \rightarrow x\) 则是一类边与二类边混合起来走,看起来不好处理,但这棵树的深度最多只有 \(18\),这就意味着我们暴力跑 dijstra 是不会超时的,因为每个点最多只会被遍历 \(18\) 次。

时间复杂度 \(O(n^22^n)\)。

代码:

#include<bits/stdc++.h>
#define int long long
#define N 1000006 
#define mod 998244353
using namespace std;
int read() {
	int x = 0, f = 1; char ch = getchar();
	while(ch < '0' || ch > '9') { if(ch == '-') f = -1; ch = getchar(); }
	while(ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
	return x * f;
}
void write(int x) {
	if(x < 0) putchar('-'), x = -x;
	if(x > 9) write(x / 10);
	putchar('0' + x % 10);
}
int n, m, ans;
int a[N];
struct edge{
	int to, w;
};
vector<edge>G[N];
int h[N], f[20][N], g[N];
bool vis[N];
int siz[N], Begin[N], End[N], dep[N], z[N], cnt; 
void dfs1(int x) {
	Begin[x] = ++cnt; z[cnt] = x;
	siz[x] = 1; dep[x] = dep[x / 2] + 1;
	int ls = x * 2, rs = x * 2 + 1;
	if(ls <= n) {
		dfs1(ls);
		g[x] = (g[x] + (g[ls] + siz[ls] * a[ls] % mod) % mod) % mod;
		siz[x] += siz[ls];
	}
	if(rs <= n) {
		dfs1(rs);
		g[x] = (g[x] + (g[rs] + siz[rs] * a[rs] % mod) % mod) % mod;
		siz[x] += siz[rs];
	}
	End[x] = cnt;
}
struct node{
	int v, w;
	friend bool operator < (node x, node y) {
		return x.w > y.w;
	}
};
void dijstra(int s, int dis[]) {
	for(int i = Begin[s]; i <= End[s]; i++) {
		vis[z[i]] = 0;
		dis[z[i]] = 1e18;
		dis[z[i]] = min(dis[z[i]], f[dep[s / 2]][z[i]] + a[s]);
	}
	priority_queue<node>Q;
	dis[s] = 0; Q.push((node){s, 0});
	while(!Q.empty()) {
		int x = Q.top().v;
		Q.pop();
		if(vis[x]) continue;
		vis[x] = 1;
		for(auto r : G[x]) {
			int y = r.to;
			if(dis[y] > dis[x] + r.w) {
				dis[y] = dis[x] + r.w;
				Q.push((node){y, dis[y]});
			}
		}
		int y = x / 2;
		if(y < 1) continue;
		if(dis[y] > dis[x] + a[x]) {
			dis[y] = dis[x] + a[x];
			Q.push((node){y, dis[y]});
		}
	}
}
void dfs2(int x) {
	int now = x;
	while(now != 1) {
		if(f[dep[now / 2]][x] == 1e18) break;
		int P = (g[now / 2] - g[now] + mod - siz[now] * a[now] % mod + mod) % mod + f[dep[now / 2]][x] * (siz[now / 2] - siz[now]) % mod;
		h[x] = (h[x] + P % mod) % mod;
		now /= 2;
	}
	dijstra(x, f[dep[x]]);
	int ls = x * 2, rs = x * 2 + 1;
	if(ls <= n) dfs2(ls);
	if(rs <= n) dfs2(rs);
}
signed main() {
    n = read(), m = read();
    n = (1 << n) - 1;
    for(int i = 1; i <= n; i++) f[0][i] = 1e18;
    for(int i = 2; i <= n; i++) a[i] = read();
    for(int i = 1, u, v, w; i <= m; i++) {
    	u = read(), v = read(), w = read();
    	G[u].push_back((edge){v, w});
	}
	dfs1(1);
	dfs2(1);
	for(int i = 1; i <= n; i++) ans = (ans + (h[i] + g[i]) % mod) % mod;
	write(ans);
	return 0;
}

标签:ch,int,dis,NOI2023,ls,贸易,now,mod
From: https://www.cnblogs.com/xcs123/p/17912033.html

相关文章

  • 亚马逊跨境电商迎来发展黄金期,中国数字贸易规模首破2万亿元
    在11月23日的第二届全球数字贸易博览会开幕式上,商务部发布了备受瞩目的《中国数字贸易发展报告(2022)》,其中揭示了令人瞩目的数字贸易发展数据。报告显示,2022年,中国跨境电商进出口规模首次突破2万亿元,为亚马逊等电商平台带来了前所未有的发展机遇。《报告》指出,中国数字贸易总规模再......
  • 最优贸易
    P1073[NOIP2009提高组]最优贸易我们考虑一个中间点,求出从\(1\)出发到它的最小买入价,从它到\(n\)的最大卖出价。(从它到\(n\)的求解是在反向图中从\(n\)开始跑)可以发现,这个做法是不会遗漏情况的。这个问题很像最短路问题,但是注意它第一次得到的答案并不是最终答案,所以......
  • NOI2023 D1T2 桂花树
    称编号\(>n\)的点为新点。由条件1可以推出树\(T\)为结点\(1\simn\)在树\(T'\)上的虚树。由条件2可以推出\(\forall1\leu<v\len+m,\operatorname{lca}(u,v)\lev+k\)。首先考虑\(k=0\)的做法:此时\(\forall1\leu<v\len+m,\operat......
  • 全球贸易紧张局势下,现货黄金能否成为避险资产
    随着全球贸易紧张局势的不断升级,投资者寻求避险资产的需求也逐渐增加。在这种背景下,现货黄金是否能够成为一个可靠的避险资产备选方案呢?本文将从几个方面探讨现货黄金作为避险资产的前景。第一:黄金历史上的避险属性黄金具有长期以来被认为是避险资产的特性。在不稳定的全球经济......
  • noi2023游记
    前情提要tjD类什么垃圾不用我说了吧。Day-1到场了,挺热的。和两位同校巨佬分到了一个宿舍还有一位E类都比我强/kel中午和三位同校巨佬还有教练去外面吃了一顿火锅,选的微辣但是我还是有点接受不了。北方人没吃过油碟。没有麻酱我们都有点奇怪。幸亏有冰红茶解辣。成......
  • NOI2023 D2T1 贸易
    图中不存在横插边,\(u\rightsquigarrowv\)可拆成\(u\rightsquigarrow\operatorname{lca}(u,v)\rightsquigarrowv\)计算。对\(u\rightsquigarrow\operatorname{lca}(u,v)\),不可能走第二类道路,树形DP统计每条边被经过的次数并累加答案即可,时间复杂度\(\mathcalO(2......
  • “指针跃动”受邀参加全球贸易服务峰会
    “指针跃动”受邀参加全球贸易服务峰会有“服”同享共赢未来引子在全球化日益盛行的今天,贸易不再仅仅是物质的交流,更涉及到服务、理念、文化和科技的共享。中国国际服务贸易交易会全球贸易服务峰会,就是这个趋势的集中体现。在这次峰会上,“指针跃动”受邀参加中国......
  • 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,所有页面均都能完全自定义......