제출 #1112755

#제출 시각아이디문제언어결과실행 시간메모리
1112755StefanSebezArranging Shoes (IOI19_shoes)C++14
100 / 100
63 ms20200 KiB
#include <bits/stdc++.h>
#include "shoes.h"
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ld long double
const int N=2e5+50,inf=1e9;
ll res;
vector<int>vals[N],vals1[N];
int idx[N];
bool active[N];
int T[N+50];
void Update(int i,int x){for(i++;i<=N;i+=i&-i)T[i]+=x;}
int Get(int i){int x=0;for(i++;i>=1;i-=i&-i)x+=T[i];return x;}
long long count_swaps(std::vector<int> S){
	int n=S.size()/2;
	for(int i=0;i<2*n;i++){
		if(S[i]>0) vals[S[i]].pb(i);
		else vals1[-S[i]].pb(i);
		Update(i,1);
		active[i]=true;
	}
	for(int i=0;i<2*n;i++){
		if(!active[i]) continue;
		//printf("%i %lld\n",i,res);
		int k=abs(S[i]);
		//printf(" %i %i\n",vals[k][idx[k]],vals1[k][idx[k]]);
		Update(vals[k][idx[k]],-1);
		Update(vals1[k][idx[k]],-1);
		active[vals[k][idx[k]]]=active[vals1[k][idx[k]]]=false;
		res+=Get(max(vals[k][idx[k]],vals1[k][idx[k]]));
		if(vals1[k][idx[k]]>vals[k][idx[k]]) res++;
		idx[k]++;
	}
	/*for(int i=0;i<2*n;i+=2){
		for(int j=i+1;j<2*n;j++){
			if(S[i]==-S[j]){
				for(;j>i+1;j--){
					swap(S[j],S[j-1]);
					res++;
				}
				if(S[i]>S[i+1]) swap(S[i],S[i+1]),res++;
				break;
			}
		}
	}*/
	/*while(1){
		for(int i=0;i<2*n;i++) skip[i]=false;
		int l=-1,r=-1,mn=inf;
		for(int i=0;i<2*n;i++){
			if(skip[i]) continue;
			for(int j=i+1;j<2*n;j++){
				if(S[i]==-S[j]){
					int x=j-i-1;
					if(S[i]>0) x++;
					if(x==0){
						skip[i]=skip[i+1]=true;
						break;
					}
					if(mn>x){
						mn=x;
						l=i,r=j;
					}
				}
			}
		}
		//printf("%i %i\n",l,r);
		if(mn==inf) break;
		res+=mn;
		for(int i=r;i>l+1;i--){
			swap(S[i],S[i-1]);
		}
		if(S[l]>S[l+1]) swap(S[l],S[l+1]);
		//for(int i=0;i<2*n;i++) printf("%i ",S[i]);printf("\n");
	}*/
	return res;
}
#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...