답안 #274696

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
274696 2020-08-19T14:19:18 Z evpipis Pyramid Base (IOI08_pyramid_base) C++11
70 / 100
5000 ms 122100 KB
#include <bits/stdc++.h>
using namespace std;

#define pb push_back
typedef long long ll;

const int len = 1e6+4;
const ll inf = 1e16;
int cost[len], n, m, bud, q;
vector<int> buck[len];

struct rectangle{
    int x1, x2, y1, y2;
} rec[len];

struct node{
    ll mn, lazy;

    node(ll mn_ = 0, ll lazy_ = 0){
        mn = mn_;
        lazy = lazy_;
    }
} tree[4*len];

void prop(int p, int l, int r){
    if (!tree[p].lazy) return;

    tree[p].mn += tree[p].lazy;
    if (l != r){
        tree[2*p].lazy += tree[p].lazy;
        tree[2*p+1].lazy += tree[p].lazy;
    }
    tree[p].lazy = 0;
}

void update(int p, int l, int r, int i, int j, int v){
    prop(p, l, r);

    if (i <= l && r <= j)
        return void(tree[p].lazy += v);

    int mid = (l+r)/2;
    if (i <= mid)
        update(2*p, l, mid, i, j, v);
    if (j >= mid+1)
        update(2*p+1, mid+1, r, i, j, v);

    prop(2*p, l, mid), prop(2*p+1, mid+1, r);
    tree[p].mn = min(tree[2*p].mn, tree[2*p+1].mn);
}

ll query(int p, int l, int r, int i, int j){
    prop(p, l, r);

    if (r < i || j < l)
        return inf;
    if (i <= l && r <= j)
        return tree[p].mn;

    int mid = (l+r)/2;
    return min(query(2*p, l, mid, i, j), query(2*p+1, mid+1, r, i, j));
}

bool check(int k){
    for (int i = 1; i <= q; i++){
        int y1 = rec[i].y1, y2 = rec[i].y2;

        buck[max(1, y1-k+1)].pb(i);
        buck[y2+1].pb(-i);
    }

    bool ans = false;
    for (int y = 1; y <= m+1; y++){
        int must = (y==1);
        for (int j = 0; j < buck[y].size(); j++){
            int i = abs(buck[y][j]);
            int x1 = rec[i].x1, x2 = rec[i].x2;

            if (buck[y][j] > 0)
                update(1, 1, n, max(1, x1-k+1), x2, cost[i]);
            else
                must = 1, update(1, 1, n, max(1, x1-k+1), x2, -cost[i]);
        }

        buck[y].clear();
        if (must && y <= m-k+1)
            ans |= (query(1, 1, n, 1, n-k+1) <= bud);
    }

    return ans;
}

int bs(){
    int l = 1, r = min(n, m), ans = 0;
    while (l <= r){
        int mid = (l+r)/2;
        if (check(mid))
            ans = mid, l = mid+1;
        else
            r = mid-1;
    }

    return ans;
}

int main(){
    scanf("%d %d %d %d", &n, &m, &bud, &q);
    for (int i = 1; i <= q; i++)
        scanf("%d %d %d %d %d", &rec[i].x1, &rec[i].y1, &rec[i].x2, &rec[i].y2, &cost[i]);

    printf("%d\n", bs());
    return 0;
}

Compilation message

pyramid_base.cpp: In function 'bool check(int)':
pyramid_base.cpp:75:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   75 |         for (int j = 0; j < buck[y].size(); j++){
      |                         ~~^~~~~~~~~~~~~~~~
pyramid_base.cpp: In function 'int main()':
pyramid_base.cpp:107:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  107 |     scanf("%d %d %d %d", &n, &m, &bud, &q);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pyramid_base.cpp:109:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  109 |         scanf("%d %d %d %d %d", &rec[i].x1, &rec[i].y1, &rec[i].x2, &rec[i].y2, &cost[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 54 ms 86424 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 51 ms 86392 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 57 ms 86648 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 65 ms 86648 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 95 ms 86904 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 156 ms 86648 KB Output is correct
2 Correct 179 ms 86904 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 230 ms 87080 KB Output is correct
2 Correct 148 ms 86520 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 102 ms 86780 KB Output is correct
2 Correct 144 ms 86908 KB Output is correct
3 Correct 129 ms 86964 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 651 ms 89208 KB Output is correct
2 Correct 696 ms 89728 KB Output is correct
3 Correct 547 ms 89832 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1466 ms 92264 KB Output is correct
2 Correct 500 ms 87672 KB Output is correct
3 Correct 211 ms 91864 KB Output is correct
4 Correct 1722 ms 95864 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1914 ms 95056 KB Output is correct
2 Correct 1689 ms 97420 KB Output is correct
3 Correct 1255 ms 90108 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1788 ms 93196 KB Output is correct
2 Correct 2529 ms 100208 KB Output is correct
3 Correct 2475 ms 100096 KB Output is correct
4 Correct 2390 ms 100352 KB Output is correct
5 Correct 2273 ms 99844 KB Output is correct
6 Correct 1462 ms 89720 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5032 ms 117472 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5038 ms 119948 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5038 ms 122100 KB Time limit exceeded
2 Halted 0 ms 0 KB -