首页 > 其他分享 >P4069 [SDOI2016] 游戏

P4069 [SDOI2016] 游戏

时间:2024-08-28 14:50:13浏览次数:10  
标签:游戏 int top tot dep dfn SDOI2016 ans P4069

思路

首先,我们可以将一条要标记的路线 \((s, t)\) 分成 \((s, lca)\) 和 \((lca, t)\) 两个部分,这两个部分分别对应一种 \(y = kx + b\)。

代码

#include <bits/stdc++.h>

#define int long long

using namespace std;
using i64 = long long;

const int N = 100010;
const i64 INF = 123456789123456789;

int n, q, tot;
i64 k[N], b[N];

struct edge {
    int to, next, w;
} e[N * 2];

int head[N], idx = 1;

void add(int u, int v, int w) {
    idx++;
    e[idx].to = v;
    e[idx].next = head[u];
    e[idx].w = w;
    head[u] = idx;
}

int dep[N], sz[N], son[N], fa[N];

void dfs(int u, int f) {
    sz[u] = 1, fa[u] = f;
    for (int i = head[u]; i; i = e[i].next) {
        int to = e[i].to;
        if (to == f) continue;
        dep[to] = dep[u] + e[i].w;
        dfs(to, u);
        sz[u] += sz[to];
        if (sz[son[u]] < sz[to]) son[u] = to;
    }
}

int top[N], dfn[N], rk[N], cnt;

void dfs2(int u, int t) {
    dfn[u] = ++cnt, rk[cnt] = u, top[u] = t;
    if (son[u]) dfs2(son[u], t);
    for (int i = head[u]; i; i = e[i].next) {
        int to = e[i].to;
        if (to == fa[u] || to == son[u]) continue;
        dfs2(to, to);
    }
}

int lca(int x, int y) {
    while (top[x] != top[y]) {
        if (dep[top[x]] < dep[top[y]]) swap(x, y);
        x = fa[top[x]];
    }
    if (dep[x] > dep[y]) swap(x, y);
    return x;
}

struct node {
    int id;
    i64 val = INF;
} tr[N << 2];

i64 gety(int id, int x) {
    return k[id] * x + b[id];
}

bool compare(int id1, int id2, int x) {
    i64 y1 = gety(id1, dep[rk[x]]);
    i64 y2 = gety(id2, dep[rk[x]]);
    return y1 < y2;
}

void pushup(int u, int l, int r) {
    if (l != r) tr[u].val = min(tr[u].val, min(tr[u << 1].val, tr[u << 1 | 1].val));
    tr[u].val = min(tr[u].val, min(gety(tr[u].id, dep[rk[l]]), gety(tr[u].id, dep[rk[r]])));
}

void modify(int u, int l, int r, int pl, int pr, int c) {
    int mid = l + r >> 1;
    if (l > r) return;
    if (pl <= l && r <= pr) {
        if (compare(c, tr[u].id, mid)) swap(c, tr[u].id);
        if (compare(c, tr[u].id, l)) modify(u << 1, l, mid, pl, pr, c);
        if (compare(c, tr[u].id, r)) modify(u << 1 | 1, mid + 1, r, pl, pr, c);
        pushup(u, l, r);
        return;
    }
    if (pl <= mid) modify(u << 1, l, mid, pl, pr, c);
    if (pr > mid) modify(u << 1 | 1, mid + 1, r, pl, pr, c);
    pushup(u, l, r);
}

i64 query(int u, int l, int r, int pl, int pr) {
    if (pl <= l && r <= pr) return tr[u].val;
    int mid = l + r >> 1;
    i64 ans = min(gety(tr[u].id, dep[rk[max(l, pl)]]), gety(tr[u].id, dep[rk[min(r, pr)]]));
    if (pl <= mid) ans = min(ans, query(u << 1, l, mid, pl, pr));
    if (pr > mid) ans = min(ans, query(u << 1 | 1, mid + 1, r, pl, pr));
    return ans;
}

void update(int u, int v, int add) {
    while (top[u] != top[v]) {
        if (dep[top[u]] < dep[top[v]]) swap(u, v);
        modify(1, 1, N - 10, dfn[top[u]], dfn[u], add);
        u = fa[top[u]];
    }
    if (dep[u] > dep[v]) swap(u, v);
    modify(1, 1, N - 10, dfn[u], dfn[v], add);
}

i64 ask(int u, int v) {
    i64 ans = INF;
    while (top[u] != top[v]) {
        if (dep[top[u]] < dep[top[v]]) swap(u, v);
        ans = min(ans, query(1, 1, N - 10, dfn[top[u]], dfn[u]));
        u = fa[top[u]];
    }
    if (dep[u] > dep[v]) swap(u, v);
    ans = min(ans, query(1, 1, N - 10, dfn[u], dfn[v]));
    return ans;
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> q;
    for (int i = 1; i < n; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        add(u, v, w), add(v, u, w);
    }

    b[0] = INF;
    dfs(1, 0);
    dfs2(1, 1);

    int opt, s, t, x, y;
    for (int i = 1; i <= q; i++) {
        cin >> opt;
        if (opt == 1) {
            cin >> s >> t >> x >> y;
            int l = lca(s, t);
            tot++;
            k[tot] = -x, b[tot] = x * dep[s] + y;
            update(s, l, tot);
            tot++;
            k[tot] = x, b[tot] = x * dep[s] - 2 * x * dep[l] + y;
            update(l, t, tot);
        }
        else {
            cin >> s >> t;
            cout << ask(s, t) << '\n';
        }
    }
    return 0;
}

标签:游戏,int,top,tot,dep,dfn,SDOI2016,ans,P4069
From: https://www.cnblogs.com/Yuan-Jiawei/p/18384634

相关文章

  • uniapp js 数独小游戏 9*9 数独 2.0
    效果图: game.vue<template> <view> <viewclass="main"> <viewclass="foot"> <viewv-if="!isTip"class="sudoku_area"> <viewv-for="(row,index)ofrowList":key=&quo......
  • uniapp js 数独小游戏 n*n 看控制台的打印 数独 1.0
    uniappjs 数独小游戏n*n 看控制台的打印game.vue<template> <view>4567</view></template><scriptsetuplang="ts">import{ref}from'vue'import{onShow}from'@dcloudio/uni-app'constsdNum=ref(......
  • Amazon Bedrock 实践:零基础创建贪吃蛇游戏
    本文探讨了如何利用AmazonBedrock和大型语言模型,快速创建经典的贪吃蛇游戏原型代码。重点展示了利用提示工程,将创新想法高效转化为可运行代码方面的过程。文章还介绍了评估和优化提示词质量的最佳实践。亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术......
  • 免费、开源、详细完整的unity游戏、游戏源码、教程:人工智能分析和处理对话的美好三维
    这份unity游戏、游戏源码、教程:完全免费,完全开源,完整详细,通俗易懂,适合初学者入门,定期更新。我不想和任何人说话,任何人不要跟我说话,不要打扰我,我要安安静静的写。我解释一下原因:俗话说“道不同,不相与谋。”不是一个情感世界的人,就不该相互说话,两个不同情感世界的人,心灵是无法彼此......
  • 代码随想录算法day24 | 贪心算法part02 | 122.买卖股票的最佳时机II,55. 跳跃游戏,45.跳
    122.买卖股票的最佳时机II本题解法很巧妙,本题大家可以先自己思考一下然后再看题解,会有惊喜!力扣题目链接(opensnewwindow)给定一个数组,它的第 i个元素是一支给定股票第i天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次......
  • C语言实现三子棋小游戏
    前言与概述本文章讲述如何通过C语言开发一款三子棋的小游戏。笔者才识浅薄,如有错误,欢迎各位编程大佬在评论区批评指正,笔者不胜感激。游戏介绍三子棋是一款益智的趣味小游戏。多名玩家在3*3的棋盘下棋,棋盘共九个方格,每个方格最多只能放置一枚棋子。只要有一名玩家下的三个棋......
  • 入行「游戏策划」,该从何处下手?
    想知道策划岗位该怎么入行可点击蓝链相比较起以技术为最重要评判标准的开发岗,「游戏策划」这一岗位在非业界人士的眼中一直都是一个风评方差很大的岗位。有人说策划岗又轻松又威风,只需要输出想法,落地都交给开发,干点杂活就能指挥整个游戏团队;也有人说策划岗门槛很高,......
  • Windows 11 24H2更新实测:AMD Zen5、Zen4游戏性能提升最多35%
    在即将推出的Windows1124H2更新正式版中,会包含针对性的分支预测优化,再结合更高权限的隐藏管理员账号,Zen5游戏性能可获得显著提升最多达13%,Zen4、Zen3也能从中获益。HardwareUnboxed实测了还处于内测版的Windows1124H2Build26100,对比现在的23H2Build2263,共有多达40款游戏,分......
  • Unity之OpenXR如何使用Netcode实现一个多人VR游戏
    前言NetcodeforGameObjects是专为Unity构建的高级网络库,可用于抽象网络逻辑。您可以通过网络会话同时向许多玩家发送GameObjects和世界数据。借助NetcodeforGameObjects,您可以专注于构建游戏,而无需考虑低级协议和网络框架。Netcode框架的核心特性包括:易于使用:......
  • 游戏AI中的模仿学习
    模仿学习在游戏AI中的应用已经逐渐成为提升游戏智能和玩家体验的重要技术。通过模仿人类玩家的行为,游戏AI可以表现出更加智能、自然的决策和操作能力,使得游戏更加富有挑战性和趣味性。以下是关于游戏AI中模仿学习的详细探讨。1.什么是模仿学习?模仿学习(ImitationLearning)是......