题解

这题很明显发现一个点到另一个点,必然最多只有一个进入下界的点和一个出来的点

分类讨论入点和出点的位置

要么都在 \(u->lca\) 或都在 \(lca->v\) 或分别有一个

那就有一个倍增做法

维护最优入点和最优出点即可

但考场并没想到这种方法

反而只想到了没脑的倍增维护矩阵转移的方法

我们设 \(f_{u,0/1}\) 表示从它的儿子 \(v\) 过来的最优答案

把转移式子写成矩阵的形式,倍增维护即可

但我的常数太大了,沦为和暴力老哥同分

\(Code\)

#pragma GCC optimize(3)
#pragma GCC optimize("inline")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse3","sse2","sse")
#pragma GCC diagnostic error "-std=c++14"
#pragma GCC diagnostic error "-fwhole-program"
#pragma GCC diagnostic error "-fcse-skip-blocks"
#pragma GCC diagnostic error "-funsafe-loop-optimizations"
#pragma GCC optimize("fast-math","unroll-loops","no-stack-protector","inline")
#include<cstdio>
#include<iostream>
#define LL long long
using namespace std; const int N = 2e5 + 5;
int n;
LL a[N]; inline void read(int &x)
{
x = 0; int f = 1; char ch = getchar();
while (ch < '0' || ch > '9') f = (ch == '-' ? -1 : f), ch = getchar();
while (ch >= '0' && ch <= '9') x = (x<<3) + (x<<1) + ch - '0', ch = getchar();
x *= f;
}
inline void read(LL &x)
{
x = 0; int f = 1; char ch = getchar();
while (ch < '0' || ch > '9') f = (ch == '-' ? -1 : f), ch = getchar();
while (ch >= '0' && ch <= '9') x = (x<<3) + (x<<1) + ch - '0', ch = getchar();
x *= f;
} int h[N], tot;
struct edge{int to, nxt; LL w;}e[N << 1];
inline void add(int x, int y, LL z){e[++tot] = edge{y, h[x], z}, h[x] = tot;} const LL INF = 1e18;
struct Matrix{
LL a[3][3];
inline Matrix()
{
for(register int i = 0; i < 3; i++)
for(register int j = 0; j < 3; j++) a[i][j] = INF;
}
inline Matrix operator * (const Matrix &b)
{
Matrix c;
for(register int i = 0; i < 3; i++)
for(register int j = 0; j < 3; j++)
for(register int k = 0; k < 3; k++)
c.a[i][j] = min(c.a[i][j], a[i][k] + b.a[k][j]);
return c;
}
}f[N][20];
inline Matrix I()
{
Matrix c;
c.a[0][0] = c.a[1][1] = c.a[2][2] = 0;
return c;
}
inline Matrix BOT(int u)
{
Matrix c;
c.a[0][0] = c.a[1][0] = 0, c.a[2][0] = a[u];
return c;
}
inline Matrix Node(int u, int v, LL w)
{
Matrix c;
c.a[0][0] = 8 * w, c.a[0][1] = w + a[u] + a[v], c.a[0][2] = a[u] + w;
c.a[1][0] = 8 * w, c.a[1][1] = w + a[u] + a[v], c.a[1][2] = a[u] + w;
c.a[2][0] = 8 * w + a[u], c.a[2][1] = w + a[v], c.a[2][2] = w;
return c;
} int dep[N], anc[N][20], d[N];
void bfs()
{
int head = 0, tail = 1;
d[1] = 1;
while (head < tail)
{
int x = d[++head];
for(register int i = 1; i <= 18; i++)
if (anc[x][i - 1]) anc[x][i] = anc[anc[x][i - 1]][i - 1], f[x][i] = f[anc[x][i - 1]][i - 1] * f[x][i - 1];
else break;
for(register int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == anc[x][0]) continue;
anc[v][0] = x, f[v][0] = Node(x, v, e[i].w);
dep[v] = dep[x] + 1, d[++tail] = v;
}
}
}
inline LL getans(int x, int y)
{
if (dep[x] < dep[y]) swap(x, y);
int deep = dep[x] - dep[y];
Matrix retx = I(), rety = I(), Bx = BOT(x), By = BOT(y);
for(register int i = 18; i >= 0; i--)
if ((deep >> i) & 1) retx = f[x][i] * retx , x = anc[x][i];
if (x == y)
{
retx = retx * Bx;
return min(retx.a[0][0], retx.a[2][0] + a[x]);
}
for(register int i = 18; i >= 0; i--)
if (anc[x][i] ^ anc[y][i])
{
retx = f[x][i] * retx , rety = f[y][i] * rety;
x = anc[x][i], y = anc[y][i];
}
retx = f[x][0] * retx * Bx, rety = f[y][0] * rety * By;
return min(min(retx.a[0][0] + rety.a[0][0], retx.a[2][0] + rety.a[2][0]),
min(retx.a[0][0] + rety.a[2][0] + a[anc[x][0]], retx.a[2][0] + rety.a[0][0] + a[anc[x][0]]));
} int main()
{
freopen("minecraft.in", "r", stdin);
freopen("minecraft.out", "w", stdout);
read(n);
for(register int i = 1; i <= n; i++) read(a[i]);
int x, y; LL z;
for(register int i = 1; i < n; i++) read(x), read(y), read(z), add(x, y, z), add(y, x, z);
bfs();
int q; read(q);
for(; q; --q) read(x), read(y), printf("%lld\n", getans(x, y));
}

JZOJ 2474. 【GDKOI 2021普及组DAY2】我的世界的更多相关文章

  1. [GDKOI2021] 普及组 Day2 总结

    [ G D K O I 2021 ] 普 及 组 D a y 2 总 结 [GDKOI2021] 普及组 Day2 总结 [GDKOI2021]普及组Day2总结 时间安排和昨天的GDKOI2021 ...

  2. JZOJ.2117. 【2016-12-30普及组模拟】台风

    题目大意: 天气预报频道每天从卫星上接受卫星云图.图片被看作是一个矩阵,每个位置上要么是”#”,要么”.”,”#”表示该位置没有云,”.”表示有云,地图上每个位置有多达8个相邻位置,分别是,左上.上. ...

  3. GDOI 2021 普及组溺水记

    Day 1 T1 一看样例:答案不就是 \(\dfrac{\max_{i=1}^n a_i +1}{2}\) 吗? 于是自信打上,拍都不拍.然后就,,对了? 插曲:自己出了一个极端数据,发现 scan ...

  4. [GDKOI2021] 普及组 Day3 总结 && 题解

    [ G D K O I 2021 ] 普 及 组 D a y 3 总 结 时间安排和昨天的GDKOI2021 Day2一样. 早上四个小时的快乐码题时间,然鹅我打了半小时的表 然后就是下午的题目讲解和 ...

  5. NOIP2017普及组初赛试题及答案

    普及组C++语言试题 一.单项选择题(共 20 题,每题 1.5 分,共计 30 分:每题有且仅有一个正确选项) 1.在 8 位二进制补码中,10101011 表示的数是十进制下的( ). A. 43 ...

  6. noip2017爆炸记——题解&总结&反省(普及组+提高组)

    相关链接: noip2018总结 noip2017是我见过的有史以来最坑爹的一场考试了. 今年北京市考点有一个是我们学校,我还恰好被分到了自己学校(还是自己天天上课的那个教室),于是我同时报了普及提高 ...

  7. 2016.8.15上午纪中初中部NOIP普及组比赛

    2016.8.15上午纪中初中部NOIP普及组比赛 链接:https://jzoj.net/junior/#contest/home/1333 这次比赛不怎么好,因为这套题目我并不是很擅长. 可同学们 ...

  8. 2016.9.10初中部上午NOIP普及组比赛总结

    2016.9.10初中部上午NOIP普及组比赛总结 链接:https://jzoj.net/junior/#contest/home/1340 好不爽!翻车了!不过排名差不多在中间偏上一点, 还好不是 ...

  9. 2016.9.3初中部上午NOIP普及组比赛总结

    2016.9.3初中部上午NOIP普及组比赛总结 链接:https://jzoj.net/junior/#contest/home/1339 这次真爽,拿了个第四!(我还被班主任叫过去1小时呢!) 进 ...

  10. 2016.8.19上午初中部NOIP普及组比赛总结

    2016.8.19上午初中部NOIP普及组比赛总结 链接:https://jzoj.net/junior/#contest/home/1338 这次总结发得有点晚啊!我在这里解释一下, 因为浏览器的问 ...

随机推荐

  1. Jmeter中用户定义的变量跟用户参数的区别

    用户定义的变量: 全局变量,可以跨线程组被调用,但是,在启动运行时,获取一次值,在运行过程中,不会再动态获取值.用户参数: 局部变量,只能在自己的线程组中被调用,不能直接跨线程组被调用:但是,它在启动 ...

  2. pyftpdlib中文乱码问题解决方案

    python实现简易的FTP服务器 from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handlers import F ...

  3. 【PostgreSQL/PGSQL】创建分区表与临时表

    一.分区表 1.链接 https://blog.csdn.net/zhangyupeng0528/article/details/119423234 2.分类 列(值)分区表:partition by ...

  4. Docker进阶-Dockerfile建立一个自定义的镜像执行自定义进程

    前言 docker对我来说是一个很方便的工具,,上一篇文章也写了docker基本的一些使用,这篇文章重点描述一下Dockerfile的使用,从零建立一个自己定制化的镜像,并可以执行我们需要的任务. 作 ...

  5. python注释、变量、数据类型详细

    目录 1.python注释 2.PEP8规范 3.变量与常量 1.python中的变量 2.变量名的命名规范 3.常量的基本使用 1.python注释 什么是注释? 注释是对代码的解释说明,写注释是为 ...

  6. jQuery中each与data

    一:each(for循环) 1.each作用 for循环前面容器类型 将里面的元素交给后面的函数去处理 有了each,就无需自己写for循环了 2.格式 $(容器类型 数组 自定义对象).each(f ...

  7. 带你读AI论文丨针对文字识别的多模态半监督方法

    摘要:本文提出了一种针对文字识别的多模态半监督方法,具体来说,作者首先使用teacher-student网络进行半监督学习,然后在视觉.语义以及视觉和语义的融合特征上,都进行了一致性约束. 本文分享自 ...

  8. ArcObjects SDK开发 021 开发框架搭建-FrameWork包设计

    1.框架引擎部分 引擎模块其实就是之前我们说的App-Command-Tool模块,通过这个模块,把系统的主干框架搭建起来. 其中大部分出现在菜单以及工具条上的按钮都会继承这个框架定义ICommand ...

  9. wsl2 kali修改语言

    直接执行sudo dpkg-reconfigure locales 会提示 dpkg-query: package 'locales' is not installed and no informat ...

  10. 用python爬取网络文章----滴天髓

    用python爬取网络文章真的很简单.主要分以下几个步骤 1.安装并导入相关模块. 这里我们要用到两个模块,分别是reqesets和lxml 安装命令pip install requests和pip ...