Submission #1370285

#TimeUsernameProblemLanguageResultExecution timeMemory
1370285c12Arranging Shoes (IOI19_shoes)C++20
100 / 100
175 ms63772 KiB
#include <bits/stdc++.h>

#define ll long long

using namespace std;

class Lazy{
  public:
    vector<int>tree;
    vector<int>lazy;
    int n;
    void init(int _n){
      n = _n;
      tree = vector<int>(n*4);
      lazy = vector<int>(n*4);
    }
    
    int left(int i) { return i*2+1; }
    int right(int i) { return i*2+2; }
    void update_lazy(int l,int r,int node){
      tree[node] += lazy[node];
      if(l != r){
        lazy[left(node)] += lazy[node];
        lazy[right(node)] += lazy[node];
      }
      lazy[node] = 0;
    }
    void update(int ql,int qr,int l,int r,int node){
      update_lazy(l,r,node);
      if(ql > r || qr < l) return;
      if(ql <= l && r <= qr){
        lazy[node]++;
        return;
      }

      int mid = (l+r)/2;
      update(ql,qr,l,mid,left(node));
      update(ql,qr,mid+1,r,right(node));

      return;
    }
    ll query(int ql,int qr,int l,int r,int node){
      update_lazy(l,r,node);
      if(ql > r || qr < l) return 0;
      if(ql <= l && r <= qr){
        return tree[node];
      }
      
      int mid = (l+r)/2;

      return query(ql,qr,l,mid,left(node)) + query(ql,qr,mid+1,r,right(node));
    }
  };

vector<int>vis;

Lazy tree;

long long count_swaps(std::vector<int> s) {
  int n = s.size();
  tree.init(n);

  vis = vector<int>(n,0);

  int mx = 0;
  for(int i = 0;i < n;i++) mx = max(mx,s[i]);

  mx++;

  unordered_map<int,int>um;
  unordered_map<int,queue<int>>num;
  for(int i = 0;i < s.size();i++){
    if(um.find(s[i]) != um.end()){
      int neg = (s[i] > 0);
      if(!neg) neg--;

      int t = s[i];
      if(!num[s[i]].empty()){
        s[i] = num[s[i]].front() * neg;
        
        um[s[i]] = i;

        num[t].pop();
      }
      else{
        num[s[i] * -1].push(mx);
        
        s[i] = mx * neg;
        
        um[s[i]] = i;

        mx++;
      }
    }
    else{
      um[s[i]] = i;
    }
  }
  // for(auto x : um){
  //   cout << x.first << ' '  << x.second << '\n';
  // }

  ll cnt = 0;
  for(int i = 0;i < s.size();i++){
    if(vis[i]) continue;
    vis[i] = 1;

    int pos = um[s[i] * -1];
    int q = tree.query(i,i,0,n-1,0) - tree.query(pos,pos,0,n-1,0);
    
    cnt -= q;

    // cout << i << ' ' << pos << ' ' << q << ' ' << s[i] << '\n';
    tree.update(i,pos,0,n-1,0);

    vis[pos] = 1;
    cnt += (ll)(pos - i - 1);

    if(s[i] > 0) cnt++;
    // cout << cnt << '\n';
  }

  return cnt;
}

// 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;
// }
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...