Submission #94994

# Submission time Handle Problem Language Result Execution time Memory
94994 2019-01-26T14:52:32 Z georgerapeanu ICC (CEOI16_icc) C++11
18 / 100
216 ms 792 KB
#include "icc.h"
 
#include <algorithm>
#include <ctime>
#include <cstdlib>
#include <vector>
#include <cstdio>
#include <iostream>
 
using namespace std;
 
vector<vector<int>> components;
 
int a[200],len_a;
int b[200],len_b;
int c[200],len_c;
int d[200],len_d;
 
const int LIM = 2;
 
int n;
int adia[200][200];
int curr[200][200];
int in_a[200];
int in_b[200];
 
int pre_query(int len_a,int len_b,int a[],int b[]){
 
    if(len_a == 0 || len_b == 0){
        return 0;
    }
 
    bool is_true = false;
    bool is_unknown = false;

    for(int i = 0;i < len_a;i++){
        for(int j = 0;j < len_b;j++){
            is_true |= (adia[a[i]][b[j]] == 1);
            is_unknown |= (adia[a[i]][b[j]] == -1);
        }
    }
 
    if(is_true == true){
        return 1;
    }

    if(is_unknown == false){
        return false;
    }
 
    int ans = query(len_a,len_b,a,b);

    if(ans == 0){
        for(int i = 0;i < len_a;i++){
            for(int j = 0;j < len_b;j++){
                adia[a[i]][b[j]] = 0;
            }
        }
    }
    else{
        for(int i = 1;i <= n;i++){
            in_a[i] = false;
            in_b[i] = false;
        }

        for(int i = 0;i < len_a;i++){
            in_a[a[i]] = true;        
        }

        for(int j = 0;j < len_b;j++){
            in_b[b[j]] = true;
        }

        for(int i = 1;i <= n;i++){
            for(int j = 1;j <= n;j++){
                if(adia[i][j] == -1){
                    if((in_a[i] == false || in_b[j] == false) && (in_a[j] == false || in_b[i] == false)){
                        adia[i][j] = 0;
                    }
                }
            }
        }
    }

    return ans;
}
 
int my_query(vector<int> &c1,vector<int> &c2){
    
    len_a = 0;
    for(auto it:c1){
        a[len_a++] = it;
    }
 
    len_b = 0;
    for(auto it:c2){
        b[len_b++] = it;
    }
 
    return pre_query(len_a,len_b,a,b);
}
 
int my_query(vector< vector<int> > &c1,vector< vector<int> > &c2){
    len_a = 0;
    for(auto it:c1){
        for(auto it2:it){
            a[len_a++] = it2;
        }
    }
    
    len_b = 0;
    for(auto it:c2){
        for(auto it2:it){
            b[len_b++] = it2;
        }
    }
 
    if(len_a == 0 || len_b == 0){
        return 0;
    }
 
    return pre_query(len_a,len_b,a,b);
}
 
void run(int N){
    n = N;
 
    srand(time(NULL));
    for(int i = 1;i <= n;i++){
        components.push_back({i});    
    } 
 
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= n;j++){
            adia[i][j] = (i == j ? 1:-1);
        }
    }
    
    for(int t = 1;t < n;t++){
        random_shuffle(components.begin(),components.end());
        vector<vector<int>> c1,c2;
        for(int i = 0;i < (int)components.size() / 2;i++){
            c1.push_back(components[i]);
        }
        for(int i = (int)components.size() / 2;i < (int)components.size();i++){
            c2.push_back(components[i]);
        }
 
        for(int i = 1;i <= n;i++){
            for(int j = 1;j <= n;j++){
                adia[i][j] = (adia[i][j] == 1 ? 1:-1);
            }
        }

        while(c1.size() + c2.size() > LIM){
            while(my_query(c1,c2) == 0){
                random_shuffle(c1.begin(),c1.end());
                random_shuffle(c2.begin(),c2.end());
    
                vector<vector<int>> nc1,nc2;
            
                for(int i = 0;i < (int)c1.size() / 2;i++){
                    nc1.push_back(c1[i]);
                }
 
                for(int i = (int)c1.size() / 2;i < (int)c1.size();i++){
                    nc2.push_back(c1[i]);
                }
 
                for(int i = 0;i < (int)c2.size() / 2;i++){
                    nc1.push_back(c2[i]);
                }
 
                for(int i = (int)c2.size() / 2;i < (int)c2.size();i++){
                    nc2.push_back(c2[i]);
                }
 
                swap(c1,nc1);
                swap(c2,nc2);
            }
 
            vector<vector<int>> nc1,nc2,nc3,nc4;
            
            for(int i = 0;i < (int)c1.size() / 2;i++){
                nc1.push_back(c1[i]);
            }
 
            for(int i = (int)c1.size() / 2;i < (int)c1.size();i++){
                nc2.push_back(c1[i]);
            }
 
            for(int i = 0;i < (int)c2.size() / 2;i++){
                nc3.push_back(c2[i]);
            }
 
            for(int i = (int)c2.size() / 2;i < (int)c2.size();i++){
                nc4.push_back(c2[i]);
            }
        
            if(my_query(c1,nc3)){
                swap(c2,nc3);
                if(my_query(nc1,c2)){
                    swap(c1,nc1);
                }
                else{
                    swap(c1,nc2);
                }
            }
            else{
                swap(c2,nc4);
                if(my_query(nc1,c2)){
                    swap(c1,nc1);
                }
                else{
                    swap(c1,nc2);
                }
            }
        }
       
        vector<int> fst_comp = c1[0];
        vector<int> snd_comp = c2[0];
 
        for(auto &it:components){
            if(it == snd_comp){
                swap(it,components.back());
            }
        }
 
        components.pop_back();
 
        for(auto &it:components){
            if(it == fst_comp){
                for(auto it2:snd_comp){
                    it.push_back(it2);
                }
            }
        }
 
        while((int)fst_comp.size() + (int)snd_comp.size() > LIM){
            vector<int> nc1,nc2,nc3,nc4;
 
            for(int i = 0;i < (int)fst_comp.size() / 2;i++){
                nc1.push_back(fst_comp[i]);
            }
 
            for(int i = (int)fst_comp.size() / 2;i < (int)fst_comp.size();i++){
                nc2.push_back(fst_comp[i]);
            }
            
            for(int i = 0;i < (int)snd_comp.size() / 2;i++){
                nc3.push_back(snd_comp[i]);
            }
 
            for(int i = (int)snd_comp.size() / 2;i < (int)snd_comp.size();i++){
                nc4.push_back(snd_comp[i]);
            }
 
            if(my_query(fst_comp,nc3)){
                swap(snd_comp,nc3);
                if(my_query(nc1,snd_comp)){
                    swap(fst_comp,nc1);
                }
                else{
                    swap(fst_comp,nc2);
                }
            }
            else{
                swap(snd_comp,nc4);
                if(my_query(nc1,snd_comp)){
                    swap(fst_comp,nc1);
                }
                else{
                    swap(fst_comp,nc2);
                }
            }
        }

        for(auto it:c1[0]){
            for(auto it2:c2[0]){
                adia[it][it2] = 1;
                adia[it2][it] = 1;
            }
        }

        setRoad(fst_comp[0],snd_comp[0]);

    }
}
 
# Verdict Execution time Memory Grader output
1 Correct 9 ms 504 KB Ok! 131 queries used.
2 Correct 9 ms 504 KB Ok! 123 queries used.
# Verdict Execution time Memory Grader output
1 Correct 52 ms 632 KB Ok! 777 queries used.
2 Correct 59 ms 652 KB Ok! 834 queries used.
3 Correct 60 ms 620 KB Ok! 857 queries used.
# Verdict Execution time Memory Grader output
1 Correct 190 ms 632 KB Ok! 2132 queries used.
2 Correct 216 ms 672 KB Ok! 2144 queries used.
3 Incorrect 207 ms 632 KB Too many queries! 2264 out of 2250
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 203 ms 760 KB Too many queries! 2202 out of 2000
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 204 ms 792 KB Too many queries! 2212 out of 1775
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 205 ms 632 KB Too many queries! 2236 out of 1625
2 Halted 0 ms 0 KB -