제출 #88218

#제출 시각아이디문제언어결과실행 시간메모리
88218popovicirobertBall Machine (BOI13_ballmachine)C++14
12.38 / 100
1100 ms60868 KiB
#include <bits/stdc++.h> #define lsb(x) (x & (-x)) #define ll long long #define ull unsigned long long // 217 // 44 using namespace std; const int MAXN = (int) 1e5; const int LOG = 17; struct Fenwick { int first[MAXN + 1], last[MAXN + 1], sz; int aib[2 * MAXN + 1]; inline void init() { memset(aib, 0, sizeof(aib)); sz = 0; } inline void update(int pos, int val, int n) { for(int i = pos; i <= n; i += lsb(i)) { aib[i] += val; } } inline int query(int pos) { int ans = 0; for(int i = pos; i > 0; i -= lsb(i)) { ans += aib[i]; } return ans; } }T; vector <int> g[MAXN + 1]; int mn[MAXN + 1], lvl[MAXN + 1]; void dfs(int nod) { T.first[nod] = ++T.sz; mn[nod] = nod; for(auto it : g[nod]) { lvl[it] = lvl[nod] + 1; dfs(it); mn[nod] = min(mn[nod], mn[it]); } T.last[nod] = ++T.sz; } int anc[MAXN + 1][LOG + 1]; inline pair <int, int> get_lca(int x, int y) { for(int bit = LOG; bit >= 0; bit--) { if(lvl[anc[x][bit]] >= lvl[y]) { x = anc[x][bit]; } else if(lvl[anc[y][bit]] >= lvl[x]) { y = anc[y][bit]; } } for(int bit = LOG; bit >= 0; bit--) { if(anc[x][bit] != anc[y][bit]) { x = anc[x][bit]; y = anc[y][bit]; } } return {x, y}; } struct Nod { int nod; bool operator <(const Nod &other) const { pair <int, int> cur = get_lca(nod, other.nod); if(mn[cur.first] == mn[cur.second]) { return nod < other.nod; } return mn[cur.first] < mn[cur.second]; } }; set < Nod > mst; int deg[MAXN + 1]; bool mark[MAXN + 1]; inline void add(int nod) { int par = anc[nod][0]; set < Nod > :: iterator it = mst.find({par}); if(it != mst.end()) { mst.erase(it); } mark[nod] = 0; mst.insert({nod}); deg[par]--; } inline void del(int nod) { mark[nod] = 1; mst.erase(mst.begin()); int par = anc[nod][0]; deg[par]++; if(par > 0 && deg[par] == g[par].size()) { mst.insert({par}); } } int main() { //ifstream cin("A.in"); //ofstream cout("A.out"); int i, n, q; ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); cin >> n >> q; for(i = 1; i <= n; i++) { int par; cin >> par; g[par].push_back(i); anc[i][0] = par; } for(int bit = 1; (1 << bit) <= n; bit++) { for(i = 1; i <= n; i++) { anc[i][bit] = anc[anc[i][bit - 1]][bit - 1]; } } T.init(); lvl[1] = 1; dfs(1); for(i = 1; i <= n; i++) { if(g[i].size() == 0) { mst.insert({i}); } } int black = 0; while(q > 0) { q--; int type, x; cin >> type >> x; if(type == 1) { if(black < n) { int nod; while(x > 0 && black < n) { nod = mst.begin() -> nod; //cerr << nod << "\n"; del(nod); x--; black++; } cout << nod << "\n"; } } else { int nod = x; for(int bit = LOG; bit >= 0; bit--) { if(mark[anc[nod][bit]]) { nod = anc[nod][bit]; } } cout << lvl[x] - lvl[nod] << "\n"; black--; add(nod); } } //cin.close(); //cout.close(); return 0; }

컴파일 시 표준 에러 (stderr) 메시지

ballmachine.cpp: In function 'void del(int)':
ballmachine.cpp:104:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(par > 0 && deg[par] == g[par].size()) {
                   ~~~~~~~~~^~~~~~~~~~~~~~~~
ballmachine.cpp: In function 'int main()':
ballmachine.cpp:150:32: warning: 'nod' may be used uninitialized in this function [-Wmaybe-uninitialized]
                 cout << nod << "\n";
                                ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...