답안 #220067

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
220067 2020-04-06T21:58:05 Z tatyam Pyramid Base (IOI08_pyramid_base) C++17
5 / 100
5000 ms 40168 KB
#include <bits/stdc++.h>
using namespace std;
using uint = unsigned;
using ll = long long;
const int INF = 0x3fffffff;
template<class T, class U> bool chmin(T& a, const U& b){ if(a > b){ a = b; return 1; } return 0; }
#define rep(b) for(ll i = 0; i < b; i++)
#define each(i,a) for(auto&& i : a)
#define all(a) begin(a), end(a)

struct SegTree{
    int n;
    vector<ll> data, lazy;
    SegTree(int n): n(n), data(n * 2){}
    inline ll get() const {
        return data[1];
    }
    inline void add(int l, int r, int val){
        if(l < 0) l = 0;
        if(r > n) r = n;
        l += n;
        r += n;
        int L = l, R = r;
        for(; L < R; L /= 2, R /= 2){
            if(L & 1) data[L++] += val;
            if(R & 1) data[--R] += val;
        }
        r--;
        while(l /= 2){
            ll a = min(data[l * 2], data[l * 2 | 1]);
            if(a){
                data[l] += a;
                data[l * 2] -= a;
                data[l * 2 | 1] -= a;
            }
        }
        while(r /= 2){
            ll a = min(data[r * 2], data[r * 2 | 1]);
            if(a){
                data[r] += a;
                data[r * 2] -= a;
                data[r * 2 | 1] -= a;
            }
        }
    }
    inline void sub(int l, int r, int val){
        if(l < 0) l = 0;
        if(r > n) r = n;
        l += n;
        r += n;
        int L = l, R = r;
        for(; L < R; L /= 2, R /= 2){
            if(L & 1) data[L++] += val;
            if(R & 1) data[--R] += val;
        }
        L = l; R = r - 1;
        for(int i = __lg(L); i; i--){
            const int l = L >> i;
            ll a = min(data[l * 2], data[l * 2 | 1]);
            if(a){
                data[l] += a;
                data[l * 2] -= a;
                data[l * 2 | 1] -= a;
            }
        }
        for(int i = __lg(R); i; i--){
            const int r = R >> i;
            ll a = min(data[r * 2], data[r * 2 | 1]);
            if(a){
                data[r] += a;
                data[r * 2] -= a;
                data[r * 2 | 1] -= a;
            }
        }
    }
};
int main(){
    int m, n, b, p;
    scanf("%d %d %d %d", &m, &n, &b, &p);
    using tuplis = array<int, 4>;
    vector<tuplis> in, out;
    rep(p){
        int x1, y1, x2, y2, c;
        scanf("%d %d %d %d %d", &x1, &y1, &x2, &y2, &c);
        x1--; y1--;
        in.push_back({x1, y1, y2, c});
        out.push_back({x2, y1, y2, -c});
    }
    sort(all(in));
    sort(all(out));
    in.push_back({INF, 0, 0, 0});
    out.push_back({INF, 0, 0, 0});
    auto check = [&](int x) -> bool {
        x--;
        SegTree seg(n - x);
        int i1 = 0, i2 = 0, at = 0;
        while(at < m - x){
            while(in[i1][0] - x <= at){
                seg.add(in[i1][1] - x, in[i1][2], in[i1][3]);
                i1++;
            }
            while(out[i2][0] <= at){
                seg.sub(out[i2][1] - x, out[i2][2], out[i2][3]);
                i2++;
            }
            if(seg.get() <= b) return 1;
            at = min(in[i1][0] - x, out[i2][0]);
        }
        return 0;
    };
    int ok = 0, ng = min(n, m) + 1;
    while(ng - ok > 1){
        ll cen = (ok + ng) / 2;
        if(check(cen)) ok = cen;
        else ng = cen;
    }
    cout << ok << endl;
}

Compilation message

pyramid_base.cpp: In function 'int main()':
pyramid_base.cpp:79:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d %d %d", &m, &n, &b, &p);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pyramid_base.cpp:84:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d %d %d %d", &x1, &y1, &x2, &y2, &c);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 5 ms 384 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 256 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 384 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 640 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 13 ms 1924 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 18 ms 8192 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 75 ms 15176 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 896 KB Output is correct
2 Incorrect 34 ms 992 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 99 ms 2540 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 123 ms 9452 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 262 ms 13544 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 208 ms 9972 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2833 ms 23244 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3623 ms 26468 KB Output is correct
2 Incorrect 3322 ms 33808 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4026 ms 29472 KB Output is correct
2 Execution timed out 5072 ms 40168 KB Time limit exceeded
3 Halted 0 ms 0 KB -