首页 > 其他分享 >Codeforces Round 888 (Div. 3)G. Vlad and the Mountains(数据结构,图论)

Codeforces Round 888 (Div. 3)G. Vlad and the Mountains(数据结构,图论)

时间:2023-08-28 12:34:37浏览次数:35  
标签:std Mountains return Vlad int 888 cin FIND op

题目链接:https://codeforces.com/contest/1851/problem/G

 

大致题意:

 

给出n个点m条边的无向图,每个点有点权h【i】。从点 i 到 点 j会消耗 h【j】 - h【i】 的能量,如果小于0,那么就是恢复对应绝对值的能量。

 

进行q次询问,每次询问包含起点s,终点t,能量e,能量在移动过程 中不能小于0,问是否能从s到t;

 

解题思路:

 

转化问题(结合律,然后抵消中间项),相当于不经过h【s】 + e的点,s和e是否连通;

 

然后无向图连通问题可以用并查集来维护;

 

考虑离线做法,我们对能量进行排序(从小到大);

 

然后依次建边合并,查询即可;

 

时间复杂度:O(nlogn);

 

代码:

 

#include<bits/stdc++.h>

const int N = 2e5 + 5;
int p[N], h[N];

int FIND(int x) {
    return p[x] = (x == p[x] ? x : FIND(p[x]));
}

struct I {
    int u, v, h, op, id;
};

bool my_cmp(I a, I b) {
    if (a.h != b.h)return a.h < b.h;
    if (a.op != b.op)return a.op < b.op;
    return a.id < b.id;
}

signed main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);

    int T;
    std::cin >> T;
    while (T--) {
        int n, m;
        std::cin >> n >> m;
        for (int i = 1; i <= n; ++i)std::cin >> h[i], p[i] = i;
        std::vector<I> U;
        for (int i = 1; i <= m; ++i) {
            int a, b;
            std::cin >> a >> b;
            U.push_back({a, b, std::max(h[a], h[b]), 0, N + i});
        }
        int q;
        std::cin >> q;
        for (int i = 1; i <= q; ++i) {
            int a, b, x;
            std::cin >> a >> b >> x;
            U.push_back({a, b, h[a] + x, 1, i});
        }

        std::sort(U.begin(), U.end(), my_cmp);

        /*for (int i = 0; i < U.size(); ++i)
            std::cout << U[i].u << " " << U[i].v << " " << U[i].h << " " << U[i].op << " " << U[i].id << "\n";*/

        std::vector<int> ans(q + 1, 0);

        for (int i = 0; i < U.size(); ++i) {
            if (U[i].op)ans[U[i].id] = (FIND(U[i].u) == FIND(U[i].v));
            else p[FIND(U[i].u)] = FIND(U[i].v);
        }

        for (int i = 1; i <= q; ++i)std::cout << (ans[i] ? "YES\n" : "NO\n");
        std::cout << "\n";
    }

    return 0;
}

不是很难的图论+数据结构的题目,但是码量还是有点大的:)

标签:std,Mountains,return,Vlad,int,888,cin,FIND,op
From: https://www.cnblogs.com/ACMER-XiCen/p/17660109.html

相关文章

  • NC223888 红色和紫色.md
    题目链接题目题目描述漫长的生命总是无聊的。这天,小红和紫准备玩一个染色游戏。她们拿出了一个有\(n*m\)个格子的网格,每个格子只能被染成红色或紫色。每个人可以任意选择一个格子染成红色和紫色,两人轮流进行染色。她们约定,不能有两个相邻的格子有相同的颜色。最后无法进行......
  • 互站价值1888全新二开游戏支付通道/话费/电网、抖音、快手、紫水晶带云端源码
    源码修复可用。价格修复,YY业务都可用  腾讯暂时不可用拍前必看:本店所售程序只供测试研究,不得使用于非法用途,不得违反国家法律,不得用于进行违法行为,否则后果自负!购买以后用作他用附带的一切法律责任后果都由购买者承担于本店无任何关系!请先联系客服看好演示后,确认无吴后在拍,免责......
  • M2版Mac mini被京东杀到史低2888元!比苹果官网低1600
    苹果跳水王M2版Macmini又降价了。根据京东官方百亿补贴频道显示,Macmini8+256GB入门版只要2888元了,比前不久的拼多多2959还低,刷新了这款电脑的史上最低价。对比官网原价的4499元,直接跌掉超过1600元,已经非常值得入手。尤其是Macmini对比同价位的Windows迷你机,不论是性能还是......
  • G. Vlad and the Mountains
    G.VladandtheMountainsVladdecidedtogoonatriptothemountains.Heplanstomovebetween$n$mountains,someofwhichareconnectedbyroads.The$i$-thmountainhasaheightof$h_i$.Ifthereisaroadbetweenmountains$i$and$j$,Vladcanmo......
  • #888
    //A#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=1e6+10,mod=1e9+7;strings;intn,t,a[N],f[N],res,num,ans,m,k,p;boolvis[N];signedmain(){std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>......
  • 1851 Round 888 (Div. 3)
    EscalatorConversations判断两人台阶是否为\(k\)的倍数且在\((0,m)\)内即可#include<bits/stdc++.h>usingnamespacestd;signedmain(){ intT; scanf("%d",&T); for(intn,m,k,H;T;--T){ scanf("%d%d%d%d",&n,&m,&a......
  • Codeforces Round 888 (Div. 3)
    比赛链接:https://codeforces.com/contest/1851A.EscalatorConversations题意:一个扶梯,共m阶,n人站,每个台阶高k,Vlad身高H,Vlad任意站,问有多少人站在这个扶梯上正好和Vlad齐平满足abs(H-h[i])%k==0&&abs(H-h[i])/k<=m-1&&H!=h[i]即可B.ParitySort题意:给出......
  • Codeforces Round 888 (Div. 3) 补题
    独立补了一道记忆化搜索的题,https://codeforces.com/contest/1851/problem/E由于初次接触对于使用场景和注意事项都不是很熟悉,写加调估计得有3h。本题的题面保证了本题是个无环图,允许dfs函数会有出口,存图不能用链式前向图,因为非常容易构造数据使得为稠密图,所以用二维数组或vec......
  • Codeforces Round 888 (Div. 3)
    传送门AEscalatorConversations读懂题意即可/*Author:north_hFile:A.cppTime:2023/7/26/12:32____________||_||__||__|'_\/_\|'__|__|'_\|'_\|......
  • Codeforces Round 888 (Div. 3)
    CodeforcesRound888(Div.3)T1​ 思路:直接模拟。T2​思路:首先记录原始数组的奇偶性,然后将奇数、偶数分为不同两组进行排序,然后再根据原数组的奇偶性按顺序填入奇数偶数,最后判断整个数组是否非递减。T3思路:我们已知开始在\(a_1\),最后在\(a_n\)。那么当\(a_1\ne......