제출 #88243

#제출 시각아이디문제언어결과실행 시간메모리
88243popovicirobertBall Machine (BOI13_ballmachine)C++14
18.15 / 100
1086 ms21368 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; vector <int> g[MAXN + 1]; int mn[MAXN + 1], lvl[MAXN + 1]; void dfs(int nod) { mn[nod] = nod; for(auto it : g[nod]) { lvl[it] = lvl[nod] + 1; dfs(it); mn[nod] = min(mn[nod], mn[it]); } } 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[x] > lvl[y] && lvl[anc[x][bit]] >= lvl[y]) { x = anc[x][bit]; } if(lvl[y] > lvl[x] && 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); 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(par > 0 && deg[par] == g[par].size()) { mst.erase(it); } mark[nod] = 0; mst.insert({nod}); deg[par]--; } inline void del(int nod) { mark[nod] = 1; set < Nod > :: iterator it = mst.find({nod}); mst.erase(it); 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; int root; for(i = 1; i <= n; i++) { int par; cin >> par; g[par].push_back(i); anc[i][0] = par; if(par == 0) { root = i; } } for(int bit = 1; bit <= LOG; bit++) { for(i = 1; i <= n; i++) { anc[i][bit] = anc[anc[i][bit - 1]][bit - 1]; } } lvl[root] = 1; dfs(root); 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) { int nod; while(x > 0 && black < n) { nod = mst.begin() -> nod; //cerr << nod << "\n"; del(nod); /*cerr << mst.size() << "\n"; for(auto it : mst) { cerr << it.nod << " "; } cerr << "\n";*/ x--; black++; } //cerr << "\n"; cout << nod << "\n"; } else { int nod = x; /*for(int bit = LOG; bit >= 0; bit--) { if(mark[anc[nod][bit]]) { nod = anc[nod][bit]; } }*/ while(nod != root && mark[anc[nod][0]] == 1) { nod = anc[nod][0]; } //cerr << nod << "\n"; cout << lvl[x] - lvl[nod] << "\n"; add(nod); /*for(i = 1; i <= n; i++) { cerr << mark[i] << " "; } cerr << "\n"; for(auto it : mst) { cerr << it.nod << " "; } cerr << "\n\n";*/ } } //cin.close(); //cout.close(); return 0; }

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

ballmachine.cpp: In function 'void add(int)':
ballmachine.cpp:60:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(par > 0 && deg[par] == g[par].size()) {
                   ~~~~~~~~~^~~~~~~~~~~~~~~~
ballmachine.cpp: In function 'void del(int)':
ballmachine.cpp:74: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:128:28: warning: 'nod' may be used uninitialized in this function [-Wmaybe-uninitialized]
             cout << nod << "\n";
                            ^~~~
ballmachine.cpp:137:31: warning: 'root' may be used uninitialized in this function [-Wmaybe-uninitialized]
             while(nod != root && mark[anc[nod][0]] == 1) {
                   ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...