Submission #560214

#TimeUsernameProblemLanguageResultExecution timeMemory
560214jk410Arranging Shoes (IOI19_shoes)C++17
100 / 100
166 ms74160 KiB
#include <bits/stdc++.h>
#include "shoes.h"
using namespace std;
typedef long long ll;
struct segtree{
    vector<int> tree;
    int init(int l,int r,int n=1){
        if (l==r)
            return tree[n]=1;
        int m=(l+r)>>1;
        return tree[n]=init(l,m,n<<1)+init(m+1,r,n<<1|1);
    }
    segtree(int n){
        tree.resize(1<<(int)ceil(log2(n))+1);
        init(1,n);
    }
    int update(int x,int v,int l,int r,int n=1){
        if (r<x||x<l)
            return tree[n];
        if (l==r)
            return tree[n]+=v;
        int m=(l+r)>>1;
        return tree[n]=update(x,v,l,m,n<<1)+update(x,v,m+1,r,n<<1|1);
    }
    int query(int lx,int rx,int l,int r,int n=1){
        if (r<lx||rx<l||lx>rx)
            return 0;
        if (lx<=l&&r<=rx)
            return tree[n];
        int m=(l+r)>>1;
        return query(lx,rx,l,m,n<<1)+query(lx,rx,m+1,r,n<<1|1);
    }
};
int N;
int S[200001],Idx[200001];
bool Used[200001];
queue<int> A[100001];
int my_abs(int x){
    if (x<0)
        return -x;
    return x;
}
ll count_swaps(vector<int> s){
    ll ans=0;
    N=(int)s.size();
    segtree *ST=new segtree(N);
    for (int i=1; i<=N; i++)
        S[i]=s[i-1];
    for (int i=1; i<=N; i++){
        int x=my_abs(S[i]);
        if (!A[x].empty()&&S[A[x].front()]+S[i]==0){
            Idx[A[x].front()]=i;
            A[x].pop();
        }
        else
            A[x].push(i);
    }
    for (int i=1; i<=N; i++){
        if (!ST->query(i,i,1,N))
            continue;
        ans+=ST->query(i+1,Idx[i]-1,1,N);
        if (S[i]>S[Idx[i]])
            ans++;
        ST->update(i,-1,1,N);
        ST->update(Idx[i],-1,1,N);
    }
    return ans;
}

Compilation message (stderr)

shoes.cpp: In constructor 'segtree::segtree(int)':
shoes.cpp:14:42: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
   14 |         tree.resize(1<<(int)ceil(log2(n))+1);
      |                        ~~~~~~~~~~~~~~~~~~^~
#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...