제출 #1133146

#제출 시각아이디문제언어결과실행 시간메모리
1133146t9unkubj벽 (IOI14_wall)C++20
0 / 100
84 ms23876 KiB
#ifdef t9unkubj
#include"debug.cpp"
//#include"template_no_debug.h"
#else 
#define dbg(...) 199958
#endif

#undef _GLIBCXX_DEBUG
#pragma GCC optimize("O3")
using namespace std;
#include<bits/stdc++.h>
using ll=long long;
using ull=unsigned long long;
template<class T>using vc=vector<T>;
template<class T>using vvc=vc<vc<T>>;
#define rep(i,n) for(ll i=0;i<(ll)(n);i++)
#define REP(i,j,n) for(ll i=(j);i<(ll)(n);i++)
#define DREP(i,n,m) for(ll i=(n);i>=(m);i--)
#define drep(i,n) for(ll i=((n)-1);i>=0;i--)
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
template<class T,class F>
bool chmin(T &x, F y){
    if(x>y){
        x=y;
        return true;
    }
    return false;
}
template<class T, class F>
bool chmax(T &x, F y){
    if(x<y){
        x=y;
        return true;
    }
    return false;
}
template<class T>
struct dual_seg{
    int n;
    using F=function<T(T,T)>;
    F op;
    T id;
    vector<T>lazy;
    int log=0;
    dual_seg(int n_,F op,T id):n(n_),op(op),id(id){
        while((1<<log)<n_)log++;
        n=1<<log;
        lazy=vector<T>(n*2,id);
    }
    void set(int i,T x){
        assert(0<=i&&i<n);
        for(int j=log;j>=1;j--){
            push(i>>j);
        }
        lazy[i]=x;
    }
    void apply(int l,int r,T x){
        assert(0<=l&&l<=r&&r<=n);
        if(l==r)return;
        l+=n,r+=n;
        for(int i=log;i>=1;i--){
            if(((l>>i)<<i)!=l)push(l>>i);
            if(((r>>i)<<i)!=r)push((r-1)>>i);
        }
        while(l<r){
            if(l&1)all_apply(l++,x);
            if(r&1)all_apply(--r,x);
            l>>=1,r>>=1;
        }
    }
    T get(int i){
        assert(0<=i&&i<n);
        i+=n;
        for(int j=log;j>=1;j--){
            push(i>>j);
        }
        return lazy[i];
    }
    void push(int k){
        all_apply(k*2,lazy[k]),all_apply(k*2+1,lazy[k]);
        lazy[k]=id;
    }
    void all_apply(int k,T x){
        lazy[k]=op(lazy[k],x);
    }
};
struct S{
    ll low;
    ll high;
    //[low,high]
};

vc<int>solve(int n,int k,vc<int>op,vc<int>l,vc<int>r,vc<int>h){

    dual_seg<S>seg(n,[&](auto a,auto b){
        S c;
        c.low=max(b.low,a.low);
        c.high=min(b.high,max(b.low,a.high));
        return c;
    },S{(ll)-2e18,(ll)2e18});
    rep(i,k){
        if(op[i]==1){
            seg.apply(l[i],r[i]+1,S{h[i],(ll)2e18});
        }else{
            seg.apply(l[i],r[i]+1,S{0,h[i]});
        }
    }
    vc<int>ans(n);
    rep(i,n){
        auto R=seg.get(i);
        ans[i]=clamp<ll>(0,R.low,R.high);
    }
    return ans;
}
void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
    vc<int>OP(k),l(k),r(k),h(k);
    rep(i,k)OP[i]=op[i],l[i]=left[i],r[i]=right[i],h[i]=height[i];
    auto res=solve(n,k,OP,l,r,h);
    rep(i,n)finalHeight[i]=res[i];
}
namespace judge{
    void run(){
        int n,k;
        cin>>n>>k;
        int op[k],l[k],r[k],h[k];
        int ans[n];
        rep(i,k)cin>>op[i]>>l[i]>>r[i]>>h[i];
        buildWall(n,k,op,l,r,h,ans);
        rep(i,n)dbg(ans[i]);
    }
};
///int main(){judge::run();}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...