제출 #1223279

#제출 시각아이디문제언어결과실행 시간메모리
1223279sleepntsheep도로 개발 (JOI15_road_development)C++17
100 / 100
537 ms8568 KiB
#include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> #define N 250005 int n, nq, tot; using namespace std; struct LCT { struct node { int rev, c[2], fa; int ed, sumed, pave, sumpave, lz; } t[N]; void tagrev(int v) { if (! v) return; swap(t[v].c[0], t[v].c[1]); t[v].rev ^= 1; } void applypave(int v) { if (! v) return; t[v].sumpave=t[v].sumed; t[v].pave=t[v].ed; t[v].lz=1; } void pushup(int v) { if (! v) return; t[v].sumed = t[t[v].c[0]].sumed + t[t[v].c[1]].sumed + t[v].ed; t[v].sumpave=t[t[v].c[0]].sumpave+t[t[v].c[1]].sumpave+t[v].pave; //printf(" %d now %d %d\n", v,t[v].sumed,t[v].sumpave); } void pushdown(int v) { if (! v) return; if (t[v].rev) { tagrev(t[v].c[0]), tagrev(t[v].c[1]); t[v].rev = 0; } if (t[v].lz) { applypave(t[v].c[0]), applypave(t[v].c[1]); t[v].lz = 0; } } int nrt(int v) { return t[t[v].fa].c[0] == v || t[t[v].fa].c[1] == v; } void rot(int v) { int p, g, d; g = t[p = t[v].fa].fa, d = t[p].c[1] == v; if (nrt(p)) t[g].c[t[g].c[1] == p] = v; pushdown(v); if (t[v].c[!d]) t[t[v].c[!d]].fa = p; t[p].c[d] = t[v].c[!d]; t[v].c[!d] = p; t[v].fa = g, t[p].fa = v; pushup(p), pushup(v), pushup(g); } void update(int v) { if (nrt(v)) update(t[v].fa); pushdown(v); } void splay(int v) { update(v); for (int p; nrt(v); rot(v)) if (nrt(p = t[v].fa)) rot((t[p].c[0] == v) == (t[t[p].fa].c[0] == p) ? p : v); pushup(v); } int access(int v) { int w; for (w = 0; v; v = t[w = v].fa) splay(v), t[v].c[1] = w, pushup(v); return w; } void makeroot(int v) { access(v), splay(v), tagrev(v); } void split(int v, int w) { makeroot(v), access(w), splay(w); } void link(int v, int w) { split(v, w); t[v].fa = w; } int froot(int v) { access(v),splay(v); while (t[v].c[0]){ //printf(" %d -> %d\n", v, t[v].c[0]); v=t[v].c[0]; } splay(v); return v; } }l; int main() { scanf("%d%d", &n, &nq); tot = n; for (int Ti, a, b; nq--;) { scanf("%d%d%d", &Ti, &a, &b); if (Ti == 1) { if (l.froot(a) != l.froot(b)) { ++tot;l.t[tot].ed=1;l.pushup(tot); l.link(a,tot),l.link(b,tot); }else{ l.split(a,b); l.applypave(b); } } else { if (l.froot(a) != l.froot(b)) puts("-1"); else{ l.split(a,b); //printf("%d %d\n",l.t[b].sumed,l.t[b].sumpave); printf("%d\n",l.t[b].sumed-l.t[b].sumpave); } } } return 0; }

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

road_development.cpp: In function 'int main()':
road_development.cpp:98:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   98 |         scanf("%d%d", &n, &nq);
      |         ~~~~~^~~~~~~~~~~~~~~~~
road_development.cpp:101:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  101 |                 scanf("%d%d%d", &Ti, &a, &b);
      |                 ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...