답안 #986319

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
986319 2024-05-20T10:06:57 Z AlphaMale06 CEOI16_icc (CEOI16_icc) C++17
90 / 100
97 ms 640 KB
#include <bits/stdc++.h>
#include "icc.h"
using namespace std;

const int N = 101;

int p[N], sz[N];
vector<int> comp[N];

int find(int v){
    if(p[v]==v)return v;
    return p[v]=find(p[v]);
}

void merge(int v, int u){
    v=find(v);
    u=find(u);
    if(u==v)return;
    if(sz[u]<sz[v])swap(u, v);
    p[v]=u;
    sz[u]+=sz[v];
    for(int e : comp[v])comp[u].push_back(e);
}

int genrand(){
    int ret=0;
    for(int i=0; i< 10; i++){
        ret+=(1<<i) * (rand()%2);
    }
    return ret;
}

void run(int n){
    for(int i=1; i<=n; i++){
        p[i]=i;
        sz[i]=1;
        comp[i].push_back(i);
    }
    for(int i=0; i< n-1; i++){
        set<int> st;
        for(int j=1; j<=n; j++)st.insert(find(j));
        vector<int> a;
        for(int i=1; i< a.size(); i++){
            int ind = genrand()%(i+1);
            swap(a[ind], a[i]);
        }
        for(auto p : st)a.push_back(p);
        vector<int> st1, st2;
        for(int j=0; j<7; j++){
            for(int k=0; k<a.size(); k++){
                int x = k>>j;
                if(x&1){
                    for(int e : comp[a[k]])st1.push_back(e);
                }
                else{
                    for(int e : comp[a[k]])st2.push_back(e);
                }
            }
            int sz1=st1.size(), sz2=st2.size();
            int fst[sz1], scd[sz2];
            for(int i=0; i< sz1; i++)fst[i]=st1[i];
            for(int i=0; i< sz2; i++)scd[i]=st2[i];
            if(query(sz1, sz2, fst, scd))break;
            st1.clear(); st2.clear();
        }
        vector<int> nscd = st2;
        int sz1 = st1.size();
        int fst[sz1];
        for(int i=0; i< sz1; i++)fst[i]=st1[i];
        while(nscd.size()>1){
            for(int i=1; i<nscd.size(); i++){
                int ind = genrand()%(i+1);
                swap(nscd[i], nscd[ind]);
            }
            int sz = nscd.size()/2;
            int scd[sz];
            for(int i=0; i< sz; i++)scd[i]=nscd[i];
            if(query(sz1, sz, fst, scd)){
                while(nscd.size()>sz)nscd.pop_back();
            }
            else{
                reverse(nscd.begin(), nscd.end());
                for(int i=0; i<sz; i++)nscd.pop_back();
            }
        }
        int scd[1] = {nscd[0]};
        vector<int> nfst = st1;
        while(nfst.size()>1){
            for(int i=1; i<nfst.size(); i++){
                int ind = genrand()%(i+1);
                swap(nfst[i], nfst[ind]);
            }
            int sz=nfst.size()/2;
            int fst[sz];
            for(int i=0; i< sz; i++)fst[i]=nfst[i];
            if(query(sz, 1, fst, scd)){
                while(nfst.size()>sz)nfst.pop_back();
            }
            else{
                reverse(nfst.begin(), nfst.end());
                for(int i=0; i< sz; i++)nfst.pop_back();
            }
        }
        setRoad(nfst[0], nscd[0]);
        merge(nfst[0], nscd[0]);
    }
}

Compilation message

icc.cpp: In function 'void run(int)':
icc.cpp:43:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   43 |         for(int i=1; i< a.size(); i++){
      |                      ~^~~~~~~~~~
icc.cpp:50:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   50 |             for(int k=0; k<a.size(); k++){
      |                          ~^~~~~~~~~
icc.cpp:71:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   71 |             for(int i=1; i<nscd.size(); i++){
      |                          ~^~~~~~~~~~~~
icc.cpp:79:34: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   79 |                 while(nscd.size()>sz)nscd.pop_back();
      |                       ~~~~~~~~~~~^~~
icc.cpp:89:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   89 |             for(int i=1; i<nfst.size(); i++){
      |                          ~^~~~~~~~~~~~
icc.cpp:97:34: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   97 |                 while(nfst.size()>sz)nfst.pop_back();
      |                       ~~~~~~~~~~~^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 600 KB Ok! 108 queries used.
2 Correct 4 ms 604 KB Ok! 97 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 640 KB Ok! 532 queries used.
2 Correct 28 ms 600 KB Ok! 672 queries used.
3 Correct 27 ms 604 KB Ok! 667 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 73 ms 620 KB Ok! 1398 queries used.
2 Correct 83 ms 624 KB Ok! 1611 queries used.
3 Correct 76 ms 600 KB Ok! 1484 queries used.
4 Correct 79 ms 604 KB Ok! 1516 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 82 ms 604 KB Ok! 1600 queries used.
2 Correct 78 ms 604 KB Ok! 1510 queries used.
3 Correct 92 ms 604 KB Ok! 1633 queries used.
4 Correct 74 ms 604 KB Ok! 1445 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 83 ms 628 KB Ok! 1619 queries used.
2 Correct 86 ms 604 KB Ok! 1645 queries used.
3 Correct 86 ms 604 KB Ok! 1639 queries used.
4 Correct 97 ms 636 KB Ok! 1615 queries used.
5 Correct 78 ms 624 KB Ok! 1493 queries used.
6 Correct 83 ms 620 KB Ok! 1589 queries used.
# 결과 실행 시간 메모리 Grader output
1 Incorrect 84 ms 604 KB Too many queries! 1659 out of 1625
2 Halted 0 ms 0 KB -