답안 #672256

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
672256 2022-12-15T09:01:04 Z alvingogo Flight to the Ford (BOI22_communication) C++17
84 / 100
3647 ms 2372 KB
#include <bits/stdc++.h>
#include "communication.h"
using namespace std;

vector<int> use(vector<int> &a,vector<int> &b,int x,int t){
    sort(a.begin(),a.end());
    sort(b.begin(),b.end());
    int as=a.size();
    int bs=b.size();
    vector<int> la,ra,lb,rb;
    if(as+bs<=2){
        vector<int> z;
        for(auto h:a){
            z.push_back(h);
        }
        for(auto h:b){
            z.push_back(h);
        }
        if(z.size()==1){
            int u=z[0];
            z.push_back(u);
        }
        return z;
    }
    else if(as+bs==3){
        vector<int> g;
        for(auto h:a){
            g.push_back(h);
        }
        for(auto h:b){
            g.push_back(h);
        }
        sort(g.begin(),g.end());
        int u=-1;
        for(int i=0;i<3;i++){
            if(g[i]==x){
                u=i;
            }
        }
        if(t==0){
            return g;
        }
        else{
            string s[3]={"1111","0001","1000"};
            if(u==-1){
                string z;
                for(int j=0;j<4;j++){
                    z+=char('0'+receive());
                }
                int flag=-1;
                for(int i=0;i<3;i++){
                    int lst=0;
                    for(int j=0;j<4;j++){
                        if(s[i][j]!=z[j]){
                            if(lst){
                                flag=i;
                                break;
                            }
                            else{
                                lst=1;
                            }
                        }
                        else{
                            lst=0;
                        }
                    }
                }
                vector<int> ret;
                for(int i=0;i<3;i++){
                    if(i!=flag){
                        ret.push_back(g[i]);
                    }
                }
                return ret;
            }
            else{
                for(int i=0;i<4;i++){
                    send(int(s[u][i]-'0'));
                }
                return vector<int>();
            }   
        }
    }
    int nxt=-1;
    for(int i=0;i<as/2;i++){
        if(a[i]==x){
            nxt=0;
        }
        la.push_back(a[i]);
        rb.push_back(a[i]);
    }
    for(int i=as/2;i<as;i++){
        if(a[i]==x){
            nxt=1;
        }
        ra.push_back(a[i]);
        lb.push_back(a[i]);
    }
    for(int i=0;i<(bs+1)/2;i++){
        if(b[i]==x){
            nxt=0;
        }
        la.push_back(b[i]);
    }
    for(int i=(bs+1)/2;i<bs;i++){
        if(b[i]==x){
            nxt=1;
        }
        ra.push_back(b[i]);
    }
    int dd;
    if(nxt==-1){
        dd=receive();
    }
    else{
        dd=send(nxt);
    }
    if(dd==0){
        return use(la,lb,x,t);
    }
    else{
        return use(ra,rb,x,t);
    }
}
const int Bd=31638,Bd2=178;
vector<int> emp;
vector<int> solve2(int N,int X){
    int a=-1,c=-1;
    if(X!=-1){
        a=X/Bd2;
        c=X%Bd2;
    }
    vector<int> v(max(3,N/Bd2+1));
    iota(v.begin(),v.end(),0);
    auto e=use(v,emp,a,0);
    vector<int> w(Bd2);
    iota(w.begin(),w.end(),0);
    auto f=use(w,emp,c,0);
    vector<int> z;
    for(auto h:e){
        for(auto y:f){
            if(h*Bd2+y<0 || h*Bd2+y>=N){
                continue;
            }
            z.push_back(h*Bd2+y);
        }
    }
    sort(z.begin(),z.end());
    return z;
}
vector<int> solve(int N,int X){
    int a=-1,c=-1;
    if(X!=-1){
        a=X/Bd;
        c=X%Bd;
    }
    auto e=solve2(max(3,N/Bd+1),a);
    auto f=solve2(Bd,c);
    vector<int> z;
    for(auto h:e){
        for(auto y:f){
            if(h*Bd+y<=0 || h*Bd+y>N){
                continue;
            }
            z.push_back(h*Bd+y);
        }
    }
    sort(z.begin(),z.end());
    z.erase(unique(z.begin(),z.end()),z.end());
    return use(z,emp,X,1);
}
void encode(int N,int X){
    solve(N,X);
}

pair<int,int> decode(int N){
    auto h=solve(N,-1);
    int x=h.size();
    return {h[0],h[min(x-1,1)]};
}
# 결과 실행 시간 메모리 Grader output
1 Correct 69 ms 1864 KB Output is correct
2 Correct 100 ms 1784 KB Output is correct
3 Correct 136 ms 1832 KB Output is correct
4 Correct 51 ms 1812 KB Output is correct
5 Correct 95 ms 1912 KB Output is correct
6 Correct 240 ms 1968 KB Output is correct
7 Correct 458 ms 1784 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Partially correct 769 ms 1880 KB Output is partially correct
2 Partially correct 297 ms 1816 KB Output is partially correct
3 Partially correct 540 ms 1780 KB Output is partially correct
4 Partially correct 951 ms 1816 KB Output is partially correct
5 Partially correct 634 ms 1808 KB Output is partially correct
6 Partially correct 628 ms 1780 KB Output is partially correct
7 Partially correct 2261 ms 2028 KB Output is partially correct
8 Partially correct 3647 ms 2372 KB Output is partially correct
9 Partially correct 3103 ms 2188 KB Output is partially correct
10 Partially correct 3079 ms 2192 KB Output is partially correct
11 Partially correct 3465 ms 2156 KB Output is partially correct
12 Partially correct 3240 ms 2252 KB Output is partially correct
13 Partially correct 3316 ms 2300 KB Output is partially correct
14 Partially correct 3138 ms 2208 KB Output is partially correct
15 Partially correct 1549 ms 2112 KB Output is partially correct
16 Partially correct 3606 ms 2024 KB Output is partially correct
17 Partially correct 805 ms 2108 KB Output is partially correct
18 Partially correct 841 ms 2016 KB Output is partially correct
19 Partially correct 945 ms 2052 KB Output is partially correct
20 Partially correct 873 ms 1992 KB Output is partially correct
21 Partially correct 915 ms 2028 KB Output is partially correct
22 Partially correct 929 ms 1956 KB Output is partially correct
23 Partially correct 1552 ms 2064 KB Output is partially correct
24 Correct 63 ms 1828 KB Output is correct
25 Correct 93 ms 1872 KB Output is correct
26 Correct 105 ms 1820 KB Output is correct
27 Correct 58 ms 1780 KB Output is correct
28 Correct 81 ms 1784 KB Output is correct
29 Correct 221 ms 1952 KB Output is correct
30 Correct 402 ms 1860 KB Output is correct