제출 #1289835

#제출 시각아이디문제언어결과실행 시간메모리
1289835enzyICC (CEOI16_icc)C++20
0 / 100
5 ms580 KiB
#include<bits/stdc++.h>
#include"icc.h"
using namespace std;
const int maxn=110;
const int maxk=7;
vector<int>v[maxn];
int pai[maxn];
int rep(int a){
    if(pai[a]==a) return a;
    return pai[a]=rep(pai[a]);
}
int faz_query(int x, int y, vector<int>a, vector<int>b){
    int A[x], B[y];
    for(int i=0;i<x;i++) A[i]=a[i];
    for(int i=0;i<y;i++) B[i]=b[i];
    return query(x,y,A,B);
}
int find(vector<int> a, vector<int> b){
    int id=0;
    for(int k=0;k<maxk;k++){
        vector<int>aux;
        for(int j=0;j<a.size();j++) if(j&(1<<k)) aux.push_back(a[j]);
        if(aux.size()&&faz_query(aux.size(),b.size(),aux,b)) id+=(1<<k);
    }
    return a[id];
}
void merge(int u, int w){
    for(int x : v[w]) v[u].push_back(x);
    v[w].clear();
    pai[w]=u;
}
void run(int n){
    for(int i=1;i<=n;i++){
        v[i].push_back(i);
        pai[i]=i;
    }
    for(int i=1;i<n;i++){
        vector<int>a, b;
        int at=__lg(n-i+1);
        for(int k=0;k<=at;k++){
            a.clear(); b.clear();
            for(int j=1;j<=n;j++){
                if(j&(1<<k)) for(int x : v[j]) a.push_back(x);
                else for(int x : v[j]) b.push_back(x);
            }
            if(k==at) break;
            if(a.size()&&b.size()&&faz_query(a.size(),b.size(),a,b)) break;
        }
        int u=find(a,b), w=find(b,a);
        setRoad(u,w);
        u=rep(u); w=rep(w);
        if(u>w) swap(u,w);
        merge(u,w);
        for(int i=1;i<=n;i++) if(rep(i)==n-i+1) pai[i]=w;
        swap(v[w],v[n-i+1]);
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...