Submission #1268639

#TimeUsernameProblemLanguageResultExecution timeMemory
1268639jumpArranging Shoes (IOI19_shoes)C++20
100 / 100
179 ms25684 KiB

#include <bits/stdc++.h>
std::map<long long,std::vector<long long>> lp;
long long fwk[300000];
bool mark[300000];
long long upd(long long idx,long long n){
	while(idx<300000){
		fwk[idx]+=n;
		idx += ((idx) & (-idx));
		//std::cout << idx;
	}
	return 1;
}
long long look(long long idx){
	long long sum = 0;
	while(idx>0){
		sum+=fwk[idx];
		idx -= idx & -idx;
	}
	return sum;
}
long long count_swaps(std::vector<int> s){
	for(long long i=1;i<=200010;i++){
		upd(i,1);
	}
	//std::cout << 123;
	for(long long i=s.size()-1;i>=0;i--){
		auto num = s[i];
		if(lp.find(num)==lp.end()){
			lp[num]={i+1};
		}
		else{
			lp[num].push_back(i+1);
		}
	}
	long long sum = 0;
	for(long long i=0;i<s.size();i++){
		
		if(!mark[i+1]){
			mark[i+1]=true;
		}else continue;
		upd(i+1,-1);
		long long match = lp[-s[i]].back();lp[-s[i]].pop_back();
		lp[s[i]].pop_back();
		sum+=look(match)-1;
		//std::cout << i+1 << ' ' << match << ' ' << look(match) << '\n';
		upd(match,-1);
		mark[match]=true;
		if(s[i]>0)sum+=1;
	}
	return sum;
}
#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...