Submission #1288210

#TimeUsernameProblemLanguageResultExecution timeMemory
1288210m.zeeshanrashidArranging Shoes (IOI19_shoes)C++20
100 / 100
314 ms25464 KiB
#include "shoes.h"
#include "bits/stdc++.h"
using namespace std;

#define ll long long

struct fentree{
	vector<int>fen;
	int s;
	void init(int n){
		fen.resize(n+1,0);
		s=n;
	}
	void edit(int i,int x){
		while(i<=s){
			fen[i]+=x;
			i+=(i&-i);
		}
	}
	int sum(int r){
		int ans=0;
		while(r>0){
			ans+=fen[r];
			r-=(r&-r);
		}
		return ans;
	}
};

ll count_swaps(vector<int> a) {
	int n=a.size()/2;
	a.insert(begin(a),0);
	ll ans=0;
	map<int,int>d;
	vector<int>co(2*n+1,0);
	map<int,vector<int>>ind;
	for(int i=1;i<=2*n;i++) ind[a[i]].push_back(i);
	for(int i=1;i<=2*n;i++){
		if(ind[a[i]].back()>ind[a[i]][0]){
			sort(rbegin(ind[a[i]]),rend(ind[a[i]]));
		}
	}
	fentree fen;
	fen.init(2*n);
	for(int i=1;i<=2*n;i++)
		fen.edit(i,1);
	for(int i=1;i<=2*n;i++){
		int x=a[i],y=-a[i];
		if(co[i]) continue;
		if(ind[x].size()==0 or ind[y].size()==0){
			cout<<i<<" 1234\n";
			return 1ll;
		}
		co[i]=1;
		fen.edit(i,-1);
		int f=0;
		if(x>0) f=1;
		int in=ind[y].back();
		f+=max(0,fen.sum(in-1)-fen.sum(i));
		co[in]=1;
		fen.edit(in,-1);
		ind[y].pop_back();
		ans+=f;
		ind[x].pop_back();
	}
	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...