제출 #426783

#제출 시각아이디문제언어결과실행 시간메모리
426783PbezzArranging Shoes (IOI19_shoes)C++14
100 / 100
165 ms18512 KiB
#include "shoes.h"
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define pb push_back
typedef pair<ll,ll> pii;

const ll MAXN = 1e5+5;
const ll INF = 1e9+7;
ll seg[8*MAXN];

void recalculate(ll node){
seg[node] = seg[2*node+1]+seg[2*node+2];
}

void build(ll node, ll left, ll right){

if(left==right){
seg[node]=0;
}else{
ll middle = (left+right)/2;

build(2*node+1,left,middle);
build(2*node+2,middle+1,right);

recalculate(node);
}
}

void update(ll node, ll left, ll right, ll pos){
//cout<<node<<" "<<left<<" "<<right<<" "<<pos<<endl;
if(left==right){
seg[node]=1;
}else{

ll middle = (left+right)/2;

if(pos<=middle)update(2*node+1,left,middle,pos);
if(pos>=middle+1)update(2*node+2,middle+1,right,pos);

recalculate(node);
}
}

ll querie(ll node, ll left, ll right,ll a, ll b){

if(a<=left&&b>=right){
return seg[node];
}
ll middle = (left+right)/2,res=0;

if(a<=middle)res+=querie(2*node+1,left,middle,a,b);
if(b>=middle+1)res+=querie(2*node+2,middle+1,right,a,b);

return res;
}

long long count_swaps(std::vector<int> s){

	ll n = s.size(),i,j,k; n/=2;
	ll match[2*n+2];
	vector<vector<ll>>last(2*n+1);

	for(i=0;i<2*n;i++){
	if(s[i]>0){
	last[s[i]].pb(i);
	}else{
	last[-s[i]+n].pb(i);
	}
}

	for(i=1;i<=n;i++){
	for(k=0;k<(ll)last[i].size();k++){
//	cout<<last[i][k]<<" "<<last[i+n][k]<<"  ";
	match[last[i][k]]=last[i+n][k];
	match[last[i+n][k]]=last[i][k];
	}
}

	build(0,1,2*n);


ll done=0,ans=0;
	for(i=0;i<2*n;i++){//cout<<match[i]<<" ";

	if(match[i]<i)continue;

	done = querie(0,1,2*n,i+1,match[i]+1);

	ans += (match[i]-i-1-done);
//	cout<<i<<" "<<done<<" "<<match[i]-i-1-done<<endl;
	if(s[i]>0)ans++;

	update(0,1,2*n,i+1);//este e opcional
	update(0,1,2*n,match[i]+1);
}

//	for(j=0;j<7;j++)cout<<j<<" "<<seg[j]<<endl;

	return ans;
}

컴파일 시 표준 에러 (stderr) 메시지

shoes.cpp: In function 'long long int count_swaps(std::vector<int>)':
shoes.cpp:62:20: warning: unused variable 'j' [-Wunused-variable]
   62 |  ll n = s.size(),i,j,k; n/=2;
      |                    ^
#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...