제출 #1356505

#제출 시각아이디문제언어결과실행 시간메모리
1356505coderg300711ICC (CEOI16_icc)C++20
61 / 100
61 ms620 KiB
#include "bits/stdc++.h"
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pii pair<int,int>
#define pll pair<long long,long long>
#define yes cout<<"Yes\n"
#define no cout<<"No\n"
#define pb push_back
#define sz(x) (int)(x).size()
#define rsz resize
#define ass assign
#define F(i,l,r) for(int i=(l);i<(r);++i)
typedef long long ll;
typedef unsigned long long ull;
typedef long double lld;
template<typename T> using pqg = priority_queue<T, vector<T>, greater<T>>;
#define each(a,x) for(auto a:x)
#define FOR(i,a) for(int i=0;i<(a);i++)
#define ROF(i,a,b) for(int i=(b)-1;i>=(a);i--)
#define eb emplace_back
#define ft front()
#define V vector

#include "icc.h"

int ask(V<int>& a,V<int>& b){
	if(a.empty() || b.empty())return 0;
	return query(sz(a),sz(b),a.data(),b.data());
}

V<int> combine(const V<V<int>>& comps,const V<int>& ids){
	V<int> res;
	each(id,ids){
		each(city,comps[id])res.pb(city);
	}
	return res;
}

void run(int N){
	V<V<int>> comps(N);
	FOR(i,N)comps[i].pb(i+1);
	FOR(r,N-1){
		int k=sz(comps);
		V<int> s0,s1;
		int found=-1;
		FOR(b,7){
			V<int> id0,id1;
			FOR(i,k){
				if((i>>b)&1)id0.pb(i);
				else id1.pb(i);
			}
			V<int> cities1=combine(comps,id0);
			V<int> cities2=combine(comps,id1);
			if(ask(cities1,cities2)){
				found=b;
				s0=id0;
				s1=id1;
				break;
			}
		}
		int lo=0,hi=sz(s0)-1;
	    V<int> all=combine(comps,s1);
	    while(lo<hi){
	    	int mid=(lo+hi)/2;
	    	V<int> sub;
	    	F(i,lo,mid+1)sub.pb(s0[i]);
	    	V<int> c=combine(comps,sub);
	    	if(ask(c,all))hi=mid;
	    	else lo=mid+1;
	    }
	    int idd=s0[lo];
	    lo=0,hi=sz(s1)-1;
	    V<int> cc=comps[idd];
	    while(lo<hi){
	    	int mid=(lo+hi)/2;
	    	V<int> sub;
	    	F(i,lo,mid+1)sub.pb(s1[i]);
	    	V<int> ccc=combine(comps,sub);
	    	if(ask(cc,ccc))hi=mid;
	    	else lo=mid+1;
	    }
	    int idd2=s1[lo];
	    V<int>& ca=comps[idd],cb=comps[idd2];
	    lo=0,hi=sz(ca)-1;
	    while(lo<hi){
	    	int mid=(lo+hi)/2;
	    	V<int> sub;
	    	F(i,lo,mid+1)sub.pb(ca[i]);
	    	if(ask(sub,cb))hi=mid;
	    	else lo=mid+1;
	    }
	    int u=ca[lo];
	    lo=0,hi=sz(cb)-1;
	    V<int> single={u};
	    while(lo<hi){
	    	int mid=(lo+hi)/2;
	    	V<int> sub;
	    	F(i,lo,mid+1)sub.pb(cb[i]);
	    	if(ask(single,sub))hi=mid;
	    	else lo=mid+1;
	    }
	    int v=cb[lo];
	    setRoad(u,v);
	    each(city,comps[idd2])comps[idd].pb(city);
	    comps.erase(comps.begin()+idd2);
	}
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…