제출 #1268213

#제출 시각아이디문제언어결과실행 시간메모리
1268213boss_zz도서관 (JOI18_library)C++20
100 / 100
122 ms6136 KiB
#include<bits/stdc++.h>
#include "library.h"
#define rep(a,b,c) for(ll a=b;a<=c;++a)
#define ll long long 
#define ff first 
#define ss second 
#define mp make_pair 
using namespace std;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
using namespace std;
const ll N=1005,inf=1e18;
ll n,G[N][N],deg[N],head;
vector<int> T,ans;
bitset<N> flag;
bool in(ll x){return 1<=x&&x<=n;}
ll nxt(ll u){
    rep(v,1,n) if(!flag[v]&&G[u][v]) return v;
    return 0;
}
bool check(){
    rep(i,0,n-1) if(T[i]) return true;
    return false;
}
ll state(ll u,ll x){
    rep(i,1,x) if(i!=u) T[i-1]=1;
    ll a=(check()? Query(T):0);
    T[u-1]=1;
    ll b=Query(T);
    T[u-1]=0;
    rep(i,1,x) T[i-1]=0;
    return b-a;
}
void connect(ll u,ll v){
    if(G[u][v]) return ;
    G[u][v]=G[v][u]=1;
    deg[u]++;deg[v]++;
}
void Solve(int NN){
    n=NN;
    T.resize(n,0);
    if(n==1){
        ans.push_back(1);
        Answer(ans);
        return ;
    }
    rep(u,1,n){
        if(deg[u]==2) continue;
        ll l=(deg[u]==1? n:u),r=u;
        for(ll i=9;i>=0;--i){
            if(l+(1LL<<i)>n) continue;
            if(state(u,l+(1LL<<i))==1){
                l+=(1LL<<i);
            }
        }
        for(ll i=9;i>=0;--i){
            if(r+(1LL<<i)>n) continue;
            if(state(u,r+(1LL<<i))>=0){
                r+=(1LL<<i);
            }
        }
        l++;
        r++;
        if(in(l)) connect(u,l);
        if(in(r)) connect(u,r);
    }
    rep(i,1,n) if(deg[i]==1) head=i;
    ll u=head;
    while(ans.size()<n){
        ans.push_back(u);
        flag[u]=1;
        u=nxt(u);
    }
    Answer(ans);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...