제출 #1307772

#제출 시각아이디문제언어결과실행 시간메모리
1307772lufychopArranging Shoes (IOI19_shoes)C++20
100 / 100
384 ms153844 KiB
#include "shoes.h"
#include <bits/stdc++.h>

using namespace std;

long long n;
map<long long,deque<long long>> mp;
vector<long long> seg(1000000,0);

void update_tree(int pos,int val,int l,int r,int pos_tree)
{
    if(pos<l || r<pos || l>r)
    {
        return;
    }
    if(pos==l && pos==r)
    {
        seg[pos_tree]=val;
        return;
    }
    update_tree(pos,val,l,(l+r)/2,pos_tree*2);
    update_tree(pos,val,(l+r)/2+1,r,pos_tree*2+1);
    seg[pos_tree]=seg[pos_tree*2]+seg[pos_tree*2+1];
}
int sum_tree(int ql,int qr,int l,int r,int pos_tree)
{
    if(r<ql || qr<l)
    {
        return 0;
    }
    if(ql<=l && r<=qr)
    {
        return seg[pos_tree];
    }
    return sum_tree(ql,qr,l,(l+r)/2,pos_tree*2)+sum_tree(ql,qr,(l+r)/2+1,r,pos_tree*2+1);
}

long long count_swaps(vector<int> s)
{
    n=s.size();
    long long ans=0;
    long long LL=0,RR=n-1;
    for(int i=0;i<n;i++)
    {
        mp[s[i]].push_back(i);
    }
    while(LL<RR)
    {
        if(s[LL]!=0)
        {
            long long tmp=0;
            long long L=LL+1;
            long long R=mp[-s[LL]].front();
            mp[s[LL]].pop_front();
            mp[-s[LL]].pop_front();
            for(int i=L;i<=R;i++)
            {
                if(s[i]==0)
                {
                    tmp++;
                }
            }
            // cout<<tmp<<" ";
            tmp=sum_tree(L,R,0,n-1,1);
            ans=ans+R-L-tmp;
            // cout<<tmp<<"\n";
            if(s[R]<0)
            {
                ans++;
            }
            s[R]=0;
            s[LL]=0;
            update_tree(R,1,0,n-1,1);
            update_tree(LL,1,0,n-1,1);
        }
        if(s[RR]!=0)
        {
            long long tmp=0;
            long long L=mp[-s[RR]].back();
            long long R=RR-1;
            mp[-s[RR]].pop_back();
            mp[s[RR]].pop_back();
            for(int i=L;i<=R;i++)
            {
                if(s[i]==0)
                {
                    tmp++;
                }
            }
            // cout<<tmp<<" ";
            tmp=sum_tree(L,R,0,n-1,1);
            ans=ans+R-L-tmp;
            // cout<<tmp<<"\n";
            if(s[L]>0)
            {
                ans++;
            }
            s[L]=0;
            s[RR]=0;
            update_tree(L,1,0,n-1,1);
            update_tree(RR,1,0,n-1,1);
        }
        // cout<<LL<<RR;
        LL++;
        RR--;
    }
	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...