結果
問題 | No.1054 Union add query |
ユーザー | yurujirou |
提出日時 | 2021-09-23 14:02:58 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 532 ms / 2,000 ms |
コード長 | 2,293 bytes |
コンパイル時間 | 649 ms |
コンパイル使用メモリ | 86,876 KB |
実行使用メモリ | 47,056 KB |
最終ジャッジ日時 | 2024-07-05 09:25:55 |
合計ジャッジ時間 | 4,866 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 9 ms
15,232 KB |
testcase_01 | AC | 10 ms
15,232 KB |
testcase_02 | AC | 9 ms
15,232 KB |
testcase_03 | AC | 359 ms
26,976 KB |
testcase_04 | AC | 481 ms
47,056 KB |
testcase_05 | AC | 334 ms
24,192 KB |
testcase_06 | AC | 325 ms
31,256 KB |
testcase_07 | AC | 317 ms
31,256 KB |
testcase_08 | AC | 243 ms
31,128 KB |
testcase_09 | AC | 532 ms
46,408 KB |
testcase_10 | AC | 176 ms
44,484 KB |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:89:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 89 | scanf("%d %d", &N, &Q); | ~~~~~^~~~~~~~~~~~~~~~~ main.cpp:91:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 91 | scanf("%d %d %d", &T[i], &A[i], &B[i]); | ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <iostream> #include <sstream> #include <algorithm> #include <stack> #include <vector> #include <queue> #include <map> #include <set> #include <deque> #include <functional> #define _USE_MATH_DEFINES #include <math.h> #include <complex> using namespace std; //#include <atcoder/all> //using namespace atcoder; #define REP(i,n) for(int i = 0; i < (int)n; i++) #define RREP(i,n) for(int i = (int)n-1; i >= 0; i--) #define LREP(i,n) for(LL i = 0; i < (LL)n; i++) #define Vi vector<int> #define Vl vector<long long> #define LP pair<long long ,long long> #define P pair<int, int> #define T3 tuple<LL, LL, LL> #define T4 tuple<LL, LL, LL, LL> #define INF 1000000007 #define SIZE 500010 #define MOD 1000000007 typedef long long LL; int N, Q; int T[SIZE], A[SIZE], B[SIZE], M[SIZE]; Vi E[SIZE], C; int parent[SIZE], s[SIZE]; void init() { REP(i, N + 1) { parent[i] = i; s[i] = 1; } } int par(int a) { if (parent[a] == a) return a; else return parent[a] = par(parent[a]); } int size(int a) { int pa = par(a); return s[pa]; } int merge(int a, int b) { int pa = par(a), pb = par(b); if (pa != pb) { if (size(pa) > size(pb)) swap(pa, pb); parent[pa] = pb; s[pb] += s[pa]; } return pb; } bool same(int a, int b) { int pa = par(a), pb = par(b); if (pa == pb) return true; else return false; } int BIT[SIZE]; void add(int i, int a) { if (i <= N) { BIT[i] += a; add(i + (i & -i), a); } } int sum(int i) { if (i == 0) return 0; return BIT[i] + sum(i - (i & -i)); } int main() { scanf("%d %d", &N, &Q); REP(i, Q) { scanf("%d %d %d", &T[i], &A[i], &B[i]); } init(); REP(i, N) E[i + 1].push_back(i + 1); REP(i, Q) { if (T[i] == 1) { int a = A[i], b = B[i]; if (!same(a, b)) { int pa = par(a), pb = par(b); int p = merge(a, b); if (p != pa) swap(pa, pb); for (auto e : E[pb]) E[pa].push_back(e); E[pb].clear(); } } } REP(i, N) for (auto e : E[i + 1]) C.push_back(e); REP(i, N) M[C[i]] = i + 1; init(); REP(i, Q) { int a = M[A[i]], b = M[B[i]]; if (T[i] == 1) { merge(a, b); } else if (T[i] == 2) { int left = par(a), right = left + size(a); add(left, B[i]); add(right, -B[i]); } else { cout << sum(a) << endl; } } }