Submission #274262

# Submission time Handle Problem Language Result Execution time Memory
274262 2020-08-19T10:38:03 Z evpipis Pyramid Base (IOI08_pyramid_base) C++11
70 / 100
5000 ms 117484 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){
    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 build(int p, int l, int r){
    if (l == r)
        return void(tree[p] = node());

    int mid = (l+r)/2;
    build(2*p, l, mid);
    build(2*p+1, mid+1, r);
    tree[p] = node();
}

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 <= m+1; i++)
        buck[i].clear();
    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);
    }

    for (int i = 1; i <= 4*n; i++)
        tree[i] = node();

    for (int y = 1; y <= m-k+1; y++){
        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
                update(1, 1, n, max(1, x1-k+1), x2, -cost[i]);
        }

        if (y != 1 && buck[y].empty())
            continue;

        if (query(1, 1, n, 1, n-k+1) <= 1ll*bud)
            return true;
    }

    return false;
}

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:86:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   86 |         for (int j = 0; j < buck[y].size(); j++){
      |                         ~~^~~~~~~~~~~~~~~~
pyramid_base.cpp: In function 'int main()':
pyramid_base.cpp:120:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  120 |     scanf("%d %d %d %d", &n, &m, &bud, &q);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pyramid_base.cpp:122:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  122 |         scanf("%d %d %d %d %d", &rec[i].x1, &rec[i].y1, &rec[i].x2, &rec[i].y2, &cost[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 76 ms 86392 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 58 ms 86392 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 70 ms 86520 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 67 ms 86648 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 100 ms 86776 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 317 ms 86684 KB Output is correct
2 Correct 392 ms 86952 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 433 ms 87060 KB Output is correct
2 Correct 357 ms 86520 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 81 ms 86760 KB Output is correct
2 Correct 108 ms 86868 KB Output is correct
3 Correct 128 ms 86904 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 412 ms 88928 KB Output is correct
2 Correct 722 ms 89344 KB Output is correct
3 Correct 583 ms 89472 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 896 ms 91512 KB Output is correct
2 Correct 469 ms 87160 KB Output is correct
3 Correct 205 ms 91284 KB Output is correct
4 Correct 2103 ms 95104 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1708 ms 94280 KB Output is correct
2 Correct 1978 ms 96404 KB Output is correct
3 Correct 882 ms 89208 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1475 ms 92524 KB Output is correct
2 Correct 2716 ms 99212 KB Output is correct
3 Correct 2480 ms 99324 KB Output is correct
4 Correct 2717 ms 99592 KB Output is correct
5 Correct 2608 ms 98928 KB Output is correct
6 Correct 922 ms 88568 KB Output is correct
# Verdict Execution time Memory Grader output
1 Execution timed out 5068 ms 112256 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 5075 ms 114408 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 5083 ms 117484 KB Time limit exceeded
2 Halted 0 ms 0 KB -