답안 #423984

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
423984 2021-06-11T14:58:14 Z lyc 카멜레온의 사랑 (JOI20_chameleon) C++14
60 / 100
63 ms 456 KB
#include "chameleon.h"
#include <vector>

#include <bits/stdc++.h>
using namespace std;

#define TRACE(x) cerr << #x << " :: " << x << endl
#define _ << " " <<
#define SZ(x) ((int)(x).size())
#define ALL(x) (x).begin(),(x).end()
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define RFOR(i,a,b) for(int i=(a);i>=(b);--i)
typedef pair<int,int> ii;

namespace {
    int N;
    vector<int> F, M;
    bool paired[1001];

    int findedge(int x, vector<int> v, int l, int r) {
        int lo = l-1, hi = r+1;
        while (hi-lo > 1) {
            int mid = (lo+hi)/2;

            vector<int> qv = {x};
            FOR(i,l,mid) qv.push_back(v[i]);
            int col = Query(qv);

            if (col != mid-(l-1)+1) hi = mid;
            else lo = mid;
        }
        return hi;
    }

    bool pointto(int x, vector<int> v, int y) {
        vector<int> qv = {x};
        for (int& a : v) if (a != y) qv.push_back(a);
        int col = Query(qv);
        //TRACE(x _ y _ col);
        //for (int& a : qv) { cout << a << ' '; } cout << endl << endl;
        return col == SZ(v)-2;
    }

    vector<int> al[1001];
    bool vis[1001];
    vector<int> st[2];

    void dfs(int i, int c) {
        st[c].push_back(i);
        vis[i] = 1;
        for (int& v: al[i]) if (!vis[v]) dfs(v,!c);
    }
}  // namespace

void mysolve(vector<int> F, vector<int> M) {
    int N = SZ(F);

    vector<ii> ans, ans2;
    for (int& x : F) {
        vector<int> pos;
        vector<ii> cur;

        int prv = -1;
        FOR(i,0,2){
            int p = findedge(x,M,prv+1,N-1);
            if (p >= N) break;
            prv = p;
            pos.push_back(M[p]);
        }

        if (SZ(pos) == 1) {
            ans.push_back(ii(x,pos[0]));
            paired[x] = paired[pos[0]] = 1;

        } else {
            for (int& y : pos) {
                if (!paired[y] && !pointto(x,M,y)) cur.push_back(ii(x,y));
            }

            if (SZ(cur) == 1) {
                ans.push_back(ii(x,cur[0].second));
                paired[x] = paired[cur[0].second] = 1;
            } else {
                for (auto& a : cur) ans2.push_back(a);
            }
        }
    }

        //cout << "ans" << endl; for (auto& x : ans) { cout << x.first _ x.second << endl; } cout << endl;
        //cout << "ans2" << endl; for (auto& x : ans2) { cout << x.first _ x.second << endl; } cout << endl;

        for (int& x : M) if (!paired[x]) {
            for (auto& p : ans2) if (x == p.second) {
                if (!pointto(x,F,p.first)) ans.push_back(p);
            }
        }

        //cout << "ans" << endl; for (auto& x : ans) { cout << x.first _ x.second << endl; } cout << endl;

        for (auto& x : ans) {
            Answer(x.first, x.second);
        }

}


void Solve(int _N) {
    N = _N;
    memset(paired,0,sizeof paired);

    if (N <= 50) {
        N *= 2;
        FOR(i,1,N){
            FOR(j,i+1,N){
                if (Query({i,j}) == 1) {
                    al[i].push_back(j);
                    al[j].push_back(i);
                }
            }
        }

        memset(vis,0,sizeof vis);
        FOR(i,1,N) if (!vis[i]) {
            st[0].clear();
            st[1].clear();
            dfs(i,0);
            mysolve(st[0],st[1]);
        }

    } else {
        F.assign(N,0);
        M.assign(N,0);
        iota(ALL(F),1);
        iota(ALL(M),N+1);
        mysolve(F,M);
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 328 KB Output is correct
2 Correct 1 ms 328 KB Output is correct
3 Incorrect 48 ms 356 KB Wrong Answer [6]
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 328 KB Output is correct
2 Correct 0 ms 328 KB Output is correct
3 Correct 0 ms 328 KB Output is correct
4 Correct 1 ms 328 KB Output is correct
5 Correct 1 ms 328 KB Output is correct
6 Correct 1 ms 328 KB Output is correct
7 Correct 0 ms 328 KB Output is correct
8 Correct 1 ms 324 KB Output is correct
9 Correct 0 ms 328 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 328 KB Output is correct
2 Correct 0 ms 328 KB Output is correct
3 Correct 0 ms 328 KB Output is correct
4 Correct 1 ms 328 KB Output is correct
5 Correct 1 ms 328 KB Output is correct
6 Correct 1 ms 328 KB Output is correct
7 Correct 0 ms 328 KB Output is correct
8 Correct 1 ms 324 KB Output is correct
9 Correct 0 ms 328 KB Output is correct
10 Correct 2 ms 328 KB Output is correct
11 Correct 1 ms 328 KB Output is correct
12 Correct 2 ms 328 KB Output is correct
13 Correct 2 ms 328 KB Output is correct
14 Correct 2 ms 328 KB Output is correct
15 Correct 2 ms 328 KB Output is correct
16 Correct 2 ms 328 KB Output is correct
17 Correct 3 ms 348 KB Output is correct
18 Correct 4 ms 328 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 328 KB Output is correct
2 Correct 0 ms 328 KB Output is correct
3 Correct 61 ms 352 KB Output is correct
4 Correct 54 ms 328 KB Output is correct
5 Correct 57 ms 348 KB Output is correct
6 Correct 57 ms 328 KB Output is correct
7 Correct 63 ms 348 KB Output is correct
8 Correct 62 ms 456 KB Output is correct
9 Correct 54 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 328 KB Output is correct
2 Correct 1 ms 328 KB Output is correct
3 Incorrect 48 ms 356 KB Wrong Answer [6]
4 Halted 0 ms 0 KB -