제출 #1348094

#제출 시각아이디문제언어결과실행 시간메모리
1348094AvianshPyramid Base (IOI08_pyramid_base)C++20
39 / 100
3198 ms327680 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long

const int inf = 2e9;

struct segTree{
    struct node{
        int val,laz;
    };
    node *st;
    node def;
    segTree(int n){
        int x = ceil(log2(n));
        x++;
        st=new node[(1<<x)];
        def.val=0;
        def.laz=0;
        fill(st,st+(1<<x),def);
    }
    void push(int ind, int l, int r){
        if(st[ind].laz==0)
            return;
        st[ind].val+=st[ind].laz;
        if(l<r){
            st[ind*2+1].laz+=st[ind].laz;
            st[ind*2+2].laz+=st[ind].laz;
        }
        st[ind].laz=0;
    }
    void update(int l, int r,int s, int e, int ind, int val){
        push(ind,l,r);
        if(e<l||s>r){
            return;
        }
        if(s<=l&&r<=e){
            st[ind].laz=val;
            push(ind,l,r);
            return;
        }
        int mid = (l+r)/2;
        update(l,mid,s,e,ind*2+1,val);
        update(mid+1,r,s,e,ind*2+2,val);
        st[ind].val = min(st[ind*2+1].val,st[ind*2+2].val);
    }
};

int fin(int len, int m, int n, array<int,4> evs[], int p){
    if(len==0){
        return 0;
    }
    len--;
    p*=2;
    vector<array<int,3>>evens[m+1];
    for(int i = 0;i<p;i++){
        array<int,4>e = evs[i];
        e[1]-=len;
        e[1]=max(0LL,e[1]);
        if(e[3]<0){
            e[0]+=len;
        }
        e[0]=min(e[0],m);
        evens[e[0]].push_back({e[1],e[2],e[3]});
    }
    segTree st(n);
    st.update(0,n-1,0,n-1,0,inf);
    evens[len].push_back({0,n-1,-inf});
    st.update(0,n-1,n-len,n-1,0,inf);
    int ans = inf;
    for(int i = 0;i<m;i++){
        for(array<int,3>e:evens[i]){
            st.update(0,n-1,e[0],e[1],0,e[2]);
        }
        ans=min(ans,st.st[0].val);
    }
    return ans;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int m,n;
    cin >> m >> n;
    int b;
    cin >> b;
    int p;
    cin >> p;
    array<int,4> evs[p*2];
    for(int i = 0;i<p;i++){
        int x1,y1,x2,y2,c;
        cin >> x1 >> y1 >> x2 >> y2 >> c;
        x1--;x2--;
        y1--;y2--;
        evs[i]={x1,y1,y2,c};
        evs[i+p]={x2+1,y1,y2,-c};
    }
    int lo = 0;
    int hi = min(m,n);
    while(lo<hi){
        int mid = (lo+hi+1)/2;
        if(fin(mid,m,n,evs,p)<=b){
            lo=mid;
        }
        else{
            hi=mid-1;
        }
    }
    cout << lo;
    return 0;
}
#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...
#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...
#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...