Submission #1214173

#TimeUsernameProblemLanguageResultExecution timeMemory
1214173Bui_Quoc_CuongArranging Shoes (IOI19_shoes)C++20
100 / 100
109 ms29096 KiB
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 3e5 + 5;

int n;
int a[MAXN];
int b[MAXN];
int st[4 * MAXN], lazy[4 * MAXN];
vector <int> Neg[MAXN], Pos[MAXN];
int L_Neg[MAXN], R_Pos[MAXN], mark[MAXN];

void down(int id, int l, int r){
	if(lazy[id] == 0) return;

	int mid = (l + r) >> 1;

	st[id << 1]+= (mid - l + 1) * lazy[id];
	st[id << 1 | 1]+= (r - mid) * lazy[id];

	lazy[id << 1]+= lazy[id];
	lazy[id << 1 | 1]+= lazy[id];

	lazy[id] = 0;
}

void update(int id, int l, int r, int u, int v, int val){
	if(l > v || r < u) return;
	if(l >= u && r <= v){
		st[id]+= (r - l + 1) * val;
		lazy[id]+= val;
		return;
	}
	int mid = (l + r) >> 1;
	down(id, l, r);
	update(id << 1, l, mid, u, v, val);
	update(id << 1 | 1, mid + 1, r, u, v, val);
	st[id] = st[id << 1] + st[id << 1 | 1];
}

int get(int id, int l, int r, int u, int v){
	if(l > v || r < u) return 0;
	if(l >= u && r <= v) return st[id];
	down(id, l, r);
	int mid = (l + r) >> 1;
	return get(id << 1, l, mid, u, v) + get(id << 1 | 1, mid + 1, r, u, v);
}

long long count_swaps(std::vector <int> S){
	for(int &x : S){
		a[++ n] = x;
	}	
	n /= 2;

	for(int i = 1; i <= 2 * n; i++){
   		if(a[i] < 0) Neg[- a[i]].push_back(i);
   		else Pos[a[i]].push_back(i);
    }
    int cur = 0;

    for(int i = 1; i <= 2 * n; i++) if(!mark[i]){
    	int val = abs(a[i]);

    	int x = Neg[val][L_Neg[val]++];
    	int y = Pos[val][R_Pos[val]++];
    	
    	mark[x] = mark[y] = 1;

    	b[x] = ++ cur;
    	b[y] = ++ cur;
    }

    long long ans = 0;

	for(int i = 1; i <= 2 * n; i++){
		ans+= get(1, 1, 2 * n, b[i], 2 * n);
		update(1, 1, 2 * n, b[i], b[i], 1);
	}

	return ans;
}

// signed main(){
//     ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
//     #define nko "kieuoanh"
//     if(fopen(nko".inp", "r")){
//         freopen(nko".inp", "r", stdin); freopen(nko".out", "w", stdout);
//     }
//     cin >> n;
//     for(int i = 1; i <= 2 * n; i++){
//     	cin >> a[i];
//    		if(a[i] < 0) Neg[- a[i]].push_back(i);
//    		else Pos[a[i]].push_back(i);
//     }
//     int cur = 0;

//     for(int i = 1; i <= 2 * n; i++) if(!mark[i]){
//     	int val = abs(a[i]);

//     	int x = Neg[val][L_Neg[val]++];
//     	int y = Pos[val][R_Pos[val]++];
    	
//     	mark[x] = mark[y] = 1;

//     	b[x] = ++ cur;
//     	b[y] = ++ cur;
//     }

//     long long ans = 0;

// 	for(int i = 1; i <= 2 * n; i++){
// 		ans+= get(1, 1, 2 * n, b[i], 2 * n);
// 		update(1, 1, 2 * n, b[i], b[i], 1);
// 	}
// 	cout << ans;

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