Submission #222213

# Submission time Handle Problem Language Result Execution time Memory
222213 2020-04-12T11:24:28 Z anonymous Pyramid Base (IOI08_pyramid_base) C++14
65 / 100
1422 ms 106388 KB
#include <iostream>
#include <algorithm>
#include <vector>
#include <cassert>
#define MAXD 1000005
#define MAXP 400005
using namespace std;
struct event {int x, ylo, yhi, c, type;};
int N, M, B, P, O[MAXP][5];
vector <event> Sweep, Sweep2[MAXD];

class Segtree {
    int ST[MAXD * 4][4], Lazy[MAXD * 4]; //range add, query longest sequence of 0s
    bool Z[MAXD * 4]; //is everything all same
    //longest running chain of min element, prefix, suffix, min
public:
    void reset(int l, int r, int cur) {
        ST[cur][0] = ST[cur][1] = ST[cur][2] = r-l+1;
        ST[cur][3] = 0, Z[cur] = 1, Lazy[cur] = 0;
        if (l != r) {
            int mid = (l + r) >> 1;
            reset(l, mid, 2*cur);
            reset(mid+1, r, 2*cur+1);
        }
    }
    void pushup(int cur) {
        if (ST[2*cur][3] == ST[2*cur+1][3]) {
            ST[cur][0] = max(ST[2*cur][0], ST[2*cur+1][0]);
            ST[cur][1] = ST[2*cur][1] + (Z[2*cur] ? ST[2*cur+1][1] : 0);
            ST[cur][2] = ST[2*cur+1][2] + (Z[2*cur+1] ? ST[2*cur][2] : 0);
            ST[cur][0] = max(ST[cur][0], ST[2*cur][2] + ST[2*cur+1][1]);
        } else if (ST[2*cur][3] > ST[2*cur+1][3]) {
            ST[cur][0] = ST[2*cur+1][0];
            ST[cur][1] = 0;
            ST[cur][2] = ST[2*cur+1][2];
        } else {
            ST[cur][0] = ST[2*cur][0];
            ST[cur][1] = ST[2*cur][1];
            ST[cur][2] = 0;
        }
        ST[cur][3] = min(ST[2*cur][3], ST[2*cur+1][3]);
        Z[cur] = Z[2*cur] && Z[2*cur + 1] && (ST[2*cur][3] == ST[2*cur+1][3]);
    }
    void pushdown(int cur, bool b) {
        ST[cur][3] += Lazy[cur];
        //assert(ST[cur][3] >= 0);
        if (!b) {
            Lazy[2*cur] += Lazy[cur];
            Lazy[2*cur+1] += Lazy[cur];
        }
        Lazy[cur] = 0;
    }
    void upd(int val, int lo, int hi, int l, int r, int cur) {
        pushdown(cur, l == r);
        if (hi < l || lo > r) {return;}
        if (lo <= l && hi >= r) {
            Lazy[cur] += val;
            pushdown(cur, l == r);
            return;
        } else {
            int mid = (l + r) >> 1;
            upd(val, lo, hi, l, mid, 2*cur);
            upd(val, lo, hi, mid+1, r, 2*cur+1);
            pushup(cur);
        }
    }
    int Min() {
        pushdown(1,M == 1);
        return(ST[1][3]);
    }
    int Run() {
        pushdown(1,M == 1);
        return(ST[1][0]);
    }
} ST;

void disp(event e) {
    printf("Event: %d %d %d %d %d\n",e.x,e.ylo,e.yhi, e.c, e.type);
}
void Case1() { //B > 0

}

void Case2() {
    ST.reset(1, M, 1);
    for (int i=0; i<P; i++) {
        Sweep2[O[i][0]].push_back({O[i][0], O[i][1], O[i][3], O[i][4], 1}); //add
        Sweep2[O[i][2]].push_back({O[i][2], O[i][1], O[i][3], O[i][4], 0}); //remove
        assert(O[i][2] >= O[i][0]);
    }
    int pL = 1, pR = 0, Ans = 0;
    while (pL <= N || pR <= N) {
        //code
       // printf("%d %d %d %d\n",pL,pR,ST.Min(),ST.Run());
       // if (ST.Min() == 0) {printf("%d %d %d\n", ST.Run(), pR,pL);}
        if (ST.Min() == 0 && ST.Run() >= pR - pL + 1) {
            Ans = max(Ans, pR-pL+1);
            if (pR == N) {break;}
            pR++;
            for (auto e: Sweep2[pR]) {
                if (e.type) {
                    //disp(e);
                    ST.upd(1, e.ylo, e.yhi, 1, M, 1);
                    //printf("%d %d %d %d\n",pL,pR,ST.Min(),ST.Run());
                }
            }
        } else {
            if (pL == N) {break;}
            for (auto e: Sweep2[pL]) {
                if (!e.type) {
                    //printf("DEBUG\n");
                    //disp(e);
                    ST.upd(-1, e.ylo, e.yhi, 1, M, 1);
                }
            }
            pL++;
            if (pR + 1 < pL) {
                pR++;
                for (auto e: Sweep2[pR]) {
                    if (e.type) {
                        //disp(e);
                            ST.upd(1, e.ylo, e.yhi, 1, M, 1);
                        //printf("%d %d %d %d\n",pL,pR,ST.Min(),ST.Run());
                    }
                }
            }
        }
    }
    printf("%d", Ans);
}

int main() {
    //freopen("pyin.txt","r",stdin);
    scanf("%d %d\n%d\n%d",&N,&M,&B, &P);
    for (int i=0; i<P; i++) {
        scanf("%d %d %d %d %d",&O[i][0], &O[i][1], &O[i][2], &O[i][3], &O[i][4]); //x1 y1 x2 y2 c
    }
    if (B) {Case1();}
    else {Case2();}
}

Compilation message

pyramid_base.cpp: In function 'int main()':
pyramid_base.cpp:134:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d\n%d\n%d",&N,&M,&B, &P);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pyramid_base.cpp:136:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d %d %d %d",&O[i][0], &O[i][1], &O[i][2], &O[i][3], &O[i][4]); //x1 y1 x2 y2 c
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 20 ms 23808 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 19 ms 23808 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 25 ms 23936 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 21 ms 24576 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 32 ms 29312 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 62 ms 67064 KB Output is correct
2 Correct 55 ms 67072 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 60 ms 67104 KB Output is correct
2 Correct 60 ms 67072 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 23 ms 24064 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 35 ms 24440 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 40 ms 24832 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 34 ms 25088 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 39 ms 25336 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 801 ms 83552 KB Output is correct
2 Correct 375 ms 44536 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1025 ms 91000 KB Output is correct
2 Correct 957 ms 89752 KB Output is correct
3 Correct 623 ms 97156 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1136 ms 94944 KB Output is correct
2 Correct 1420 ms 97692 KB Output is correct
3 Correct 1422 ms 97644 KB Output is correct
4 Correct 1230 ms 106388 KB Output is correct
5 Correct 886 ms 105340 KB Output is correct