제출 #1305086

#제출 시각아이디문제언어결과실행 시간메모리
1305086jahongirICC (CEOI16_icc)C++20
100 / 100
70 ms628 KiB
#include "icc.h"
#include <bits/stdc++.h>
using namespace std;


int par[101];

int get(int u){
    if(par[u]<0) return u;
    return par[u]=get(par[u]);
}


void run(int N){

	vector<int> comp[N+1];
	for(int i = 1; i <= N; i++)
		comp[i].push_back(i), par[i] = -1;


	int A[N], B[N], sza, szb;

	for(int _ = 1; _ < N; _++){
		vector<vector<int>> vec(1);

		for(int i = 1; i <= N; i++) if(!comp[i].empty())
			vec[0].push_back(i);

		vector<int> lft,rht;

		for(; ;){
			lft.clear(), rht.clear();

			int cnt = 0;
			for(auto x : vec){
				for(int i = 0; i < (x.size()+cnt)/2; i++)
					lft.push_back(x[i]);
				for(int i = (x.size()+cnt)/2; i < x.size(); i++)
					rht.push_back(x[i]);
				
				cnt ^= 1;
			}

			sza = 0, szb = 0;
			for(auto x : lft)
				for(auto u : comp[x])
					A[sza++] = u;
			for(auto x : rht)
				for(auto u : comp[x])
					B[szb++] = u;

			int res = query(sza,szb,A,B);

			if(res) break;

			vector<vector<int>> tmp;
			cnt = 0;
			for(auto x : vec){
				tmp.push_back({});
				for(int i = 0; i < (x.size()+cnt)/2; i++)
					tmp.back().push_back(x[i]);
				if(tmp.back().size()==1) tmp.pop_back();
				tmp.push_back({});
				for(int i = (x.size()+cnt)/2; i < x.size(); i++)
					tmp.back().push_back(x[i]);
				if(tmp.back().size()==1) tmp.pop_back();
                cnt^=1;
			}

			vec.swap(tmp);
		}


		vector<int> tmp;
        for(auto x : lft)
            for(auto u : comp[x])
                tmp.push_back(u);
        swap(lft,tmp);
        tmp.clear();
        for(auto x : rht)
            for(auto u : comp[x])
                tmp.push_back(u);
        swap(rht,tmp);



        int szb = 0;
        for(auto x : rht)
            B[szb++] = x;

        int l = 0, r = lft.size()-1;
        while(l < r){
            int mid = (l+r)>>1;
            sza = 0;
            for(int i = l; i <= mid; i++)
                A[sza++] = lft[i];
            
            if(query(sza,szb,A,B)) r = mid;
            else l = mid+1;
        }

        int u = lft[l];
        sza = 1, A[0] = u;

        l = 0, r = rht.size()-1;
        while(l < r){
            int mid = (l+r)>>1;
            szb = 0;
            for(int i = l; i <= mid; i++)
                B[szb++] = rht[i];
            
            if(query(sza,szb,A,B)) r = mid;
            else l = mid+1;
        }
        int v = rht[l];

        setRoad(u,v);

        u = get(u), v = get(v);

        if(par[u]>par[v]) swap(u,v);
        par[u] += par[v]; par[v] = u;

        for(auto x : comp[v]) comp[u].push_back(x);
        comp[v].clear();

	}

}
#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...