제출 #1367789

#제출 시각아이디문제언어결과실행 시간메모리
1367789alexdd카멜레온의 사랑 (JOI20_chameleon)C++20
40 / 100
17 ms440 KiB
#include "chameleon.h"
#include <bits/stdc++.h>
using namespace std;
int side[1005];
vector<int> con[1005];
void dfs(int nod, int where)
{
    if(side[nod] != -1)
    {
        assert(side[nod] == where);
        return;
    }
    side[nod] = where;
    for(int adj:con[nod])
        dfs(adj, 1 - where);
}

int qry(const vector<int>&nodes, int le, int ri, int newv)
{
    vector<int> aux;
    for(int i=le;i<=ri;i++)
        aux.push_back(nodes[i]);
    aux.push_back(newv);
    return Query(aux);
}

bool good[1005][1005];
void Solve(int N)
{
    for(int i=1;i<=2*N;i++)
    {
        for(int j=1;j<i;j++)
            side[j] = -1;
        for(int j=1;j<i;j++)
            if(side[j] == -1)
                dfs(j, 0);
        for(int c=0;c<2;c++)
        {
            vector<int> nodes;
            for(int j=1;j<i;j++)
                if(side[j] == c)
                    nodes.push_back(j);

            /*int st = 0, dr = (int)nodes.size() - 1, ans = -1;
            while(st <= dr)
            {
                int mij = (st + dr) / 2;
                if(qry())
            }*/

            for(int u=0;u<nodes.size();u++)
            {
                if(qry(nodes, u, u, i) < 2)
                {
                    con[nodes[u]].push_back(i);
                    con[i].push_back(nodes[u]);
                }
            }
        }
    }



    for(int i=1;i<=2*N;i++)
    {
        assert(con[i].size() == 1 || con[i].size() == 3);

        //for(int j:con[i]) cerr<<i<<" "<<j<<" con\n";

        if(con[i].size() == 1)
        {
            good[i][con[i][0]] = 1;
        }
        else
        {
            int cate = 0;
            for(int r=0;r<3;r++)
            {
                int a = con[i][r], b = con[i][(r+1)%3];
                if(Query({i, a, b}) == 1)
                {
                    good[i][a] = good[i][b] = 1;
                    cate++;
                }
            }
            assert(cate == 1);
        }
    }

    for(int i=1;i<=2*N;i++)
        for(int j=1;j<i;j++)
            if(good[i][j] && good[j][i])
                Answer(i, j);
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…