Submission #1218799

#TimeUsernameProblemLanguageResultExecution timeMemory
1218799vtnooArranging Shoes (IOI19_shoes)C++20
100 / 100
368 ms31724 KiB
#include <bits/stdc++.h>
#define forsn(i,s,n) for(int i=s; i<n; ++i)
#define forn(i,n) forsn(i,0,n)
#define pb push_back
#define snd second
#define fst first
#define all(x) x.begin(), x.end()
#define imp(x) for(auto __:x)cout<<__<<" "; cout<<endl;
#define sz(c) int((c).size())
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
typedef vector<int> vi;

const int N=200'010;

struct FTree{
	vector<long long> fen;
	void init(){
		fen.resize(N, 0);
	}
	ll sum(int x){
		ll v=0;
		for(;x;x-=(x&-x)){
			v+=fen[x];
		}
		return v;
	}
	void upd(int x, int v){
		for(;x<N;x+=(x&-x)){
			fen[x]+=v;
		}
	}
};

ll count_swaps(vi s) {
	int n=sz(s);
	ll ans=0;
	FTree fen;
	fen.init();
	forsn(i,1,N)fen.upd(i,1);
	map<int, set<int>> mp;
	for(int i=0;i<n;i++){
		mp[s[i]].insert(i);
	}
	for(int i=0; i<n; i++){
		//~ cout<<"===================="<<endl;
		//~ cout<<s[i]<<endl;
		if(s[i]<0){ //left
			if(!mp[s[i]].count(i))continue;
			mp[s[i]].erase(i);
			if(mp[abs(s[i])].empty())continue;
			int v=*mp[abs(s[i])].begin();
			int cnt_pos=fen.sum(v)-fen.sum(i+1);
			//~ cout<<cnt_pos<<endl;
			ans+=cnt_pos;
			int l=i+1, r=v+1;
			fen.upd(l, -1);
			fen.upd(r, -1);
			mp[abs(s[i])].erase(mp[abs(s[i])].begin());
		}else{ //right
			if(!mp[s[i]].count(i))continue;
			mp[s[i]].erase(i);
			if(mp[-s[i]].empty())continue;
			int v=*mp[-s[i]].begin();
			int cnt_pos=fen.sum(v)-fen.sum(i+1);
			//~ cout<<cnt_pos<<endl;
			ans+=cnt_pos+1;
			int l=i+1, r=v+1;
			fen.upd(l, -1);
			fen.upd(r, -1);
			mp[-s[i]].erase(mp[-s[i]].begin());
		}
	}
	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...