237のプログラムが自動的に分析AcWing

トピックリンク:こちらをクリックしてください

ここに画像を挿入説明
ここに画像を挿入説明

タイトルデータ範囲 1 i , j 1000000000 1≤i、j≤1000000000 が、 1 n 1000000 1≤n≤1000000 、実際のデータのみを使用するよう 2 1 0 6 2 * 10 ^ 6 、最初の添字離散、チェックしやすいとセットバック操作。

順序は、それゆえ、その後、不均等な制約を考慮して、すべて同じ制約を考慮することができる結果に影響を及ぼさなかったとのすべての制約が矛盾しています。前者は、後者が競合していません x i x j X_I \ NEQ X - jが しかし x i X_I x j X - jが 同じコレクションにされてきた、それは矛盾です。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<unordered_map>

using namespace std;
const int N = 2000010;

unordered_map<int,int> mp;
int f[N];
int n;

struct node {
    int x, y, e;
}q[N];

int get(int x)          // 离散化
{
    if(mp.count(x) == 0)    mp[x] = ++n;
    return mp[x];
}

int find(int x)
{
    if(f[x] != x)   f[x] = find(f[x]);
    return f[x];
}

int main()
{
    int T;
    scanf("%d", &T);
    
    while(T--)
    {
        n = 0;
        mp.clear();
        
        int m;
        scanf("%d", &m);
        
        for(int i = 1; i <= m; ++i)
        {
            int x, y, e;
            scanf("%d%d%d", &x, &y, &e);
            q[i] = {get(x), get(y), e};
        }
        
        for(int i = 1; i <= n; ++i) f[i] = i;
        
         // 合并所有相等约束条件
        for(int i = 1; i <= m; ++i)
        {
            if(q[i].e == 1)
            {
                int fx = find(q[i].x), fy = find(q[i].y);
                f[fx] = fy;
            }
        }
        
         // 检查所有不等条件
        bool has_conflict = false;
        for(int i = 1; i <= m; ++i)
        {
            if(q[i].e == 0)
            {
                int fx = find(q[i].x), fy = find(q[i].y);
                if(fx == fy)
                {
                    has_conflict = true;
                    break;
                }
            }
        }
        
        if(has_conflict)    puts("NO");
        else    puts("YES");
    }
    
    return 0;
}
844元記事公開 ウォンの賞賛135 ビュー150,000 +を

おすすめ

転載: blog.csdn.net/qq_42815188/article/details/105148794