Submission #1290673

#TimeUsernameProblemLanguageResultExecution timeMemory
1290673enzyArranging Shoes (IOI19_shoes)C++20
100 / 100
232 ms274432 KiB
#include "shoes.h"
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=2e5+10;
queue<int>abre[maxn], fecha[maxn];
ll bit[maxn];
int v[maxn];
void update(int x, int q){
	for(int i=x;i<maxn;i+=(i&-i)) bit[i]+=q;
}
int sum(int x){
	int ret=0;
	for(int i=x;i>0;i-=(i&-i)) ret+=bit[i];
	return ret;
}
int query(int l, int r){
	if(l>r) return 0;
	return sum(r)-sum(l-1);
}
ll count_swaps(vector<int> s){
	int n=s.size();
	for(int i=0;i<n;i++){
		update(i+1,1);
		int at=abs(s[i]);
		if(s[i]<0) abre[at].push(i+1);
		else fecha[at].push(i+1);
		v[i+1]=s[i];
	}
	ll resp=0;
	for(int i=1;i<=n;i++){
		if(!query(i,i)) continue;
		int at=abs(v[i]), aux;
		if(v[i]<0){ // to abrindo, logo trago pra minha direita
			aux=fecha[at].front();
			resp+=query(i+1,aux-1);
		}else{ // to fechando, logo trago pra minha esquerda
			aux=abre[at].front();
			resp+=query(i,aux-1);
		}
		update(i,-1); update(aux,-1);
		abre[at].pop(); fecha[at].pop();
	}
	return resp;
}
#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...