제출 #1348067

#제출 시각아이디문제언어결과실행 시간메모리
1348067killerzaluuAlternating Heights (CCO22_day1problem1)C++20
6 / 25
1095 ms4436 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];

// DFS cycle detection
bool dfs(int u, vector<int>& vis) {
    vis[u] = 1;
    for (int v : g[u]) {
        if (vis[v] == 1) return true;
        if (vis[v] == 0 && dfs(v, vis)) return true;
    }
    vis[u] = 2;
    return false;
}

bool has_cycle() {
    vector<int> vis(k + 1, 0);
    for (int i = 1; i <= k; i++) {
        if (vis[i] == 0 && dfs(i, vis)) return true;
    }
    return false;
}

// add edge for position i
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;

    if ((i & 1) == (l & 1)) {
        // need >
        edges.push_back({y, x});
    } else {
        // need <
        edges.push_back({x, y});
    }

    // rebuild graph
    for (int j = 1; j <= k; j++) g[j].clear();
    for (auto &e : edges) g[e.first].push_back(e.second);

    return !has_cycle();
}

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

    for (int l = start; l <= n; l += 2) {
        edges.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...