제출 #1079276

#제출 시각아이디문제언어결과실행 시간메모리
1079276ProtonDecay314송신탑 (IOI22_towers)C++17
14 / 100
700 ms1964 KiB
// AM + DG
#include "towers.h"
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<ll> vll;
typedef vector<vll> vvll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> pi;
typedef pair<ll, ll> pll;
typedef vector<pi> vpi;
typedef vector<pll> vpll;
typedef vector<vpi> vvpi;
typedef vector<vpll> vvpll;
typedef vector<bool> vb;
typedef vector<vb> vvb;
typedef short int si;
typedef vector<si> vsi;
typedef vector<vsi> vvsi;
#define IOS ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
#define L(varll, mn, mx) for(ll varll = (mn); varll < (mx); varll++)
#define LR(varll, mx, mn) for(ll varll = (mx); varll > (mn); varll--)
#define LI(vari, mn, mx) for(int vari = (mn); vari < (mx); vari++)
#define LIR(vari, mx, mn) for(int vari = (mx); vari > (mn); vari--)
#define INPV(varvec) for(auto& varveci : (varvec)) cin >> varveci
#define fi first
#define se second
#define pb push_back
#define INF(type) numeric_limits<type>::max()
#define NINF(type) numeric_limits<type>::min()
#define TCASES int t; cin >> t; while(t--)

int n;
vi h;
vi inds;

void init(int N, vi H) {
    n = N;
    h = H;

    for(int i = 0; i < n; i++) {
        if((i == 0 || h[i] < h[i - 1]) && (i == n - 1 || h[i] < h[i + 1])) {
            inds.pb(i);
        }
    }
}

int max_towers(int L, int R, int D) {
    int inds_sz = inds.size();

    int l1 = -1, r1 = inds_sz;

    while(r1 - l1 > 1) {
        int m = (l1 + r1) >> 1;

        if(inds[m] >= L) r1 = m;
        else l1 = m;
    }

    int l2 = -1, r2 = inds_sz;

    while(r2 - l2 > 1) {
        int m = (l2 + r2) >> 1;

        if(inds[m] <= R) l2 = m;
        else r2 = m;
    }

    int ans = 0;

    if(r1 > l2) {
        // None found, just do the special case

        if(L == R) ans = 0;
        else {
            if(h[L] <= h[L + 1]) ans++;
            if(h[R] <= h[R - 1]) ans++;
        }
    } else {
        // We got some !!
        int lv = inds[r1], rv = inds[l2];
        ans += l2 - r1 + 1;

        if(L != lv && h[L] <= h[L + 1]) ans++;
        if(R != rv && h[R] <= h[R - 1]) ans++;
    }

    return max(ans, 1);
}

/*
The last frontier
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...