제출 #1273068

#제출 시각아이디문제언어결과실행 시간메모리
1273068nthvnArranging Shoes (IOI19_shoes)C++20
100 / 100
32 ms10152 KiB
#include "bits/stdc++.h"
using namespace std;

#define fi first
#define se second
#define pii pair<int,int> 
#define all(x) x.begin(), x.end()
#define sz(x) (int)x.size()
#define pb push_back
#define ll long long
const int N = 4e5+5;


int n, a[N], b[N];
vector<int> pos[N];
vector<pii> v;
int last[N];
ll ans;

struct BIT{
	int bit[N];
	void update(int i, int x){
		for(;i<=n;i+=i&-i) bit[i]+=x;
	}
	int get(int i){
		int ans =0;
		for(;i;i-=i&-i) ans+= bit[i];
		return ans;
	}
}bit;



void preprocess(){
	for(int i=n;i>=1;i--){
		if(a[i]<0) pos[-a[i]].pb(i);
	}
	int cnt=0;
	for(int i=1;i<=n;i++){
		if(a[i]>0){
			int p = pos[a[i]].back();
			// cerr<<i<<" "<<p<<"; ";
			pos[a[i]].pop_back();
			b[i]= b[p] = ++cnt;
			if(p>i) {
				ans++;
			}
			
		}
	}
}

ll count_swaps(vector<int> S){
	n= sz(S);
	for(int i=1;i<=n;i++) a[i]= S[i-1];
	preprocess();
	
	for(int i=1;i<=n;i++){
		if(!last[b[i]]) {
			last[b[i]]=i;
			ans-= bit.get(i);
		}
		else{
			ans+=bit.get(last[b[i]]);
			bit.update(last[b[i]],1);
			ans+= 2*(bit.get(i)-bit.get(last[b[i]]));
		}
	}
	return ans;
}
#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...