Submission #1205354

#TimeUsernameProblemLanguageResultExecution timeMemory
1205354thelegendary08Airline Route Map (JOI18_airline)C++17
88 / 100
229 ms23352 KiB
#include "Alicelib.h"
#include <cassert>
#include <cstdio>
#include<bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define vi vector<int>
#define vvi vector<vector<int>>
#define pii pair<int, int>
#define vpii vector<pair<int, int>>
#define vc vector<char>
#define vb vector<bool>
#define mii map<int,int>
#define f0r(i,n) for(int i=0;i<n;i++)
#define FOR(i,k,n) for(int i=k;i<n;i++)
#define all(v) (v).begin(),(v).end()
#define rall(v) (v).rbegin(),(v).rend()
#define in(a) int a; cin>>a
#define in2(a,b) int a,b; cin>>a>>b
#define in3(a,b,c) int a,b,c; cin>>a>>b>>c
#define in4(a,b,c,d) int a,b,c,d; cin>>a>>b>>c>>d
#define vin(v,n); vi v(n); f0r(i,n){cin>>v[i];}
#define out(a) cout<<a<<'\n'
#define out2(a,b) cout<<a<<' '<<b<<'\n'
#define out3(a,b,c) cout<<a<<' '<<b<<' '<<c<<'\n'
#define out4(a,b,c,d) cout<<a<<' '<<b<<' '<<c<<' '<<d<<'\n'
#define pout(a) cout<<a.first<<' '<<a.second<<'\n'
#define vout(v) for(auto u : v){cout<<u<<' ';} cout<<'\n'
#define dout(a) cout<<a<<' '<<#a<<'\n'
#define dout2(a,b) cout<<a<<' '<<#a<<' '<<b<<' '<<#b<<'\n'
#define yn(x); if(x){cout<<"YES"<<'\n';}else{cout<<"NO"<<'\n';}
const int leg = 1e9 + 7;
const int mod = 998244353;
using namespace std;

void Alice( int N, int M, int A[], int B[] ){
	/*
	InitG( 3, 2 );
	MakeG( 1, 2 );
	MakeG( 1, 3 );
	*/
	if(N <= 3){
		if(N == 1){
			InitG(1, 0);
		}
		else{
			if(N == 2){
				if(M == 0)InitG(2, 0);
				else InitG(3, 0);
			}
			else{
				int cur = 4;
				f0r(i, M){
					int sum = A[i] + B[i];
					if(sum == 1)cur++; //draw 0-1
					if(sum == 2)cur+=2; //draw 0-2
					if(sum == 3)cur+=4; //draw 1-2
				}
				InitG(cur, 0);
			}
		}
	}
	else{
		int cnt = 0;
		mii encode;
		mii decode;
		vb visd((1 << 11));
		int stupid = 0;
		f0r(i, 11){
			stupid += (1 << i);
		}
		visd[stupid] = 1;
		encode[0] = stupid;
		decode[stupid] = 0;
		stupid-=2;
		visd[stupid] = 1;
		encode[1] = stupid;
		decode[stupid] = 1;
		stupid+=2;
		stupid-=4;
		visd[stupid] = 1;
		encode[2] = stupid;
		decode[stupid] = 2;
		stupid += 4;
		stupid -= 8;
		visd[stupid] = 1;
		encode[3] = stupid;
		decode[stupid] = 3;
		cnt = 4;
		f0r(i, (1<<11)){
			if(visd[i])continue;
			int on = 0;
			f0r(j, 11){
				if((1 << j) & i)on++;
			}
			
			if(on >= 6){
				encode[cnt] = i;
				decode[i] = cnt; 
				cnt++;
			}
		}
		
		vpii edges;
		f0r(i, M){
			edges.pb(mp(A[i], B[i]));
		}
		//N to N + 10 
		//N + 11 to N + 13 as dummy
		f0r(i, N){
			int ec = encode[i];
			f0r(j, 11){
				if(ec & (1 << j)){
					edges.pb(mp(i, N + j));
				}
			}
		}
		
		FOR(i, N, N + 10){
			edges.pb(mp(i, i+1));
		}
		FOR(i, N, N + 5){
			edges.pb(mp(i, N + 11));
		}
		FOR(i, N + 5, N + 8){
			edges.pb(mp(i, N + 12));
		}
		FOR(i, N + 8, N + 11){
			edges.pb(mp(i, N + 13));
		}
		vi deg(N + 14);
		for(auto u : edges){
			deg[u.first]++; deg[u.second]++;
		}
		FOR(i, N, N+11){
			// cout<<deg[i]<<' ';
		}
		// cout<<'\n';
		InitG(N + 14, edges.size());
		int ct = 0;
		for(auto u : edges){
			MakeG(ct, u.first, u.second);
			ct++;
		}
	}
	
}

#include "Boblib.h"
#include <cassert>
#include <cstdio>
#include<bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define vi vector<int>
#define vvi vector<vector<int>>
#define pii pair<int, int>
#define vpii vector<pair<int, int>>
#define vc vector<char>
#define vb vector<bool>
#define mii map<int,int>
#define f0r(i,n) for(int i=0;i<n;i++)
#define FOR(i,k,n) for(int i=k;i<n;i++)
#define all(v) (v).begin(),(v).end()
#define rall(v) (v).rbegin(),(v).rend()
#define in(a) int a; cin>>a
#define in2(a,b) int a,b; cin>>a>>b
#define in3(a,b,c) int a,b,c; cin>>a>>b>>c
#define in4(a,b,c,d) int a,b,c,d; cin>>a>>b>>c>>d
#define vin(v,n); vi v(n); f0r(i,n){cin>>v[i];}
#define out(a) cout<<a<<'\n'
#define out2(a,b) cout<<a<<' '<<b<<'\n'
#define out3(a,b,c) cout<<a<<' '<<b<<' '<<c<<'\n'
#define out4(a,b,c,d) cout<<a<<' '<<b<<' '<<c<<' '<<d<<'\n'
#define pout(a) cout<<a.first<<' '<<a.second<<'\n'
#define vout(v) for(auto u : v){cout<<u<<' ';} cout<<'\n'
#define dout(a) cout<<a<<' '<<#a<<'\n'
#define dout2(a,b) cout<<a<<' '<<#a<<' '<<b<<' '<<#b<<'\n'
#define yn(x); if(x){cout<<"YES"<<'\n';}else{cout<<"NO"<<'\n';}
using namespace std;

void Bob( int V, int U, int C[], int D[] ){
	/*
	InitMap( 3, 2 );
	MakeMap( 1, 2 );
	MakeMap( 1, 3 );
	*/
	
	if(U == 0){
		if(V == 1){
			InitMap(1, 0);
		}
		else if(V == 2){
			InitMap(2, 0);
		}
		else if(V == 3){
			InitMap(2, 1);
			MakeMap(0, 1);
		}
		else{
			int thing = V - 4;
			vpii edges;
			if(thing & 1){
				edges.pb(mp(0, 1));
			}
			if(thing & 2){
				edges.pb(mp(0, 2));
			}
			if(thing & 4){
				edges.pb(mp(1,2));
			}
			
			InitMap(3, edges.size());
			for(auto u : edges){
				MakeMap(u.first,u.second);
			}
		}
	}
	else{
		int cnt = 0;
		mii encode;
		mii decode;
		vb visd((1 << 11));
		int stupid = 0;
		f0r(i, 11){
			stupid += (1 << i);
		}
		visd[stupid] = 1;
		encode[0] = stupid;
		decode[stupid] = 0;
		stupid-=2;
		visd[stupid] = 1;
		encode[1] = stupid;
		decode[stupid] = 1;
		stupid+=2;
		stupid-=4;
		visd[stupid] = 1;
		encode[2] = stupid;
		decode[stupid] = 2;
		stupid += 4;
		stupid -= 8;
		visd[stupid] = 1;
		encode[3] = stupid;
		decode[stupid] = 3;
		cnt = 4;
		
		f0r(i, (1<<11)){
			if(visd[i])continue;
			int on = 0;
			f0r(j, 11){
				if((1 << j) & i)on++;
			}
			
			if(on >= 6){
				encode[cnt] = i;
				decode[i] = cnt; 
				cnt++;
			}
		}
		
		vi deg(V);
		vvi adj(V);
		f0r(i, U){
			adj[C[i]].pb(D[i]);
			adj[D[i]].pb(C[i]);
			deg[C[i]]++;
			deg[D[i]]++;
		}
		vi things;
		int five;
		f0r(i, V){
			if(deg[i] <= 5)things.pb(i);
			if(deg[i] == 5)five = i;
		}
		// vout(things);
		vi sus;
		vb issus(V);
		for(auto u : things){
			for(auto v : adj[u]){
				sus.pb(v);
				issus[v] = 1;
			}
		}
		
		map<int,set<int>>susadj;
		mii susdeg;
		for(auto u : sus){
			for(auto v : adj[u]){
				if(issus[v]){
					susadj[u].insert(v);
					susadj[v].insert(u);
				}
			}
		}
		for(auto u : susadj){
			susdeg[u.first] = u.second.size();
		}
		
		int st;
		for(auto u : susdeg){
			if(u.second == 1 && find(adj[u.first].begin(), adj[u.first].end(), five) != adj[u.first].end()){
				st = u.first;
			}
		}
		
		int cur = st;
		vi gw; 
		gw.pb(cur);
		set<int>vis;
		vis.insert(cur);
		while(1){
			bool f = 0;
			for(auto u : susadj[cur]){
				if(!vis.count(u)){
					cur = u; vis.insert(u); f=1; break;
				}
			}
			if(!f)break;
			gw.pb(cur);
			
		}
		mii val;
		f0r(i, gw.size()){
			val[gw[i]] = (1 << i);
		}
		// vout(gw);
		vi label(V, 0);
		f0r(i, gw.size()){
			for(auto u : adj[gw[i]]){
				if(deg[u] > 5 && !issus[u]){
					label[u] += val[gw[i]];
				}
			}
		}
		
		vpii edges;
		f0r(i, U){
			// out2(C[i], D[i]);
			if(label[C[i]] != 0 && label[D[i]] != 0){
				int r1 = decode[label[C[i]]];
				int r2 = decode[label[D[i]]];
				edges.pb(mp(r1, r2));
			}
		}
		// vout(label);
		/*
		out(edges.size());
		for(auto u : edges){
			out2(u.first, u.second);
		}
		*/
		InitMap(V - 14, edges.size());
		for(auto u : edges){
			MakeMap(u.first, u.second);
			// out2(u.first, u.second);
		}
		
	}
	
	
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...