제출 #486379

#제출 시각아이디문제언어결과실행 시간메모리
486379rainboyRuka (COI15_ruka)C11
100 / 100
550 ms10300 KiB
#include <stdio.h> #define N 100000 #define Q 300000 #define N_ (1 + (N * 2 + Q * 4) * 2) unsigned int Z = 12345; int rand_() { return (Z *= 3) >> 1; } int zz[N_], ll[N_], rr[N_], xx[N_], cc[N_], sum[N_], u_, l_, r_; int node(int x, int c) { static int _ = 1; zz[_] = rand_(); xx[_] = x, sum[_] = cc[_] = c; return _++; } void pul(int u) { sum[u] = cc[u] + sum[ll[u]] + sum[rr[u]]; } void split(int u, int x) { if (u == 0) { u_ = l_ = r_ = 0; return; } if (xx[u] < x) { split(rr[u], x); rr[u] = l_, l_ = u; } else if (xx[u] > x) { split(ll[u], x); ll[u] = r_, r_ = u; } else { u_ = u, l_ = ll[u], r_ = rr[u]; ll[u] = rr[u] = 0; } pul(u); } int merge(int u, int v) { if (u == 0) return v; if (v == 0) return u; if (zz[u] < zz[v]) { rr[u] = merge(rr[u], v), pul(u); return u; } else { ll[v] = merge(u, ll[v]), pul(v); return v; } } int tr_add(int t, int x, int c) { split(t, x); if (u_ == 0) u_ = node(x, 0); if ((cc[u_] += c) == 0) u_ = 0; pul(u_); t = merge(merge(l_, u_), r_); return t; } int add(int t, int x1, int x2, int c) { if (x1 != x2 && c != 0) { int tmp; if (x1 > x2) tmp = x1, x1 = x2, x2 = tmp; t = tr_add(t, x1, c), t = tr_add(t, x2, -c); } return t; } int query(int t, int x) { int c = 0; while (t) if (xx[t] <= x) c += sum[ll[t]] + cc[t], t = rr[t]; else t = ll[t]; return c; } int main() { static int xx[N], yy[N], xxp[N + 1], yyp[N + 1], xxq[N + 1], yyq[N + 1]; int n, m, i, x, y, tx, ty, p, q; scanf("%d", &n); for (i = 0; i < n; i++) scanf("%d%d", &xx[i], &yy[i]); scanf("%d", &m); x = 0, y = 0, tx = 0, ty = 0; for (i = n - 1; i >= 0; i--) { xxq[i] = x, yyq[i] = y, x += xx[i], y += yy[i]; tx = add(tx, xxq[i], xxq[i] + xx[i], 1), ty = add(ty, yyq[i], yyq[i] + yy[i], 1); } x++, y++; xxp[0] = 1, yyp[0] = 1; i = 0, p = 0, q = query(tx, x) + query(ty, y); while (m--) { static char s[2]; scanf("%s", s); if (s[0] == 'B') { if (i > 0) { i--; if ((xxp[i] > 0) != (xxp[i] + xx[i] > 0)) p--; if ((yyp[i] > 0) != (yyp[i] + yy[i] > 0)) p--; xxq[i] = xxq[i + 1] + xx[i + 1], yyq[i] = yyq[i + 1] + yy[i + 1]; tx = add(tx, xxq[i], xxq[i] + xx[i], 1), ty = add(ty, yyq[i], yyq[i] + yy[i], 1); q = query(tx, x) + query(ty, y); } } else if (s[0] == 'F') { if (i + 1 < n) { tx = add(tx, xxq[i], xxq[i] + xx[i], -1), ty = add(ty, yyq[i], yyq[i] + yy[i], -1); if ((xxp[i] > 0) != (xxp[i] + xx[i] > 0)) p++; if ((yyp[i] > 0) != (yyp[i] + yy[i] > 0)) p++; i++; xxp[i] = xxp[i - 1] + xx[i - 1], yyp[i] = yyp[i - 1] + yy[i - 1]; q = query(tx, x) + query(ty, y); } } else if (s[0] == 'C') { int x_, y_; scanf("%d%d", &x_, &y_); tx = add(tx, xxq[i], xxq[i] + xx[i], -1), ty = add(ty, yyq[i], yyq[i] + yy[i], -1); x += x_ - xx[i], y += y_ - yy[i], xx[i] = x_, yy[i] = y_; tx = add(tx, xxq[i], xxq[i] + xx[i], 1), ty = add(ty, yyq[i], yyq[i] + yy[i], 1); q = query(tx, x) + query(ty, y); } else printf("%d\n", p + q); } return 0; }

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

ruka.c: In function 'main':
ruka.c:96:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   96 |  scanf("%d", &n);
      |  ^~~~~~~~~~~~~~~
ruka.c:98:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   98 |   scanf("%d%d", &xx[i], &yy[i]);
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ruka.c:99:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   99 |  scanf("%d", &m);
      |  ^~~~~~~~~~~~~~~
ruka.c:111:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  111 |   scanf("%s", s);
      |   ^~~~~~~~~~~~~~
ruka.c:137:4: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  137 |    scanf("%d%d", &x_, &y_);
      |    ^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...