当前位置: 首页 > article >正文

H. The Third Letter

题目链接:Problem - H - Codeforces

题目大意:

一共t 组数据。对于每组数据:

第一行给定 n 和 m,表示有 n 个人和 m 个要求。每个人都站在数轴上的一个整数点上(可以在负半轴上)。

然后的 m 行,每行一个要求。每个要求包含 ai​,bi​ 和 wi​,表示第 ai 个人要站在第 bi​ 个人前方的第 wi​ 个位置(如果 wi​ 是负数,则第 ai​ 个人要站在第 bi​ 个人后方的第 −wi​ 个位置)。问是否存在满足要求的方案。

1<=t≤100,∑n ≤ 2e5, m ≤ n, −1e9 ≤ di ≤ 1e9

    带权并查集模板题

#include <bits/stdc++.h>
using namespace std;

using i64 = long long;
using i128 = __int128;
using ui64 = unsigned long long;
//模板
struct DSU{
    int n;
    vector<int> tree;
    vector<i64> dist;

    DSU(){}
    DSU(int n){
        innt(n);
    }

    void innt(int n){
        this->n = n;
        tree.resize(n);
        dist.assign(n,0LL);
        for(int i=0; i<n; i++) {
            tree[i] = i;
        }
    }
    int find(int x){
        if(tree[x] != x) {
            int fx = find(tree[x]);//一定要先路径压缩
            dist[x] += dist[tree[x]];
            tree[x] = fx;
        }
        return tree[x];
    }
    bool merge(int a,int b, i64 val){
        int fa = find(a);
        int fb = find(b);
        if(fa == fb)return false;
        dist[fa] = dist[b] - dist[a] + val;
        tree[fa] = fb;
        return true;
    }
    bool same(int a, int b){
        return find(a) == find(b);
    }
    i64 ask(int a, int b){
        return dist[a] - dist[b];
    }
};

void solve(){
    int n, m;
    cin >> n >> m;
    DSU dsu = DSU(n);
    bool ok = true;
    for(int i=0; i<m; i++) {
        int a, b, val;
        cin >> a >> b >> val;
        if(!ok)continue;
        a--, b--;
        if(!dsu.merge(a, b, val)) {
            if(dsu.ask(a, b) != val) {
                cout << "NO\n";
                ok = false;
            }
        }
    }
    if(ok) {
        cout << "YES\n";
    }
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    int t = 1;
    cin >> t;
    while(t--) {
        solve();
    }
    return 0;
}

感谢大家的收看与点赞, 欢迎大佬指正。


http://www.kler.cn/a/532198.html

相关文章:

  • 【实践案例】基于大语言模型的海龟汤游戏
  • 执行策略更改
  • 深入解析 clone():高效的进程与线程创建方法(中英双语)
  • 于动态规划的启幕之章,借 C++ 笔触绘就算法新篇
  • 使用 Elastic Cloud Hosted 优化长期数据保留:确保政府合规性和效率
  • PHP实现混合加密方式,提高加密的安全性(代码解密)
  • 接入DeepSeek大模型
  • 蓝桥杯思维训练营(三)
  • 【Leetcode刷题记录】2090. 半径为 k 的子数组平均值--定长滑动窗口解法和前缀和解法
  • 基于RK3588+算能BM1684X的云电脑/云手机系统设计与实现
  • 【Go语言圣经】第七节:接口
  • 蓝桥杯接龙序列
  • 83-《南茼蒿》
  • python列表知道下标怎么取值
  • 输出解析器的使用
  • 介绍一下Mybatis的底层原理(包括一二级缓存)
  • 基于“蘑菇书”的强化学习知识点(四):贝尔曼方程
  • deepseek的对话风格
  • 单链表的“影分身术”:随机指针链表的深度拷贝实现
  • 知识蒸馏教程 Knowledge Distillation Tutorial
  • ES6基础内容
  • [特殊字符] ChatGPT-4与4o大比拼
  • 基于SpringBoot体育商品推荐设计与实现
  • Spring Boot常用注解深度解析:从入门到精通
  • 排序算法与查找算法
  • Blender的材质节点中 透射(Transmission) 和 Alpha的区别