結果
| 問題 |
No.1290 Addition and Subtraction Operation
|
| コンテスト | |
| ユーザー |
Nachia
|
| 提出日時 | 2020-11-13 22:35:30 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 125 ms / 2,000 ms |
| コード長 | 1,061 bytes |
| コンパイル時間 | 1,793 ms |
| コンパイル使用メモリ | 176,712 KB |
| 実行使用メモリ | 10,212 KB |
| 最終ジャッジ日時 | 2024-07-22 21:34:01 |
| 合計ジャッジ時間 | 7,228 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 85 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
using LL = long long;
using ULL = unsigned long long;
#define rep(i,n) for(int i=0; i<(n); i++)
struct dsu {
vector<int> V;
dsu(int n) { V.resize(n); rep(i, n) V[i] = i; }
int root(int a) { if (V[a] == a) return a; return V[a] = root(V[a]); }
void merge(int r, int s) { V[root(s)] = root(r); }
};
struct RangeProc {
vector<vector<int>> G;
vector<int> X;
void proc() {
int N = G.size();
dsu Q(N * 2);
rep(u, N) for (int v : G[u]) {
Q.merge(u, v);
}
X.resize(N);
rep(i, N) X[i] = Q.root(i);
}
};
int main() {
int N, Q; cin >> N >> Q;
vector<LL> A(N); rep(i, N) cin >> A[i];
rep(i, N) if (i % 2 == 1) A[i] = -A[i];
A.push_back(0);
for (int i = N - 1; i >= 0; i--) A[i + 1] -= A[i];
RangeProc G; G.G.resize(N + 1);
rep(i, Q) {
int l, r; cin >> l >> r; l--;
G.G[l].push_back(r);
G.G[r].push_back(l);
}
G.proc();
vector<LL> S(N + 1);
rep(i, N + 1) S[G.X[i]] += A[i];
bool ok = true;
rep(i, N) if (S[i] != 0) ok = false;
cout << (ok ? "YES" : "NO") << endl;
return 0;
}
Nachia