小誠因為金剷剷D不到牌破產啦
Description
小誠和他身邊的朋友最近好像出了點經濟問題……
已知小誠的人際關際網中包含 n* 個人(小誠也在其中),每個人手上現在有ai元,他們可以彼此之間互相借錢,他們只希望在最後手上恰好有 bi 元
眾所周知,欠錢容易借錢難,沒借到之前是孫子,借到了之後對面是孫子。所以兩個人之間,如果不是關係密切的朋友,就無法放心地互相借錢,小誠透過摸索,知道了他們之間有 m 對關係密切的朋友。
請問所有的人能夠透過互相借錢滿足他們的需求嗎?
注意,有的人可能一開始就是負債的狀態,即ai和 bi都有可能是負數
Input
第一行兩個整數n,m分別表示人數和關係密切的朋友對數
接下來一行n個整數a1,a2,...,an,表示每個人手上初始有的錢
接下來一行 n個整數 b1,b2,...,bn,表示每個人手上最後希望恰好有的錢
接下來 m 行,每行兩個整數 x,y,表示 x 和 y 是關係密切的朋友
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;
}