小誠因為金剷剷D不到牌破產啦

土木牢盖發表於2024-11-28

小誠因為金剷剷D不到牌破產啦

Description

小誠和他身邊的朋友最近好像出了點經濟問題……

已知小誠的人際關際網中包含 n* 個人(小誠也在其中),每個人手上現在有ai元,他們可以彼此之間互相借錢,他們只希望在最後手上恰好有 bi

眾所周知,欠錢容易借錢難,沒借到之前是孫子,借到了之後對面是孫子。所以兩個人之間,如果不是關係密切的朋友,就無法放心地互相借錢,小誠透過摸索,知道了他們之間有 m 對關係密切的朋友。

請問所有的人能夠透過互相借錢滿足他們的需求嗎?

注意,有的人可能一開始就是負債的狀態,即aibi都有可能是負數

Input

第一行兩個整數n,m分別表示人數和關係密切的朋友對數

接下來一行n個整數a1,a2,...,an,表示每個人手上初始有的錢

接下來一行 n個整數 b1,b2,...,bn,表示每個人手上最後希望恰好有的錢

接下來 m 行,每行兩個整數 x,y,表示 xy 是關係密切的朋友

1≤n,m≤2e5 ,−1e9≤ai,bi≤1e9

Output

對於每一組資料,輸出一行一個字串,如果可以滿足,輸出"Yes",否則輸出 "No"

Sample Input 1

3 2
1 2 3
2 2 2
1 2
2 3

Sample Output 1

Yes
#include <bits/stdc++.h>
using namespace std;
long long x,y,n,m;
vector<long long> a , b ,suma ,sumb;
vector<int> f;
int find(int x) {
    if (f[x]!= x) {
        f[x] = find(f[x]);
    }
    return f[x];
}
void baka(int x, int y) {
    int findX = find(x);
    int findY = find(y);
    if (findX!= findY) {
        f[findX] = findY;
        suma[findY] += suma[findX];
        sumb[findY] += sumb[findX];
    }
}

int main() {
    scanf("%lld %lld", &n, &m);
    a.resize(n);b.resize(n);f.resize(n);suma.resize(n);sumb.resize(n);
    for (int i = 0; i < n; i++) {
        f[i] = i;
        scanf("%lld", &a[i]);
        suma[i] = a[i];
    }

    for (int i = 0; i < n; i++) {
        scanf("%lld", &b[i]);
        sumb[i] = b[i];
    }

    for (int i = 0; i < m; i++) {
    scanf("%lld %lld", &x, &y);
        baka(x, y);
    }

    for (int i = 0; i < n; i++) {
        int fumo = find(i);
        if (suma[fumo]!= sumb[fumo]) {
            printf("No\n");
            return 0;
        }
    }

    printf("Yes\n");
    return 0;
}



相關文章