제출 #1146742

#제출 시각아이디문제언어결과실행 시간메모리
1146742Rawlat_vanakArt Collections (BOI22_art)C++20
100 / 100
771 ms708 KiB
#include <bits/stdc++.h>
#include "art.h"
using namespace std;
//#define int long long
#define speedIO ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
//#define mod 1000000007
#define f first
#define s second
#define pii pair<int,int>
#define pb push_back


vector<int> bit,counted;

void update(int idx, int val){
	while(idx<bit.size()){
		bit[idx]+=val;
		idx+=(idx&(-idx));
	}
}

int get(int idx){
	int ans=0;
	while(idx>0){
		ans+=bit[idx];
		idx-=(idx&(-idx));
	}
	return ans;
}

void solve(int n){
	vector<int> r(n),tmp(n),ans(n);
	for(int i=0;i<n;i++){
		r[i]=i+1;
	}
	int initial=publish(r);
	//vector<bool> counted(n+1,false);
	counted.resize(n+1,0);
	bit.resize(n+1,0);
	set<int> used;
	for(int i=0;i<n-1;i++){
		tmp[n-1]=i+1;
		for(int j=0;j<n-1;j++){
			if(j<i){
				tmp[j]=j+1;
			}if(j>=i){
				tmp[j]=j+2;
			}
		}

		int cur=publish(tmp);
		int d=cur-initial-i+n;
		d/=2;
		//cout<<d<<' '<<i<<'\n';
		for(int k=n-d;k>=n-d-i;k--){
			if(used.empty()){
				used.insert(k);
				counted[k]=1;
				update(k,1);
				ans[i]=k;
				break;
			}
			if(counted[k]) continue;
			int bigger=i-get(k);
			if(bigger==n-d-k){
				counted[k]=1;
				ans[i]=k;
				update(k,1);
				used.insert(k);
				break;
			}

		}

	}
	for(int i=1;i<=n;i++){
		if(!counted[i]){
			ans[n-1]=i;
			break;
		}
	}
	//answer(ans);

	vector<int> realans(n);
	for(int i=0;i<n;i++){
		realans[ans[i]-1]=i+1;
	}
	answer(realans);
		
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...