Submission #841725

#TimeUsernameProblemLanguageResultExecution timeMemory
841725CookieArranging Shoes (IOI19_shoes)C++14
100 / 100
358 ms149820 KiB
#include "shoes.h"
#include<bits/stdc++.h>
#include<fstream>

using namespace std;
//ifstream fin("FEEDING.INP");
//ofstream fout("FEEDING.OUT");
#define sz(a) (int)a.size()
#define ll long long
#define pb push_back
#define forr(i, a, b) for(int i = a; i < b; i++)
#define dorr(i, a, b) for(int i = a; i >= b; i--)
#define ld long double
#define vt vector
#include<fstream>
#define fi first
#define se second
#define pll pair<ll, ll>
#define pii pair<int, int>
const int mxn = 2e5 + 5;
using namespace std;
map<int, queue<int>>mp;
int bit[mxn + 1], to[mxn + 1], to2[mxn + 1];
bool vis[mxn + 1];
int n;
void upd(int p, int v){
    p++;
    while(p <= n){
        bit[p] += v; p += p & (-p);
    }
}
ll get(int p){
    p++;
    ll ans = 0;
    while(p){
        ans += bit[p]; p -= p & (-p);
    }
    return(ans);
}
ll count_swaps(vt<int>s){


    n = sz(s);
    for(int i = 0; i < sz(s); i++){
        if(s[i] < 0){
            if(mp[-s[i]].size()){
                int id = mp[-s[i]].front(); mp[-s[i]].pop();
                to[i] = id; to2[id] = i;
            }else{
                mp[s[i]].push(i);
            }

        }else{
            if(mp[-s[i]].size()){
                int id = mp[-s[i]].front();
                mp[-s[i]].pop();
                to[id] = i; to2[i] = id;
            }else{
                mp[s[i]].push(i);
            }

        }

    }
    ll ans =0 ;
    for(int i = 0; i < n; i++)upd(i, 1);
    for(int i = 0; i < sz(s); i++){
        if(!vis[i]){
            if(s[i] > 0){
                ans += get(to2[i] -1); upd(to2[i], -1);
                ans += get(i - 1); upd(i, -1);
                vis[to2[i]] = 1;
            }else{
                ans += get(i - 1); upd(i, -1);
                ans += get(to[i] -1); upd(to[i], -1);
                vis[to[i]] = 1;
            }
        }
    }
    return(ans);

}
/*
int main() {
	int n;
	assert(1 == scanf("%d", &n));
	vector<int> S(2 * n);
	for (int i = 0; i < 2 * n; i++)
		assert(1 == scanf("%d", &S[i]));
	fclose(stdin);

	long long result = count_swaps(S);

	printf("%lld\n", result);
	fclose(stdout);
	return 0;
}

*/
#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...