Submission #741184

#TimeUsernameProblemLanguageResultExecution timeMemory
741184JakobZorzArranging Shoes (IOI19_shoes)C++14
100 / 100
154 ms57604 KiB
#include "shoes.h" #include <set> using namespace std; #define ll long long #define POW 20 set<int> shoes[400000]; int n; ll segtree[(2 << POW)+1]; int l[(2 << POW)+1], r[(2 << POW)+1]; ll init_node(int node, int l1, int r1) { l[node] = l1; r[node] = r1; int mid = (l1+r1)/2; if(node<(1<<POW)) segtree[node] = init_node(2*node,l1,mid) + init_node(2*node+1,mid,r1); return segtree[node]; } void update_node(int node) { if(node<(1<<POW)) segtree[node]=segtree[2*node]+segtree[2*node+1]; if(node!=1) update_node(node/2); } void set_dist(int i) { segtree[(1<<POW)+i]=0; update_node((1<<POW)+i); } ll get_dist_sum(int node, int i) { if(i<=l[node]) return 0; if(i>=r[node]) return segtree[node]; return get_dist_sum(2*node, i) + get_dist_sum(2*node+1, i); } ll get_dist(int i){ return segtree[(1<<POW)+i]; } ll count_swaps(vector<int> s) { n = s.size(); for(int i=0;i<n;i++) shoes[s[i]+200000].insert(i); for(int i=0;i<n;i++) segtree[(1<<POW) + i]=1; init_node(1, 0, 1<<POW); ll res=0; int pos1=0; while(pos1<n){ int pos2=*shoes[200000-s[pos1]].begin(); res+=get_dist_sum(1, pos2); if(s[pos1]<0) res--; set_dist(pos1); set_dist(pos2); shoes[200000-s[pos1]].erase(shoes[200000-s[pos1]].begin()); shoes[200000+s[pos1]].erase(shoes[200000+s[pos1]].begin()); while(get_dist(pos1)==0) pos1++; } return res; }
#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...