Submission #392028

#TimeUsernameProblemLanguageResultExecution timeMemory
392028AugustinasJucasArranging Shoes (IOI19_shoes)C++14
100 / 100
303 ms22456 KiB
#include <bits/stdc++.h> using namespace std; struct node{ int val, l, r, plus; }; struct seg_tree{ vector<node> tree; int currInd = 0; int n; void build(int v){ if(v >= n){ tree[v].l = tree[v].r = currInd++; tree[v].val = tree[v].plus = 0; }else{ build(v*2); build(v*2+1); tree[v].l = tree[v*2].l; tree[v].r = tree[v*2+1].r; } } void apply(int v){ tree[v].val += tree[v].plus * (tree[v].r - tree[v].l + 1); if(v < n) tree[v*2].plus += tree[v].plus; if(v < n) tree[v*2+1].plus += tree[v].plus; tree[v].plus = 0; } void add(int v, int l, int r, int x){ apply(v); if(tree[v].l >= l && tree[v].r <= r){ /// sitas pilnai telpa intervale tree[v].plus += x; }else if(tree[v].l > r || tree[v].r < l){ }else { add(v*2, l, r, x); add(v*2+1, l, r, x); tree[v].val = tree[v*2].val + tree[v*2+1].val; } apply(v); } int find(int v, int l, int r){ apply(v); if(tree[v].l >= l && tree[v].r <= r){ /// sitas pilnai telpa intervale return tree[v].val; }else if(tree[v].l > r || tree[v].r < l){ return 0; }else { return find(v*2, l, r) + find(v*2+1, l, r); } } seg_tree(int dydis){ tree.resize(dydis*2+10); n = dydis; build(1); } }; const int dydis = 1e5 + 1; vector<int> kurL[dydis]; vector<int> kurR[dydis]; seg_tree medis(dydis * 2 + 1); long long count_swaps(vector<int> s) { for(int i = 0; i < s.size(); i++) medis.add(1, i, i, i); for(int i = 0; i < s.size(); i++){ if(s[i] > 0) kurR[s[i]].push_back(i); else kurL[-s[i]].push_back(i); } vector<pair<pair<int, int>, int> > poros; int n = s.size()/2; for(int i = 1; i <= n; i++){ for(int j = 0; j < kurL[i].size(); j++){ if(kurL[i][j] < kurR[i][j]){ poros.push_back({{kurL[i][j], kurR[i][j]}, 0}); }else{ poros.push_back({{kurR[i][j], kurL[i][j]}, 1}); } } } sort(poros.begin(), poros.end()); reverse(poros.begin(), poros.end()); int realIndex[s.size() + 1]; for(int i = 0; i < s.size(); i++) realIndex[i] = i; long long ans = 0; for(auto x : poros){ int i1 = medis.find(1, x.first.first, x.first.first); int i2 = medis.find(1, x.first.second, x.first.second) - 1 + x.second; // cout << "i1 = " << i1 << ", i2 = " << i2 << endl; ans += i2-i1; medis.add(1, x.first.first+1, x.first.second-1+x.second, -1); } return ans; }

Compilation message (stderr)

shoes.cpp: In function 'long long int count_swaps(std::vector<int>)':
shoes.cpp:63:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |     for(int i = 0; i < s.size(); i++) medis.add(1, i, i, i);
      |                    ~~^~~~~~~~~~
shoes.cpp:64:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   64 |     for(int i = 0; i < s.size(); i++){
      |                    ~~^~~~~~~~~~
shoes.cpp:71:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   71 |         for(int j = 0; j < kurL[i].size(); j++){
      |                        ~~^~~~~~~~~~~~~~~~
shoes.cpp:83:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   83 |     for(int i = 0; i < s.size(); i++) realIndex[i] = i;
      |                    ~~^~~~~~~~~~
shoes.cpp:82:9: warning: variable 'realIndex' set but not used [-Wunused-but-set-variable]
   82 |     int realIndex[s.size() + 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...