제출 #1367152

#제출 시각아이디문제언어결과실행 시간메모리
1367152thelegendary08Monster Game (JOI21_monster)C++17
91 / 100
20 ms452 KiB
#include "monster.h"
#include<bits/stdc++.h>
#define vi vector<int> 
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
#define eb emplace_back
#define F first
#define S second
#define f0r(i,N) for(int i = 0; i < N; i++)
#define FOR(i,k,N) for(int i = k; i < N; i++)
#define dout(x) cout<<x<<' '<<#x<<endl
#define dout2(x,y) cout<<x<<' '<<#x<<' '<<y<<' '<<#y<<endl
#define vout(v) cout<<#v<<": "; for(auto u : v)cout<<u<<' '; cout<<endl
using namespace std; 
void dnc(int l, int r, vi &v){
	if(l == r)return; int mid = l + r >> 1; vi a, b; for(int i = 0; i <= mid - l; i++)a.pb(v[i]); 
	FOR(i, mid-l+1, r-l+1)b.pb(v[i]); dnc(l, mid, a); dnc(mid+1, r, b); 
	int p1 = 0, p2 = 0; vi tmp; while(p1 < a.size() || p2 < b.size()){
		if(p1 == a.size())tmp.pb(b[p2]), p2++; else if(p2 == b.size())tmp.pb(a[p1]), p1++; else{
			if(!Query(a[p1], b[p2]))tmp.pb(a[p1]), p1++; else tmp.pb(b[p2]), p2++; 
		}
	} v = tmp; 
}
std::vector<int> Solve(int N) {
	vi v(N); f0r(i,N)v[i] = i; dnc(0, N-1, v); int d = 0; vi res(N); FOR(i,1,N)res[i] = Query(v[0], v[i]), d += res[i]; 
	if(d == 1){
		FOR(i,1,N)if(res[i] == 1){
			int tmp = 0; f0r(j, N)if(i != j)tmp += Query(v[i], v[j]); if(tmp == 1)d--; 
		}
	}
	else if(d == N-2){
		FOR(i,1,N)if(res[i] == 0){
			int tmp = 0; f0r(j, N)if(i != j)tmp += Query(v[i], v[j]); if(tmp == N-2)d++; 
		}
	}
	
	int pt = d; reverse(v.begin(), v.begin() + pt + 1); while(pt < N-1){
		int nxt; FOR(i,pt + 1,N)if(Query(v[pt], v[i])){nxt = i; break;} reverse(v.begin() + pt + 1, v.begin() + nxt + 1); pt = nxt; 
	} vi ans(N); f0r(i,N)ans[v[i]] = i; 
	return ans;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…