Submission #742330

#TimeUsernameProblemLanguageResultExecution timeMemory
742330haydendooArranging Shoes (IOI19_shoes)C++17
100 / 100
194 ms141324 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;

typedef pair<int,int> pi;

const int N=2e5+10;

int fw[N], fw2[N];
void update(int x, int y, int v) { //inclusive
    ++x; ++y;
    for (int tx=x; tx < N; tx += tx&(-tx)) fw[tx] += v, fw2[tx] -= v*(x-1);
    for (int ty=y+1; ty < N; ty += ty&(-ty)) fw[ty] -= v, fw2[ty] += v*y; 
}
int sum (int x) {
    ++x;
    int res = 0;
    for (int tx=x; tx; tx -= tx&(-tx)) res += fw[tx]*x + fw2[tx];
    return res;
}
int range_sum(int x, int y) { //inclusive
    return sum(y)-sum(x-1);
}

long long count_swaps(vector<int> s) {
    int n=s.size();
	deque<int> dq[n/2+1], dq2[n/2+1];
    for(int i=0; i<n; ++i) {
        if(s[i]<0) dq[-s[i]].push_back(i+1);
        else dq2[s[i]].push_back(i+1);
    }
    for(int i=0; i<=n; ++i) {
        update(i+1,i+1,i+1);
    }
    long long ans=0;
    vector<pair<int,int>> pairs;
    for(int i=1; i<=n/2; ++i) {
        for(int j=0; j<dq[i].size(); ++j) {
            if(dq[i][j]>dq2[i][j]) {
                ++ans;
                swap(dq[i][j], dq2[i][j]);
            }
            pairs.emplace_back(dq[i][j], dq2[i][j]);
        }
    }
    sort(pairs.begin(), pairs.end());
    long long cnt=0;
    for(auto it: pairs) {
        int l=it.first, r=it.second;
        ans += range_sum(r,r) + range_sum(l,l) - (cnt*2+1) - (cnt*2+2); //<< '\n';
        ++cnt;
        update(0,l,1); update(0,r,1);
    }
    return ans;
}

// int main() {
//     cout << count_swaps({2,1,-1,-2});
// }

/*
dq[1] = [2]
dq[2] = [1]
dq2[1] = [3]
dq2[2] = [4]
*/

Compilation message (stderr)

shoes.cpp: In function 'long long int count_swaps(std::vector<int>)':
shoes.cpp:38:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::deque<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   38 |         for(int j=0; j<dq[i].size(); ++j) {
      |                      ~^~~~~~~~~~~~~
#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...