Submission #1348157

#TimeUsernameProblemLanguageResultExecution timeMemory
1348157huutuanArranging Shoes (IOI19_shoes)C++20
100 / 100
169 ms273224 KiB
#include "shoes.h"

#include <bits/stdc++.h>

using namespace std;

struct BIT{
   int n;
   vector<int> t;
   void init(int _n){
      n=_n;
      t.assign(n+1, 0);
   }
   void update(int pos, int val){
      ++pos;
      for (int i=pos; i<=n; i+=i&(-i)) t[i]+=val;
   }
   int get(int pos){
      ++pos;
      int ans=0;
      for (int i=pos; i; i-=i&(-i)) ans+=t[i];
      return ans;
   }
   int get(int l, int r){
      return get(r)-get(l-1);
   }
} bit;

long long count_swaps(vector<int> a) {
   int n=a.size();
   vector<queue<int>> pos(n*2+1);
   vector<int> match(n);
   long long ans=0;
   for (int i=0; i<n; ++i){
      int id=a[i]>0?a[i]:n-a[i];
      int rid=a[i]>0?n+a[i]:-a[i];
      if (pos[rid].size()){
         match[pos[rid].front()]=i;
         match[i]=pos[rid].front();
         if (a[i]<0) ++ans;
         pos[rid].pop();
      }else{
         pos[id].push(i);
      }
   }
   bit.init(n);
   for (int i=0; i<n; ++i){
      if (match[i]<i){
         ans+=bit.get(match[i], i);
         bit.update(match[i], 1);
         bit.update(i, 1);
      }
   }
   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...