Submission #143730

#TimeUsernameProblemLanguageResultExecution timeMemory
143730guangxuanArranging Shoes (IOI19_shoes)C++14
100 / 100
283 ms138488 KiB
#include "shoes.h"
#include <bits/stdc++.h>
#define SZ(X) ((int)(X).size())
#define ALL(X) (X).begin(), (X).end()
#define REP(I, N) for (int I = 0; I < (N); ++I)
#define REPP(I, A, B) for (int I = (A); I < (B); ++I)
#define RI(X) scanf("%d", &(X))
#define RII(X, Y) scanf("%d%d", &(X), &(Y))
#define RIII(X, Y, Z) scanf("%d%d%d", &(X), &(Y), &(Z))
#define DRI(X) int (X); scanf("%d", &X)
#define DRII(X, Y) int X, Y; scanf("%d%d", &X, &Y)
#define DRIII(X, Y, Z) int X, Y, Z; scanf("%d%d%d", &X, &Y, &Z)
#define RS(X) scanf("%s", (X))
#define CASET int ___T, case_n = 1; scanf("%d ", &___T); while (___T-- > 0)
#define MP make_pair
#define PB push_back
#define MS0(X) memset((X), 0, sizeof((X)))
#define MS1(X) memset((X), -1, sizeof((X)))
#define LEN(X) strlen(X)
#define VPII vector<pair<int,int> >
#define F first
#define S second
#define RF(x) freopen(x,"r",stdin)
#define WF(x) freopen(x,"w",stdout)
typedef long long LL;
using namespace std;
typedef pair<LL,LL> PLL;
typedef pair<int,int> PII;
const LL MOD = 1e9+7;
const int SIZE = 1e6+5;
const LL INF = 1LL<<58;
const double eps = 1e-10;

int fw[200009];

void up(int x,int v){
	x+=2;
	for(;x<200009;x+=x&(-x))fw[x]+=v;
}

int qu(int x){
	x+=2;
	int ans=0;
	for(;x;x-=x&(-x))ans+=fw[x];
	return ans;
}
queue<int> pos[200009];//shoes of each type!
int N,H;
bool taken[200009];

long long count_swaps(std::vector<int> s) {
	N=SZ(s);
	H=N/2;
	REP(i,N){
		if(s[i]<0)s[i]=-s[i];
		else s[i]=H+s[i];
		pos[s[i]].push(i);
		up(i+1,1); //fw parameters are 0 indexed!!
	}
	long long ans =0;
	REP(i,N){
		if(taken[i])continue;
		int mi;//matching index
		if(s[i]<=H){//left shoe
			mi=s[i]+H;
		}
		else{
			mi=s[i]-H;
		}
		int mpos = pos[mi].front();//matching position
		ans += qu(mpos)-qu(i)-(s[i]<=H);//find position of mpos
		//printf("ans: %lld\n",ans);
		up(i+1,1);up(mpos,-1);
		taken[mpos]=taken[i]=1;
		pos[mi].pop();
		pos[s[i]].pop();
	}
	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...