Submission #649827

# Submission time Handle Problem Language Result Execution time Memory
649827 2022-10-11T11:37:08 Z welleyth Joker (BOI20_joker) C++17
25 / 100
569 ms 26720 KB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;

//#define int long long
#define pb push_back
#define mp make_pair

#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")

constexpr int N = (int)2e5 + 111;
constexpr int md = (int)2e5 + 111;

mt19937 rnd(time(nullptr));

struct DSU{
    int p[N];
    int deep[N];
    vector<int> vertexes[N];
    int sz[N];
    DSU(){}
    void init(){
        for(int i = 0; i < N; i++){
            p[i] = i;
            deep[i] = 0;
            sz[i] = 1;
            vertexes[i].clear();
            vertexes[i].pb(i);
        }
    }
    int get(int x){
        return p[x] == x ? x : p[x] = get(p[x]);
    }
    void union_sets(int a,int b){
        a = get(a), b = get(b);
        if(a == b)
            return;
        if(vertexes[a].size() > vertexes[b].size())
            swap(a,b);
        p[a] = b;
        deep[b] = max(deep[b],deep[a]+1);
        sz[b] += sz[a];
        for(auto& x : vertexes[a])
            vertexes[b].pb(x);
    }
    bool connected(int a,int b){
        return get(a) == get(b);
    }
};

vector<int> g[N];
bool used[2][N];
bool c[2][N];

bool dfs(int v,int r,int pr = -1){
    used[r][v] = true;
    c[r][v] = true;
    for(auto& to : g[v]){
        if(pr == to)
            continue;
        if(used[r^1][to]){
            if(c[r][v]&c[r][to])
                return true;
            continue;
        }
        c[r^1][to] = true;
        if(dfs(to,r^1,v))
            return true;
    }
    return false;
}

int n,m,q;
vector<pair<int,int>> edges;

bool can(int l,int r){
    for(int j = 0; j <= n; j++){
        used[0][j] = false;
        used[1][j] = false;
        c[0][j] = c[1][j] = 0;
        g[j].clear();
    }
    bool have = false;
    for(int j = 0; j < l-1; j++){
        auto&[a,b] = edges[j];
        g[a].pb(b);
        g[b].pb(a);
    }
    for(int j = r; j < m; j++){
        auto&[a,b] = edges[j];
        g[a].pb(b);
        g[b].pb(a);
    }
    for(int j = 1; j <= n; j++){
        if(!used[0][j] && !used[1][j]){
            c[0][j] = 1;
            if(dfs(j,0)){
                return true;
            }
        }
    }
    return false;
}

void solve(){
    cin >> n >> m >> q;

    for(int i = 0; i < m; i++){
        int a,b;
        cin >> a >> b;
        edges.pb(mp(a,b));
    }

    bool answer[q];

    vector<pair<int,int>> Queries[m+1];

    for(int i = 0; i < q; i++){
        int l,r;
        cin >> l >> r;
        Queries[l].pb(mp(r,i));
    }
    for(int i = 0; i <= m; i++){
        if(Queries[i].empty())
            continue;
        sort(Queries[i].rbegin(),Queries[i].rend());
        if(!can(i,i)){
            for(auto&[r,id] : Queries[i]){
                answer[id] = 0;
            }
            continue;
        }
        int L = i, R = m;
        while(R - L > 1){
            int mid = (L+R)>>1;
            if(can(i,mid))
                L = mid;
            else
                R = mid;
        }
        for(auto&[r,id] : Queries[i]){
            if(r <= L)
                answer[id] = 1;
            else
                answer[id] = 0;
        }
    }

    for(int i = 0; i < q; i++){
        cout << (answer[i] ? "YES" : "NO") << "\n";
    }

    return;
}

signed main(){
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
//    init();
    int tests = 1;
//    cin >> tests;
    for(int test = 1; test <= tests; test++){
//        cerr << "test = " << test << "\n";
        solve();
    }
    return 0;
}
/**
6 8 2
1 3
1 5
1 6
2 5
2 6
3 4
3 5
5 6
4 7
4 8

**/

Compilation message

Joker.cpp: In function 'bool can(int, int)':
Joker.cpp:87:10: warning: unused variable 'have' [-Wunused-variable]
   87 |     bool have = false;
      |          ^~~~
# Verdict Execution time Memory Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 3 ms 4956 KB Output is correct
3 Correct 3 ms 4948 KB Output is correct
4 Incorrect 3 ms 4948 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 3 ms 4956 KB Output is correct
3 Correct 3 ms 4948 KB Output is correct
4 Incorrect 3 ms 4948 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 3 ms 4956 KB Output is correct
3 Correct 330 ms 26720 KB Output is correct
4 Correct 146 ms 24392 KB Output is correct
5 Correct 212 ms 22572 KB Output is correct
6 Correct 243 ms 20556 KB Output is correct
7 Correct 291 ms 18976 KB Output is correct
8 Correct 248 ms 21136 KB Output is correct
9 Correct 315 ms 21352 KB Output is correct
10 Correct 569 ms 20820 KB Output is correct
11 Correct 268 ms 18560 KB Output is correct
12 Correct 400 ms 20016 KB Output is correct
13 Correct 174 ms 18556 KB Output is correct
14 Correct 201 ms 20676 KB Output is correct
15 Correct 317 ms 20436 KB Output is correct
16 Correct 383 ms 20504 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 3 ms 4956 KB Output is correct
3 Correct 3 ms 4948 KB Output is correct
4 Incorrect 3 ms 4948 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 3 ms 4956 KB Output is correct
3 Correct 3 ms 4948 KB Output is correct
4 Incorrect 3 ms 4948 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 3 ms 4956 KB Output is correct
3 Correct 3 ms 4948 KB Output is correct
4 Incorrect 3 ms 4948 KB Output isn't correct
5 Halted 0 ms 0 KB -