제출 #435348

#제출 시각아이디문제언어결과실행 시간메모리
435348SupersonicArranging Shoes (IOI19_shoes)C++14
100 / 100
137 ms15644 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;
#define SIZE 262144
int tree[SIZE*2];
int sum(int a,int b){
	a+=SIZE;b+=SIZE;int s=0;
	while(a<=b){
		if(a%2==1)s+=tree[a++];
		if(b%2==0)s+=tree[b--];
		a/=2;b/=2;
	}
	return s;
}
void add(int a,int b){
	a+=SIZE;tree[a]+=b;
	for(a/=2;a>=1;a/=2){
		tree[a]=tree[2*a]+tree[2*a+1];
	}
}
long long count_swaps(std::vector<int> s) {
	vector<int> l[100005];vector<int> r[100005];int n=s.size();
	for(int i=0;i<n;i++){
		if(s[i]<0)l[-s[i]].push_back(i);
		else r[s[i]].push_back(i);
		add(i,1);
	}
	for(int i=0;i<100005;i++){sort(l[i].rbegin(),l[i].rend());sort(r[i].rbegin(),r[i].rend());}
	long long t=0;
	for(int i=0;i<n;i++){
		//cerr<<r[-s[i]].empty()<<endl;
		if(s[i]==SIZE)continue;
		if(s[i]<0){
			if(r[-s[i]].empty()){cerr<<i<<endl;exit(1);}
			int k;int z=SIZE;while(z==SIZE||k==i){k=r[-s[i]].back();r[-s[i]].pop_back();z=s[k];}
			//cerr<<i+1<<' '<<k-1<<endl;
			t+=sum(i+1,k-1);add(k,-1);s[i]=SIZE;s[k]=SIZE;
		}
		else {
			if(l[s[i]].empty()){cerr<<i<<endl;exit(1);}
			int k;int z=SIZE;while(z==SIZE||k==i){k=l[s[i]].back();l[s[i]].pop_back();z=s[k];}
			//cerr<<i<<' '<<k-1<<endl;
			t+=sum(i,k-1);add(k,-1);s[i]=SIZE;s[k]=SIZE;
		}
	}
	return t;
}
/*int main(){
	int n;cin>>n;while(n--){int a,b;cin>>a>>b;add(a,b);}cin>>n;while(n--){int a,b;cin>>a>>b;cout<<sum(a,b)<<endl;}
}*/
#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...