Submission #274249

# Submission time Handle Problem Language Result Execution time Memory
274249 2020-08-19T10:32:36 Z evpipis Pyramid Base (IOI08_pyramid_base) C++11
70 / 100
5000 ms 119572 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 (r < i || j < l)
        return;
    if (i <= l && r <= j)
        return void(tree[p].lazy += v);

    int mid = (l+r)/2;
    update(2*p, l, mid, i, j, v);
    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);
    }

    build(1, 1, n);
    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:83:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   83 |         for (int j = 0; j < buck[y].size(); j++){
      |                         ~~^~~~~~~~~~~~~~~~
pyramid_base.cpp: In function 'int main()':
pyramid_base.cpp:117:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  117 |     scanf("%d %d %d %d", &n, &m, &bud, &q);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pyramid_base.cpp:119:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  119 |         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 63 ms 86392 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 63 ms 86392 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 60 ms 86520 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 77 ms 86624 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 119 ms 86776 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 304 ms 86648 KB Output is correct
2 Correct 343 ms 86904 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 346 ms 87144 KB Output is correct
2 Correct 295 ms 86684 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 82 ms 86780 KB Output is correct
2 Correct 112 ms 87008 KB Output is correct
3 Correct 140 ms 87032 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 369 ms 89068 KB Output is correct
2 Correct 671 ms 89720 KB Output is correct
3 Correct 560 ms 89980 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 907 ms 91476 KB Output is correct
2 Correct 383 ms 87544 KB Output is correct
3 Correct 158 ms 91776 KB Output is correct
4 Correct 2163 ms 96076 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1648 ms 94364 KB Output is correct
2 Correct 2051 ms 97272 KB Output is correct
3 Correct 1002 ms 89968 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1416 ms 92512 KB Output is correct
2 Correct 2888 ms 100108 KB Output is correct
3 Correct 2636 ms 100128 KB Output is correct
4 Correct 3198 ms 100196 KB Output is correct
5 Correct 2903 ms 99876 KB Output is correct
6 Correct 1002 ms 89464 KB Output is correct
# Verdict Execution time Memory Grader output
1 Execution timed out 5031 ms 112280 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 5045 ms 114308 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 5052 ms 119572 KB Time limit exceeded
2 Halted 0 ms 0 KB -