結果
問題 | No.1054 Union add query |
ユーザー | yurujirou |
提出日時 | 2021-09-23 01:14:19 |
言語 | C++11 (gcc 11.4.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,444 bytes |
コンパイル時間 | 764 ms |
コンパイル使用メモリ | 87,224 KB |
実行使用メモリ | 46,924 KB |
最終ジャッジ日時 | 2024-07-05 09:22:28 |
合計ジャッジ時間 | 4,957 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 7 ms
15,232 KB |
testcase_01 | AC | 8 ms
15,360 KB |
testcase_02 | AC | 8 ms
15,232 KB |
testcase_03 | AC | 374 ms
27,104 KB |
testcase_04 | WA | - |
testcase_05 | AC | 339 ms
24,320 KB |
testcase_06 | AC | 365 ms
31,260 KB |
testcase_07 | AC | 313 ms
31,384 KB |
testcase_08 | AC | 241 ms
31,256 KB |
testcase_09 | WA | - |
testcase_10 | AC | 187 ms
44,488 KB |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:97:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 97 | scanf("%d %d", &N, &Q); | ~~~~~^~~~~~~~~~~~~~~~~ main.cpp:99:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 99 | 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; } int merge2(int a, int b) { int pa = par(a), pb = par(b); if (pa != pb) { if (pa > pb) swap(pa, pb); parent[pb] = pa; s[pa] += s[pb]; } return pa; } 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) { BIT[i] += a; if (i < N) 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) { merge2(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; } } }