제출 #800840

#제출 시각아이디문제언어결과실행 시간메모리
800840Liudas벽 (IOI14_wall)C++17
32 / 100
455 ms30352 KiB
#include <bits/stdc++.h>
#include "wall.h"
using namespace std;
void buildWall(int N, int K, int op[], int l[], int r[], int h[], int fh[]){
    if(N <= 10000 && K <= 5000){
        for(int i = 0; i < K; i ++){
            for(int j = l[i]; j < r[i] + 1; j ++){
                if(op[i] == 1){
                    fh[j] = max(h[i], fh[j]);
                }
                else{
                    fh[j] = min(h[i], fh[j]);
                }
            }
        }
    }
    else{
        vector<vector<int>> arr(N + 5);
        for(int i = 0; i < K; i ++){
            if(op[i] == 2)continue;
            arr[l[i]].push_back(h[i] + 1);
            arr[r[i]+1].push_back(-h[i] - 1);
        }
        multiset<int> mov;
        mov.insert(0);
        for(int i = 0; i < N; i ++){
            for(int j : arr[i]){
                if(j > 0)
                mov.insert(j-1);
                else
                mov.erase(mov.find(-j - 1));
            }
            fh[i] = *mov.rbegin();
            arr[i].clear();
        }
        mov.clear();
        for(int i = 0; i < K; i ++){
            if(op[i] == 1)continue;
            arr[l[i]].push_back(h[i] + 1);
            arr[r[i]+1].push_back(-h[i] - 1);
        }
        mov.insert(1e9);
        for(int i = 0; i < N; i ++){
            for(int j : arr[i]){
                if(j > 0)
                mov.insert(j-1);
                else
                mov.erase(mov.find(-j - 1));
            }
            fh[i] = min(fh[i], *mov.begin());
            arr[i].clear();
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...