This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "shoes.h"
#include <bits/stdc++.h>
//#define int long long
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define sc second
#define endl "\n"
#define pii pair<int,int>
using namespace std;
const int MAXN = 2e5+5;
const int offse = 1e5;
const int mod7 = 1e9+7;
const long long inf = 1e18;
vector<long long> seg(MAXN<<2);
vector<long long> lazy(MAXN<<2);
bool visited[MAXN];
vector<set<int>> closest(MAXN);
void push(int nod, int tl, int tr)
{
if(!lazy[nod])return;
if(tl != tr)
{
lazy[nod<<1] += lazy[nod];
lazy[nod<<1|1] += lazy[nod];
}
seg[nod] += (tr-tl+1)*lazy[nod];
lazy[nod] = 0;
}
void update(int nod, int tl, int tr, int l, int r)
{
push(nod, tl, tr);
if(tl>r || tl> tr || tr<l)return;
if(tl>=l && tr<=r)
{
lazy[nod]++;
//push(nod,tl,tr);
return;
}
int mid = tl+tr>>1;
update(nod<<1, tl, mid,l,r);
update(nod<<1|1, mid+1, tr,l,r);
seg[nod] = seg[nod<<1] + seg[nod<<1|1];
}
long long query(int nod,int tl, int tr, int l, int r)
{
push(nod, tl ,tr);
if(tl>r || tl> tr || tr<l)return 0;
if(tl>=l && tr<=r)return seg[nod];
int mid = tl+tr>>1;
return query(nod<<1, tl, mid,l,r) + query(nod<<1|1, mid+1, tr,l,r);
}
long long count_swaps(std::vector<int> s) {
int n = s.size();
long long rez = 0;
for(int i=0;i < n; i++)closest[s[i]+offse].insert(i);
for(int i=0; i<n; i++)
{
if(visited[i])continue;
if(s[i] < 0)
{
int trazi = -s[i] + offse;
int poz = *closest[trazi].begin();
visited[poz] = 1;
closest[trazi].erase(closest[trazi].begin());
closest[s[i]+offse].erase(closest[s[i]+offse].begin());
int pravapoz = i+query(1,1,n,i,i);
int novapoz = poz+query(1,1,n,poz,poz);
update(1,1,n, i, poz);
rez+= novapoz - pravapoz - 1;
}
else
{
int trazi = -s[i] + offse;
int poz = *closest[trazi].begin();
visited[poz] = 1;
closest[trazi].erase(closest[trazi].begin());
closest[s[i]+offse].erase(closest[s[i]+offse].begin());
int pravapoz = i+query(1,1,n,i,i);
int novapoz = poz+query(1,1,n,poz,poz);
update(1,1,n, i, poz);
rez+= novapoz - pravapoz;
}
}
return rez;
}
/*
2
2 1 -1 -2
*/
/*
3
-2 2 2 -2 -2 2
*/
Compilation message (stderr)
shoes.cpp: In function 'void update(int, int, int, int, int)':
shoes.cpp:46:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
46 | int mid = tl+tr>>1;
| ~~^~~
shoes.cpp: In function 'long long int query(int, int, int, int, int)':
shoes.cpp:57:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
57 | int mid = tl+tr>>1;
| ~~^~~
# | 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... |