Submission #800251

# Submission time Handle Problem Language Result Execution time Memory
800251 2023-08-01T12:46:32 Z TB_ Joker (BOI20_joker) C++17
25 / 100
193 ms 58888 KB
#include <bits/stdc++.h>
using namespace std;

// #undef _GLIBCXX_DEBUG                // disable run-time bound checking, etc
// #pragma GCC optimize("Ofast,inline") // Ofast = O3,fast-math,allow-store-data-races,no-protect-parens
// #pragma GCC optimize ("unroll-loops")

// #pragma GCC target("bmi,bmi2,lzcnt,popcnt")                      // bit manipulation
// #pragma GCC target("movbe")                                      // byte swap
// #pragma GCC target("aes,pclmul,rdrnd")                           // encryption
// #pragma GCC target("avx,avx2,f16c,fma,sse3,ssse3,sse4.1,sse4.2") // SIMD

// #include <bits/extc++.h>
// using namespace __gnu_pbds;
// template<class T>using ordered_set = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;
// template<class T>using ordered_multiset = tree<T, null_type, less_equal<T>, rb_tree_tag,tree_order_statistics_node_update>;

#define ll long long
#define INF (ll)1e9+7
#define fo(i, n) for(int i=0;i<((ll)n);i++)
#define deb(x) cout << #x << " = " << x << endl;
#define deb2(x, y) cout << #x << " = " << x << ", " << #y << " = " << y << endl
#define pb push_back
#define mp make_pair
#define F first
#define S second
#define LSOne(S) ((S) & (-S))
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
inline int readint(){ int v = 0; char c; while((c = getchar()) != EOF && c != ' ' && c != '\n'){ v *= 10; v += c - '0'; } return v; }
inline int readintsigned() { int v = 0; int sign = 1; char c = getchar(); if (c == '-') { sign = -1; } else { v += c - '0'; } while ((c = getchar()) != EOF && c != ' ' && c != '\n') { v *= 10; v += c - '0'; } return v * sign; }
inline string readstring() { string s; char c; while ((c = getchar()) != EOF && c != '\n' && c != ' ') { s.push_back(c); } return s; }
template <class result_t=std::chrono::milliseconds,class clock_t=std::chrono::steady_clock,class duration_t = std::chrono::milliseconds>
auto since(std::chrono::time_point<clock_t, duration_t> const& start){return std::chrono::duration_cast<result_t>(clock_t::now() - start);}
typedef pair<int, int> pii;
typedef pair<ll, ll> pl;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vpii;
typedef vector<pl> vpl;
typedef vector<vi> vvi;
typedef vector<vl> vvl;
typedef vector<vpii> vvpii;
typedef vector<vpl> vvpl;



struct UnionFind{
    vl degree, height, p, siz, extraHeight;
    vector<vvpl> updates; // pUpdates, heightUpdate, sizUpdate
    vi possibleUpdate, extraHeightUpdate;
    int n;
    int possible = 0;
    UnionFind(int n) : n(n) {
        height.assign(n, 0);
        extraHeight.assign(n, 0);
        degree.assign(n, 0); 
        p.assign(n, 0); 
        siz.assign(n, 1); 
        fo(i, n) p[i] = i;
    }

    int find(int x){
        if(x == p[x]) return x;
        // updates[updates.size()-1][0].pb({x, p[x]});
        updates[updates.size()-1][1].pb({x, height[x]});
        int res = find(p[x]);
        height[x] = height[p[x]]+1+extraHeight[x];
        return res;
    }


    void addEdge(int a, int b){
        possibleUpdate.pb(possible);
        extraHeightUpdate.pb(-1);
        updates.pb({{}, {}, {}});
        int a2 = find(a);
        int b2 = find(b);
        if(a2==b2){
            if(height[a]%2 == height[b]%2) possible++;
        }else{
            if(siz[b2] > siz[a2]) {
                swap(a2, b2);
                swap(a, b);
            }
            updates[updates.size()-1][2].pb({a2, siz[a2]});
            updates[updates.size()-1][0].pb({b2, p[b2]});
            siz[a2] += siz[b2];
            p[b2] = a2;
            if((height[b2]%2 == height[b]%2)^(height[a2]%2 == height[a]%2)){
                extraHeight[b2]++;
                extraHeightUpdate[extraHeightUpdate.size()-1] = b2;
            }
        }
    }  


    void backtrack(){
        possible = possibleUpdate[possibleUpdate.size()-1];
        int heightupdate = extraHeightUpdate[extraHeightUpdate.size()-1];
        if(heightupdate != -1) extraHeight[heightupdate]--;
        for(auto up : updates[possibleUpdate.size()-1][0]) p[up.F] = up.S;
        for(auto up : updates[possibleUpdate.size()-1][1]) height[up.F] = up.S;
        for(auto up : updates[possibleUpdate.size()-1][2]) siz[up.F] = up.S;
        updates.pop_back();
        possibleUpdate.pop_back();
    }  
};


int main() {
    // cout << fixed << setprecision(20);
    // auto start = std::chrono::steady_clock::now(); // since(start).count()
    cin.tie(0)->sync_with_stdio(0);

    int n, m, q, from, to, que;
    vpl edges;
    cin >> n >> m >> q;
    fo(i, m){
        cin >> from >> to;
        edges.pb({from-1, to-1});
    }

    vector<vector<tuple<int, int, int>>> queries(1000);
    fo(x, q){
        cin >> from >> to;
        queries[from/((int)sqrt(n))].pb({to-1, from-1, x});
    }
    fo(i, 1000){
        sort(rall(queries[i]));
    }
    UnionFind uf(n);
    vi ans(q, 0);
    int lo = 0;
    fo(section, 1000){
        int hi = m-1;
        if(!queries[section].size()) continue;
        fo(i, ((int)sqrt(n))*section-lo) 
            uf.addEdge(edges[lo+i].F, edges[lo+i].S);
        lo = ((int)sqrt(n))*section;
        for(auto query : queries[section]){
            tie(to, from, que) = query;
            fo(i, hi-to) uf.addEdge(edges[hi-i].F,edges[hi-i].S);
            hi=to;

            fo(i, from-lo) 
                uf.addEdge(edges[lo+i].F, edges[lo+i].S);
            if(uf.possible) ans[que] = 1;
            fo(i, from-((int)sqrt(n))*section)
                uf.backtrack();
            lo = ((int)sqrt(n))*section;
        }
        while(uf.possibleUpdate.size()-lo)
            uf.backtrack();
    }
    fo(i, q) cout << (ans[i]?"YES\n":"NO\n");


    return 0;
}

# Verdict Execution time Memory Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 340 KB Output is correct
5 Incorrect 1 ms 316 KB Output isn't correct
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 340 KB Output is correct
5 Incorrect 1 ms 316 KB Output isn't correct
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 131 ms 50220 KB Output is correct
4 Correct 172 ms 54840 KB Output is correct
5 Correct 171 ms 54124 KB Output is correct
6 Correct 147 ms 50716 KB Output is correct
7 Correct 163 ms 58888 KB Output is correct
8 Correct 156 ms 51016 KB Output is correct
9 Correct 164 ms 52916 KB Output is correct
10 Correct 183 ms 56376 KB Output is correct
11 Correct 153 ms 51576 KB Output is correct
12 Correct 160 ms 52560 KB Output is correct
13 Correct 175 ms 49152 KB Output is correct
14 Correct 164 ms 50812 KB Output is correct
15 Correct 157 ms 54660 KB Output is correct
16 Correct 193 ms 56268 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 340 KB Output is correct
5 Incorrect 1 ms 316 KB Output isn't correct
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 340 KB Output is correct
5 Incorrect 1 ms 316 KB Output isn't correct
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 340 KB Output is correct
5 Incorrect 1 ms 316 KB Output isn't correct
6 Halted 0 ms 0 KB -