제출 #586549

#제출 시각아이디문제언어결과실행 시간메모리
586549LastRonin벽 (IOI14_wall)C++14
0 / 100
1 ms212 KiB
#include "wall.h" #include <bits/stdc++.h> using namespace std; #define pb push_back #define f first #define s second #define ll long long #define mp make_pair const int N = 5e5 + 10; ll K; struct seg { ll t[4 * N] = {0}; ll t2[4 * N] = {0}; void upd1(ll p, ll z, ll v = 1, ll tl = 1, ll tr = K) { if(tl == tr) { t[v] = z; return; } ll m = (tl + tr) >> 1ll; if(p <= m)upd1(p, z, v * 2, tl, m); else upd1(p, z, v * 2 + 1, m + 1, tr); t[v] = max(t[v * 2], t[v * 2 + 1]); } void upd2(ll p, ll z, ll v = 1, ll tl = 1, ll tr = K) { if(tl == tr) { t2[v] = z; return; } ll m = (tl + tr) >> 1ll; if(p <= m)upd2(p, z, v * 2, tl, m); else upd2(p, z, v * 2 + 1, m + 1, tr); t2[v] = min(t2[v * 2], t2[v * 2 + 1]); } ll get(ll x, ll y, ll v = 1, ll tl = 1, ll tr = K) { if(tl == tr) { if(y == t2[v])return x; else return y; } ll m = (tl + tr) >> 1ll; ll a = max(x, t[v * 2 + 1]); ll b = min(y, t2[v * 2 + 1]); if(a >= b) return get(x, y, v * 2 + 1, m + 1, tr); return get(a, b, v * 2, tl, m); } } rt; void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){ vector<int> g[n + 1]; K = k; for(int i = 0; i < k; i++) { g[left[i]].pb(i); g[right[i] + 1].pb(i); rt.upd2(i + 1, 1e9); rt.upd1(i + 1, 0); } for(int i = 0; i < n; i++) { // cout << i << "\n"; for(auto u : g[i]) { if(left[u] == i) { if(op[u] == 1) rt.upd1(u + 1, height[u]); if(op[u] == 2) rt.upd2(u + 1, height[u]); // cout << "+ " << u << "\n"; } else { // cout << "- " << u << "\n"; if(op[u] == 1) rt.upd1(u + 1, 0); if(op[u] == 2) rt.upd2(u + 1, 1e9); } } //if(i == 3)cout << "________________________"; finalHeight[i] = rt.get(0, 1e9); //if(i == 3)cout << "________________________"; } return; } /* int main() { int n; int k; int i, j; int status = 0; status = scanf("%d%d", &n, &k); assert(status == 2); int* op = (int*)calloc(sizeof(int), k); int* left = (int*)calloc(sizeof(int), k); int* right = (int*)calloc(sizeof(int), k); int* height = (int*)calloc(sizeof(int), k); int* finalHeight = (int*)calloc(sizeof(int), n); for (i = 0; i < k; i++){ status = scanf("%d%d%d%d", &op[i], &left[i], &right[i], &height[i]); assert(status == 4); } buildWall(n, k, op, left, right, height, finalHeight); for (j = 0; j < n; j++) printf("%d\n", finalHeight[j]); return 0; } /* 10 3 1 3 4 91220 1 5 9 48623 2 3 5 39412 */

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

wall.cpp:110:1: warning: "/*" within comment [-Wcomment]
  110 | /*
      |
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...