Submission #141109

# Submission time Handle Problem Language Result Execution time Memory
141109 2019-08-06T18:37:44 Z shayan_p ICC (CEOI16_icc) C++14
0 / 100
6 ms 504 KB
// only miss the sun when it starts to snow

#include<bits/stdc++.h>

#include "icc.h"

#define unit icc

#define F first
#define S second
#define PB push_back
#define sz(s) int((s).size())
#define bit(n,k) (((n)>>(k))&1)

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

const int maxn=110,mod=1e9+7;
const ll inf=1e18;

int bos[maxn], n;
vector<int> v[maxn], A, B, vec, vec0, vec1;

int arr1[maxn], arr2[maxn];

bool ask(){
    if(sz(A)==0 || sz(B)==0) return 0;
    int N=sz(A), M=sz(B);

    for(int i=0;i<N;i++)
	arr1[i]= A[i]+1;
    for(int i=0;i<M;i++)
	arr2[i]= B[i]+1;
    return query(N,M,arr1,arr2);
}
void operator += (vector<int>&a,vector<int>&b){
    for(int x:b) a.PB(x);
}
void Merge(int a,int b){
    a=bos[a], b=bos[b];
    if(sz(v[a]) < sz(v[b])) swap(a,b);
    for(int x:v[b]) bos[x]=a, v[a].PB(x);
    v[b].clear();
}
int solve(vector<int> &v1, vector<int>&v2){
    int bt=32-__builtin_clz(sz(v1));
    B=v2;
    int ans=0;
    
    for(int i=0;i<bt;i++){
	A.clear();
	for(int j=0;j<sz(v1);j++)
	    if(bit(j,i)) A.PB(v1[j]);
	if(ask()) ans^=(1<<i);
    }
    return v1[ans];
}
void proc(){
    vec.clear();
    for(int i=0;i<n;i++){
	if(bos[i]==i) vec.PB(i);
    }
    int bt=32-__builtin_clz(sz(vec));

    int df=-1;

    vector<int> rndm(bt);
    for(int i=0;i<bt;i++)
	rndm[i]=i;
    random_shuffle(rndm.begin(), rndm.end() );

    int bts=0;
    
    for(int i:rndm){
	A.clear(), B.clear();
	for(int j=0;j<sz(vec);j++){
	    if(bit(j,i)) A+= v[vec[j]];
	    else B+= v[vec[j]];
	}
	if(ask()){
	    df=i;
	    break;
	}
	else{
	    bts^=(1<<i);
	}
    }
    assert(df!=-1);

    vec0=A, vec1=B;
    int u=solve(vec0,vec1);

    vec0.clear(), vec0.PB(u);
    vec1.clear();

    for(int i=0;i<sz(vec);i++){
	if(bit(i,df)) continue;
	for(int j=0;j<bt;j++){
	    if(bit(bts,j) && bit(i,j)!=bit(u,j)) goto Hell;
	}
	vec1+= v[vec[i]];
    Hell:;
    }
    
    int v=solve(vec1,vec0);

    setRoad(u+1,v+1), Merge(u,v);
}

void run(int N){
    srand(time(0));
    ::n=N;
    for(int i=0;i<n;i++)
	bos[i]=i, v[i].PB(i);
    for(int i=0;i<n-1;i++)
	proc();
}
# Verdict Execution time Memory Grader output
1 Incorrect 4 ms 504 KB Wrong road!
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 6 ms 380 KB Wrong road!
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 5 ms 504 KB Wrong road!
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 5 ms 504 KB Wrong road!
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 5 ms 504 KB Wrong road!
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 5 ms 504 KB Wrong road!
2 Halted 0 ms 0 KB -