結果
問題 |
No.1290 Addition and Subtraction Operation
|
ユーザー |
👑 ![]() |
提出日時 | 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; }