제출 #1348073

#제출 시각아이디문제언어결과실행 시간메모리
1348073killerzaluuAlternating Heights (CCO22_day1problem1)C++20
25 / 25
379 ms4552 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 3005;

int n, k, q;
int a[N];
int r[N];

vector<int> g[N];

// check if v can reach u
bool dfs(int v, int target, vector<int>& vis) {
    if (v == target) return true;
    vis[v] = 1;
    for (int to : g[v]) {
        if (!vis[to] && dfs(to, target, vis)) return true;
    }
    return false;
}

// try adding edge
bool check(int l, int i, vector<pair<int,int>>& edges) {
    int x = a[i - 1];
    int y = a[i];

    if (x == y) return false;

    int u, v;

    if ((i & 1) == (l & 1)) {
        // need >
        // x > y → y -> x
        u = y;
        v = x;
    } else {
        // need <
        // x < y → x -> y
        u = x;
        v = y;
    }

    vector<int> vis(k + 1, 0);
    if (dfs(v, u, vis)) return false;

    g[u].push_back(v);
    edges.push_back({u, v});
    return true;
}

void solve(int start) {
    int rr = start;
    vector<pair<int,int>> edges;

    for (int l = start; l <= n; l += 2) {
        edges.clear();
        for (int i = 1; i <= k; i++) g[i].clear();

        rr = l;
        r[l] = l;

        while (rr + 1 <= n && check(l, rr + 1, edges)) {
            rr++;
            r[l] = rr;
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> k >> q;
    for (int i = 1; i <= n; i++) cin >> a[i];

    solve(1);
    solve(2);

    while (q--) {
        int l, rr;
        cin >> l >> rr;
        cout << (rr <= r[l] ? "YES\n" : "NO\n");
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...