Submission #305997

#TimeUsernameProblemLanguageResultExecution timeMemory
305997talant117408Arranging Shoes (IOI19_shoes)C++17
10 / 100
108 ms45048 KiB
#include "shoes.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N = 1e5+7;
ll tree[N*4], lz[N*4];

void push(int v, int l, int r){
    if(l > r) return;
    if(lz[v]){
        tree[v] += (r-l+1)*lz[v];
        if(l != r){
            lz[v<<1] += lz[v];
            lz[(v<<1)+1] += lz[v];
        }
        lz[v] = 0;
    }
}

ll get(int v, int l, int r, int ql, int qr){
    push(v, l, r);
    if(l > qr || r < ql) return 0;
    
    if(ql <= l && r <= qr) return tree[v];
    
    int mid = (l+r)>>1;
    return get(v<<1, l, mid, ql, qr)+get((v<<1)+1, mid+1, r, ql, qr);
}

void update(int v, int l, int r, int ql, int qr){
    push(v, l, r);
    if(l > qr || r < ql) return;
    
    if(ql <= l && r <= qr){
        tree[v] += (r-l+1);
        if(l != r){
            lz[v<<1]++;
            lz[(v<<1)+1]++;
        }
        return;
    }
    
    int mid = (l+r)>>1;
    update(v<<1, l, mid, ql, qr);
    update((v<<1)+1, mid+1, r, ql, qr);
    tree[v] = tree[v<<1]+tree[(v<<1)+1];
}
/*
ll count_swaps(vector <int> s);
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;
}*/

vector <set <int>> pos(N*2);

ll count_swaps(vector<int> s){
    int n = s.size(), i;
    for(i = 0; i < n; i++){
        if(s[i] > 0){
            pos[s[i]].insert(i);
        }
        else{
            pos[abs(s[i])+100003].insert(i);
        }
    }
    
    ll ans = 0;
    
    vector <int> used(n);
    for(i = 0; i < n; i++){
        if(used[i]) continue;
        
        if(s[i] > 0){
            int pos1 = i+get(1, 1, n, i+1, i+1)+1, pos2 = *(pos[s[i]+100003].upper_bound(i))+1;
            used[pos2-1]++;
            pos2 += get(1, 1, n, pos2, pos2);
            ans += pos2-pos1;
            if(pos1+1 != pos2){
                update(1, 1, n, pos1+1, pos2-1);
            }
            pos[s[i]+100003].erase(pos[s[i]+100003].upper_bound(i));
        }
        else{
            ans--;
            int pos1 = i+get(1, 1, n, i+1, i+1)+1, pos2 = *(pos[abs(s[i])].upper_bound(i))+1;
            used[pos2-1]++;
            pos2 += get(1, 1, n, pos2, pos2);
            ans += pos2-pos1;
            if(pos1+1 != pos2){
                update(1, 1, n, pos1+1, pos2-1);
            }
            pos[abs(s[i])].erase(pos[abs(s[i])].upper_bound(i));
        }
    }
    
    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...