首页 > 其他分享 >CF1850H The Third Letter

CF1850H The Third Letter

时间:2023-08-15 19:14:01浏览次数:34  
标签:return Third CF1850H int pos long fa Letter Find

题目大意

\(n\) 个士兵站队,给出 \(m\) 个限制,要求士兵 \(b\) 站在士兵 \(a\) 前面距离为 \(d\) 的位置,可以有多个士兵站在同一个位置。询问给定限制下是否存在合法的列队方案。

思路

我们考虑把互相有直接或间接限制的点看作一棵树,加入到树中的结点是受到限制的。

最开始的状况没有限制,我们考虑逐个加入限制。最开始是一片森林,每棵树中只有一个结点,感觉很像并查集。

对于每个结点,我们维护它与自己祖先之间的相对距离,记录一个 pos。并查集合并时,我们只需要更改它祖先的 pos

关于判无解,只需要考虑两个结点是否在同一个集合中以及距离是否与集合中的限制相等。

其他的就是普通的带权并查集操作。

记得开 long long

Code

#include <bits/stdc++.h>
 
using namespace std;
 
#define int long long
 
const int N = 200500;
 
int n,m;
 
struct Limits{
    int a,b;
    long long d;
}t[N];
 
long long pos[N];
int fa[N],size[N];
 
class DSU{
public:
    int Find(int x) {
        if(fa[x] == x)
            return x;
        int tmp = Find(fa[x]);
        pos[x] += pos[fa[x]];
        fa[x] = tmp;
        return Find(fa[x]);
    }
 
    void Union(int x,int y,long long dis) {
        int fx = Find(x);
        int fy = Find(y);
 
        if(fx == fy)
            return ;
        
        fa[fy] = fx;
 
        pos[fy] = pos[x] - dis - pos[y];
    }
 
    bool Check(int x,int y,long long dis) {
        if(Find(x) == Find(y)) 
            return pos[x] - pos[y] != dis;
        
        return 0;
    }
}dsu;
 
signed main() {
    int T;
    cin >> T;
    while(T--) {
        cin >> n >> m;
        for(int i = 1;i <= n; i++)
            fa[i] = i;
 
        for(int i = 1,u,v,w;i <= m; i++) {
            cin >> u >> v >> w;
 
            t[i].a = u;
            t[i].b = v;
            t[i].d = w;
        }
 
        bool flag = 0;
        for(int i = 1;i <= m; i++) {
            if(dsu.Check(t[i].a,t[i].b,t[i].d)) {
                cout << "NO\n";
                flag = 1;
                break;
            }
 
            dsu.Union(t[i].a,t[i].b,t[i].d);
        }
        if(!flag)
            cout << "YES\n";
        for(int i = 1;i <= n; i++)
            pos[i] = 0;
    }
    return 0;
}

标签:return,Third,CF1850H,int,pos,long,fa,Letter,Find
From: https://www.cnblogs.com/baijian0212/p/solution-cf1850h.html

相关文章

  • 题解 CF379D New Year Letter
    思路提供一种比较容易想到的做法。拿到题看数据范围发现都很小,所以放心大胆地暴力。容易发现\(s_i\)中AC的个数等于\(s_{i-2}\)中AC的个数加\(s_{i-1}\)中AC的个数再加上两者拼接处可能有的一个AC。所以\(s_1\)和\(s_2\)从第二个字符到倒数第二个字符这之间......
  • 【刷题笔记】17. Letter Combinations of a Phone Number
    题目Givenastringcontainingdigitsfrom 2-9 inclusive,returnallpossiblelettercombinationsthatthenumbercouldrepresent.Amappingofdigittoletters(justlikeonthetelephonebuttons)isgivenbelow.Notethat1doesnotmaptoanyletters.Ex......
  • js:使用LetterAvatar通过canvas实现浏览器中生成字母头像
    实现效果LetterAvatar的原理就是利用了浏览器对象canvas在线体验:https://mouday.github.io/tools/pages/letter-avatar/index.htmlLetterAvatar.js完整代码/**LetterAvatar**ArturHeinze*CreateLetteravatarbasedonInitials*basedonhttps://gist.github.co......
  • 17. 电话号码的字母组合(letterCombinations)
    给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。给出数字到字母的映射如下(与电话按键相同)。注意1不对应任何字母。示例1:输入:digits="23"输出:["ad","ae","af","bd","be","bf","cd","ce","cf"......
  • The Third Letter带权并查集
    Problem-1850H-Codeforces题意是给你a,b,c说明a在b后面c个单位(c<0就是在左边),每个位置只能有一个数,一共有n个位置,告诉你m个关系,问是否符合条件我们可以设置d[x]表示x到它的最早的父节点的距离,然后如果两个数父节点一样,那么c!=d[a]-d[b]时就说明不符合条件那么对于并查......
  • TypeError: error setting argument 2 - writePointer: Bufferinstance expected as t
    electronffi调第三方动态库报“TypeError:errorsettingargument2-writePointer:Bufferinstanceexpectedasthirdargument”原因是我定义了一个结构体,调函数传参数需要传这个结构体的指针constec_image_t=Struct({。。。。})letimage_a=new......
  • LETTERS
    #include<bits/stdc++.h>usingnamespacestd;intr,s,t[200],ans;intdx[]={-1,0,1,0},dy[]={0,-1,0,1};chara[100][100];voiddfs(intx,inty,intcnt){ans=max(ans,cnt);for(inti=0;i<4;i++){intxx=x+dx[i];int......
  • AGC032F One Third
    首先先证明几个引理。\(\text{Lemma\#1}\):长度为\(1\)的线段上随机取\(n-1\)个点,将其分成\(n\)段,长度最短段的长度期望为\(\dfrac{1}{n^2}\)。证明:我不知道能不能\(\text{Min-Max}\)容斥,但有更简单的做法。假设最小段长度为\(l_{\min}\),考虑枚举\(x\),计算\(......
  • Dead Letter交换机
    当一个队列中的消息满足下列情况之一时,可以成为死信(deadletter):消费者使用basic.reject或basic.nack声明消费失败,并且消息的requeue参数设置为false消息是一个过期消息,超时无人消费要投递的队列消息满了,无法投递如果这个包含死信的队列配置了`dead-letter-exchange`......
  • SAP UI5 应用里 /sap/ui/thirdparty/datajs.js 的作用
    SAPUI5是一个基于JavaScript的用户界面技术,用于构建企业级应用程序。它是一个成熟的开源框架,由SAP开发,致力于提供高质量、可扩展和易于维护的Web应用程序。SAPUI5应用程序使用一系列技术和库,其中之一就是/sap/ui/thirdparty/datajs.js。在本文中,我们将详细讨论datajs.......