注视一切的终结

2023-10-19 07:36
文章标签 终结 注视

本文主要是介绍注视一切的终结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

注视一切的终结

文章目录

  • 注视一切的终结
    • 题目大意
    • 思路
    • code

题目大意

给出一个 n n n 个点 m m m 条边的图,每条边有一个颜色 w i w_i wi 。保证这个图删除了所有重边后变成一棵树

一条路径的权值就是相邻的两条边的 w i w_i wi 值不相同的个数

Q Q Q 次询问,每次询问给出两个点 x , y x , y x,y ,求 x x x y y y 的所有简单路径的权值的最大值

简单路径:路径上的所有顶点不重复。

思路

倍增、 d p dp dp

显然,对于两个点之间的边,我们只用维护至多 3 3 3 种不同颜色的就可以了

d p x , i , a , b dp_{x , i , a , b} dpx,i,a,b 表示一条 x x x 到距离它的 2 i 2^i 2i 距离的祖先的一条路径,靠近 x x x 的那一端的颜色是 a a a x x x 2 i 2 ^ i 2i 级祖先上面的那条边是 b b b 的路径的最大权值。

那么
f x , 0 , a , b = ( c o l a ≠ c o l b ) f_{x , 0 , a , b} = (col_a \neq col_b) fx,0,a,b=(cola=colb)
转移是枚举 x , y = f a x , i − 1 , z = f a x , i x,y = fa_{x , i - 1} , z = fa_{x , i} x,y=fax,i1,z=fax,i ,颜色分别设为 a , b , c a , b , c a,b,c ,则转移为 f x , i , a , b = max ⁡ { f x , i − 1 , a , b + f y , i − 1 , b , c } f_{x , i , a , b} = \max\{f_{x , i - 1 , a , b} + f_{y , i - 1 , b , c}\} fx,i,a,b=max{fx,i1,a,b+fy,i1,b,c}

对于每个询问 x , y x , y x,y

设他们的 l c a lca lca 的儿子节点分别是 f x , f y fx , fy fx,fy ,分别求出 c x i , c y j cx_i , cy_j cxi,cyj 表示 f x , f y fx , fy fx,fy l c a lca lca 的所有不同颜色的边的最大权值。

若其中一个点是 l c a lca lca ,那么答案就是另一个点的最大值,否则再枚举一遍 l c a lca lca 下两条边的颜色 a n s = max ⁡ { c x a + c y b + ( c o l a ≠ c o l b ) } ans = \max\{cx_a +cy_b + (col_a \neq col_b)\} ans=max{cxa+cyb+(cola=colb)}

代码超级难调

code

#include <bits/stdc++.h>
#define fu(x , y , z) for(int x = y ; x <= z ; x ++)
#define fd(x , y , z) for(int x = y ; x >= z ; x --)
using namespace std;
const int N = 5e5 + 5 , M = 1e6 + 5;
int ecnt , hd[N] , fa[N][21] , dep[N] , vis[N] , cnt[N] , col[N][4] , f[N][21][4][4] , n , m;
struct E {int to , nt , w;
} e[M << 1];
void add (int x , int y , int z) { e[++ecnt].to = y , e[ecnt].w = z , e[ecnt].nt = hd[x] , hd[x] = ecnt; }
int Lca (int x , int y) {if (dep[x] < dep[y]) swap (x , y);fd (i , 20 , 0) if (dep[fa[x][i]] >= dep[y])x = fa[x][i];if (x == y) return x;fd (i , 20 , 0) if (fa[x][i] != fa[y][i])x = fa[x][i] , y = fa[y][i];return fa[x][0];
}
void dfs1 (int x) {vis[x] = 1;fu (i , 1 , 20) fa[x][i] = fa[fa[x][i - 1]][i - 1];int y;for (int i = hd[x] ; i ; i = e[i].nt) {y = e[i].to;if (y == fa[x][0]) {if (cnt[x] == 3) continue;int flg = 0;fu (j , 1 , cnt[x]) if (col[x][j] == e[i].w) {flg = 1;break;}if (flg) continue;col[x][++cnt[x]] = e[i].w;}if (vis[y]) continue;dep[y] = dep[x] + 1;fa[y][0] = x;dfs1 (y);}
}
void dfs2 (int x) {vis[x] = 1;int y;if (x != 1) {y = fa[x][0];fu (j , 1 , cnt[x]) fu (k , 1 , cnt[fa[x][0]])f[x][0][j][k] = (col[x][j] != col[fa[x][0]][k]); }int z;for(int i=1;(1<<i)<=dep[x];i++) {y = fa[x][i - 1] , z = fa[x][i];fu (a , 1 , cnt[x]) {fu (b , 1 , cnt[y]) {fu (c , 1 , cnt[z]) {f[x][i][a][c] = max (f[x][i][a][c] , f[x][i - 1][a][b] + f[y][i - 1][b][c]);}}}}for (int i = hd[x] ; i ; i = e[i].nt) {y = e[i].to;if (vis[y]) continue;dfs2 (y);}
}
int jump (int x , int d , int c[]) {int cc[5] , y;fd (i , 20 , 0) {if (dep[fa[x][i]] > d) {y = fa[x][i];memset (cc , 0 , sizeof (cc));fu (a , 1 , cnt[x])fu (b , 1 , cnt[y])cc[b] = max (cc[b] , c[a] + f[x][i][a][b]);x = fa[x][i];memcpy (c , cc , sizeof (cc));}}return x;
}
int main () { // freopen ("a.in" , "r" , stdin);// freopen ("c.out" , "w" , stdout);int u , v , w;scanf ("%d%d" , &n , &m);fu (i , 1 , m) {scanf ("%d%d%d" , &u , &v , &w);add (u , v , w) , add (v , u , w);}dep[1] = 1;dfs1 (1);fu (i , 1 , n) vis[i] = 0;dfs2 (1);int T , x , y , lca , fx , fy , cx[5] , cy[5] , ans;scanf ("%d" , &T);int ans1 =  0;while (T --) {memset (cx , 0 , sizeof (cx)) , memset (cy , 0 , sizeof (cy));fx = fy = 0;scanf ("%d%d" , &x , &y);lca = Lca (x , y);if (x != lca) fx = jump (x , dep[lca] , cx);if (y != lca) fy = jump (y , dep[lca] , cy);ans = 0;if (x == lca)fu (i , 1 , cnt[fy]) ans = max (ans , cy[i]);else if (y == lca) fu (i , 1 , cnt[fx])ans = max (ans , cx[i]);else {fu (i , 1 , cnt[fx]) {fu (j , 1 , cnt[fy]) {ans = max (ans , cx[i] + cy[j] + (col[fx][i] != col[fy][j]));}}} printf ("%d\n" , ans);}return 0;
}

这篇关于注视一切的终结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/238322

相关文章

通过Dot1q终结子接口实现VPN接入

通过Dot1q终结子接口实现VPN接入 通过Dot1q终结子接口接入PWE3/VLL/VPLS 如图1所示,某企业不同分支跨运营商的PWE3/VLL/VPLS网络互联,PE作为运营商的边缘设备,通过子接口接入各分支网络,CE发往PE的业务数据报文携带一层或两层VLAN Tag。不同分支用户要求互通。 图1 Dot1q终结子接口接入PWE3/VLL/VPLS示意图 在PE1和PE2的

GC终结标记 SuspendEE 是怎么回事

一:背景 1. 讲故事 写这篇是起源于训练营里有位朋友提到了一个问题,在 !t -special 输出中有一个 SuspendEE 字样,这个字样在 coreclr 中怎么弄的?输出如下: 0:000> !t -specialThreadCount: 3UnstartedThread: 0BackgroundThread: 2PendingThread: 0De

AI与音乐:共创未来还是艺术终结?

随着人工智能技术的不断进步,AI在音乐创作领域的应用已经成为了一个不可忽视的现象。最近一个月,一系列音乐大模型的推出,不仅极大地降低了普通人创作音乐的门槛,也引发了关于音乐产业未来的广泛讨论。AI是否正在创造音乐的新纪元,还是正在逐渐毁掉这一艺术形式?本文将深入探讨人工智能和音乐人的合作模式,讨论AI在音乐创作中的辅助作用,以及如何实现人机共同创作的可能性。 AI与音乐人的合作模式 在探讨

AI与音乐:创造的新纪元还是艺术的终结?

随着人工智能技术的飞速发展,AI在音乐创作领域的应用已经成为了一个热门话题。最近一个月,一系列音乐大模型的推出,不仅极大地降低了普通人创作音乐的门槛,也引发了关于音乐产业未来的广泛讨论。AI是否正在创造音乐的新纪元,还是正在逐渐毁掉这一艺术形式? AI音乐的崛起 AI在音乐创作中的应用,首先由一些精英创业公司引领,随后大型科技企业也纷纷加入这一领域。这些公司开发的音乐大模型,能够通过学习大量的

AI与音乐:共创未来乐章还是终结艺术的颂歌?

目录 引言 AI在音乐创作中的创新应用 1. 数据分析与智能作曲 示例代码:使用Magenta库生成音乐 2. 实时创作与交互 3. 辅助创作与灵感激发 AI对音乐艺术的潜在威胁 1. 标准化与同质化 2. 版权与伦理问题 3. 替代人类音乐家 平衡与共存 1. 个性化与定制化的音乐体验 2. 跨领域融合与创新 3. 教育与普及的推进 4. 社会与文化的反思 5

Python学习笔记11:入门终结篇

前言 入门知识到这里基本结束了,这里主要讲一下input和range。这两个讲完,讲讲后面进阶学些啥。 range函数 之前将循环的时候讲过一点,这个函数是Python内置的函数,主要用来生成一系列数字,简单方便。 这里重新,正式一点的讲一下。 概念 range是一个内置函数,用于生成一个整数序列,它提供了一种高效的方式来创建循环计数器。 基本用法 range(stop):生成从0开

英伟达与斯坦福携手,打造未来全息XR眼镜:头带时代的终结

在XR(扩展现实)技术的演进过程中,一个显著的挑战在于如何平衡设备的便携性与视觉体验。传统的XR设备由于需要厚重的头带固定光学器件和显示器,不仅增加了体积,还为用户带来了社交上的不便。然而,随着英伟达与斯坦福大学戈登·韦茨斯坦教授领导的研究团队的合作,这一难题似乎找到了解决之道——全息XR眼镜的诞生预示着头带时代的终结。 全息XR眼镜的核心在于其独特的光学设计,它遵循一条重要规则:显示器应尽可能

Java利用递归实现查找树的节点的所有子节点和所有的终结节点

这是商品管理页面. 商品分类是:大类-->一级分类-->二级分类-->品牌-->产品. 有一个需求是,当我只选择了大类(手机/数码/配件)和一级分类(手机通讯),我希望商品展示页面能够展示手机通讯下面所有的产品. 也就是说需要寻找分类表里手机通讯下的品牌分类节点. 分类表是树形结构. 本来想用MySQL的函数或者存储过程实现.但是感觉操作数据比较麻烦,不好写,当然原因是我不太精通

终结国企虚假贸易:监管闭环下的关系排查与风控增强

2024年5月28日,国务院正式公布《国有企业管理人员处分条例》(以下简称《条例》),将于2024年9月1日起施行。作为国家经济的重要支柱,国有企业的管理人员在企业运营中扮演着至关重要的角色,《条例》的颁布,将进一步加强对国有企业管理人员的管理与监督、加强企业国有资产管理并防止国有资产流失。 专家指出,国企改革过程中的一些“硬要求”也被写入了《条例》,包括“十不准”(融资性贸易、虚假贸易

终结android开发关于R文件的报错

开发环境是eclipse,报错显示     Description Resource Path Location Type Unparsed aapt error(s)! Check the console for output.     一般就是新建的layout或者控件啥的不能在R文件自动生成。     网上搜索各种答案基本上都是,单击project--->clean 然后