답안 #305613

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
305613 2020-09-23T17:03:17 Z 2fat2code Joker (BOI20_joker) C++17
0 / 100
2000 ms 19040 KB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define all(a) (a).begin(), (a).end()
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#define fr first
#define sc second
#define int long long
//#define mp make_pair
#define rc(s) return cout<<s,0
#define rcc(s) cout<<s,exit(0)

const int nmax = 200005;

int n,m,q,frbipartid[nmax],siz[nmax];
pair<int,int>par[nmax];
vector<int>rollback;
vector<pair<int,int>>edges;

void roll(int sz){
    while((int)rollback.size() > sz){
        auto it = rollback.back();
        siz[par[it].fr] -= siz[it];
        par[it].fr = it;
        par[it].sc = 0;
        rollback.pop_back();
    }
}

pair<int,int>findpar(int x){
    pair<int,int>ans = {par[x].fr, 0};
    if(x != par[x].fr){
        ans = findpar(par[x].fr);
        ans.sc ^= par[x].sc;
    }
    return ans;
}

bool onion(int x,int y){
    pair<int,int>x1,y1;
    x1 = findpar(x);
    y1 = findpar(y);
    if(x1.fr == y1.fr){
        if(x1.sc == y1.sc){
            return false;
        }
        else{
            return true;
        }
    }
    else{
        if(siz[x1.fr] > siz[y1.fr]){
            swap(x,y);
        }
        siz[y1.fr] += siz[x1.fr];
        par[x1.fr].fr = y1.fr;
        if(x1.sc == y1.sc){
            par[x1.fr].sc = 1;
        }
        else{
            par[x1.fr].sc = 0;
        }
        rollback.push_back(x1.fr);
        return true;
    }
}

void DAC(int l_nod,int r_nod,int l_range,int r_range,int func){
 //   cout << "CHECK " << l_nod << ' ' << r_nod << ' ' << l_range << ' ' << r_range << ' ' << l_range + (r_range - l_range)/2 << '\n';
    if(r_nod < l_nod) return;
    if(l_range == r_range){
        for(int j=l_nod;j<=r_nod;j++){
            frbipartid[j] = l_range;
        }
        return;
    }
    else{
        int mid = l_range + (r_range - l_range) / 2;
        bool bl = false;
        int sz_roll = rollback.size();
        for(int j=r_range;j>mid;j--){
            if(j == m + 1){
                continue;
            }
            else{
                if(!onion(edges[j-1].fr,edges[j-1].sc)){
                    bl = true;
                    break;
                }
            }
        }
        int indx = l_nod;
        if(bl == false){
            int sz_roll2=(int)rollback.size();
            indx = l_nod + 1;
            for(int j=l_nod+1;j<=min(r_nod,mid);j++){
                if(!onion(edges[j-1].fr,edges[j-1].sc)){
                    indx = j + 1;
                    break;
                }
            }
            roll(sz_roll2);
            DAC(l_nod,indx-1,l_range,mid,func+1);
        }
        roll(sz_roll);
        int sz_roll3 = (int)rollback.size();
        for(int j=l_nod;j<indx;j++){
            onion(edges[j-1].fr,edges[j-1].sc);
        }
        DAC(indx,r_nod,mid+1,r_range,func+1);
        roll(sz_roll3);
    }
}

int32_t main(){
    ios_base::sync_with_stdio(false);cin.tie(0);cerr.tie(0);cout.tie(0);
    srand(chrono::steady_clock::now().time_since_epoch().count());
   // freopen("input.in","r",stdin);
    cin >> n >> m >> q;
    for(int i=1;i<=n;i++){
        par[i] = {i, 0};
        siz[i] = 1;
    }
    for(int i=1;i<=m;i++){
        int x,y;
        cin >> x >> y;
        edges.push_back({x,y});
    }
    DAC(1,m,1,m+1,1);
    for(int i=1;i<=q;i++){
        int x,y;
        cin >> x >> y;
        if(frbipartid[x] <= y){
            cout << "NO" << '\n';
        }
        else{
            cout << "YES" << '\n';
        }
    }
}


# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Incorrect 1 ms 384 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Incorrect 1 ms 384 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 247 ms 14692 KB Output is correct
4 Correct 542 ms 18468 KB Output is correct
5 Correct 299 ms 19040 KB Output is correct
6 Correct 232 ms 14176 KB Output is correct
7 Correct 265 ms 13904 KB Output is correct
8 Execution timed out 2067 ms 8544 KB Time limit exceeded
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Incorrect 1 ms 384 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Incorrect 1 ms 384 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Incorrect 1 ms 384 KB Output isn't correct
5 Halted 0 ms 0 KB -