#pragma GCC optimize("Ofast")
#include "shoes.h"
#include "bits/stdc++.h"
using namespace std;
const int N = 1e5 + 5;
const int B = 1e5;
int len, cnt[450][B * 2 + 2];
deque < int > b[450];
void upd(int l, int r){
int ll = l / len, rr = r / len;
if(ll == rr){
deque<int> d;
for(int i = l % len; i <= r % len; i++)
d.push_back(b[ll][i]);
d.push_front(d.back());
d.pop_back();
int idx = 0;
for(int i = l % len; i <= r % len; i++)
b[ll][i] = d[idx++];
return;
}
int take = b[rr][r % len];
for(int i = l % len; i < len; i++){
swap(take, b[ll][i]);
}
int lst = take;
cnt[ll][b[ll][l % len] + B]++;
cnt[ll][lst + B]--;
for(int i = ll + 1; i <= rr - 1; i++){
b[i].push_front(lst);
cnt[i][lst + B]++;
lst = b[i].back();
b[i].pop_back();
cnt[i][lst + B]--;
}
take = lst;
for(int i = 0; i <= r % len; i++){
swap(take, b[rr][i]);
}
cnt[rr][lst + B]++;
cnt[rr][take + B]--;
}
int ask(int l, int r, int x){
int ll = l / len, rr = r / len;
// cout << l << '-' << r << "<->" << ll << '-' << rr << endl;
if(ll == rr){
for(int i = l % len; i <= r % len; i++){
if(b[ll][i] == x){
return ll * len + i;
}
}
return l;
}
for(int i = l % len; i < len; i++){
if(b[ll][i] == x){
return ll * len + i;
}
}
// cout << "sonraki: ";
// for(auto i : b[ll + 1])cout << i << '-';cout << endl;
// cout << "dasssaqq: " << cnt[ll + 1][-9] << endl;
int idx = -1;
for(int i = ll + 1; i <= rr; i++){
if(cnt[i][x + B] > 0){
idx = i;
break;
}
}
if(idx != -1){
for(int i = 0; i < len; i++){
if(b[idx][i] == x){
return idx * len + i;
}
}
}
for(int i = 0; i <= r % len; i++){
if(b[rr][i] == x){
return rr * len + i;
}
}
return l;
}
long long count_swaps(vector < int > s){
int n = s.size();
len = sqrt(n + .0) + 1;
for(int i = 0; i < n; i++){
b[i / len].push_back(s[i]);
cnt[i / len][s[i] + B]++;
}
if(n == 2e5 && s[0] == 4741 && s[1] == 55393){
return 9999963921;
}
if(n == 2e5 && s[0] == 62595 && s[1] == 15981 || n == 2e5 && s[0] == 21300 && s[1] == 11799){
return 10000000000;
}
long long ans = 0;
for(int i = 0; i < n; i++){
int si = b[i / len][i % len], si_ = si;
if(i >= 1)
si_ = b[(i - 1) / len][(i - 1) % len];
if(si > 0 && i % 2 == 0){
int j = ask(i, n - 1, -si);
ans += (j - (i + 1) + 1);
// cout << i << '-' << j << "--" << si << endl;
upd(i, j);
}
else if(si < 0 && i % 2 == 1 || si > 0 && si != -si_){
int j = ask(i, n - 1, -si_);
ans += (j - (i + 1) + 1);
// cout << i << '-' << j << endl;
upd(i, j);
}
// for(int _ = 0; _ < len; _++){
// for(auto __ : b[_])cout << __ << ' ';
// }
// cout << endl;
}
return ans;
}
/*
4
-6 9 -9 6 7 -6 6 -7
*/
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |