Submission #1196848

#TimeUsernameProblemLanguageResultExecution timeMemory
1196848KasymKArranging Shoes (IOI19_shoes)C++17
50 / 100
1096 ms30204 KiB
#include "bits/stdc++.h" #include "shoes.h" using namespace std; #define ff first #define ss second #define all(v) v.begin(), v.end() #define ll long long #define pb push_back #define pii pair<int, int> #define pli pair<ll, int> #define pll pair<ll, ll> #define tr(i, c) for(auto i = c.begin(); i != c.end(); ++i) #define wr puts("----------------") template<class T>bool umin(T& a,T b){if(a>b){a=b;return 1;}return 0;} template<class T>bool umax(T& a,T b){if(a<b){a=b;return 1;}return 0;} const int N = 2e5+5; set<int> rep[N]; bool vis[N]; struct node { int l, r, val; node(){ val=1; }; } seg[N<<2]; void bld(int x, int l, int r){ seg[x].l=l, seg[x].r=r; if(l==r) return; int mid=(l+r)>>1; bld(x<<1, l, mid); bld(x<<1|1, mid+1, r); seg[x].val=seg[x<<1].val+seg[x<<1|1].val; } void upd(int x, int k){ if(seg[x].l==seg[x].r){ seg[x].val=0; return; } int mid=(seg[x].l+seg[x].r)>>1; if(k<=mid) upd(x<<1, k); else upd(x<<1|1, k); seg[x].val=seg[x<<1].val+seg[x<<1|1].val; } int qry(int x, int l, int r){ if(l>r) return 0; if(seg[x].l==l and seg[x].r==r) return seg[x].val; int mid=(seg[x].l+seg[x].r)>>1; if(r<=mid) return qry(x<<1, l, r); else if(l>mid) return qry(x<<1|1, l, r); else return qry(x<<1, l, mid)+qry(x<<1|1, mid+1, r); } ll count_swaps(vector<int> s){ int n=(int)s.size()/2; ll answer=0; bld(1, 1, 2*n); for(int i = 1; i <= 2*n; ++i) rep[s[i-1]+n].insert(i); for(int i = 1; i <= 2*n; ++i){ if(vis[i]) continue; auto id=upper_bound(all(rep[-s[i-1]+n]), i); vis[*id]=1, rep[-s[i-1]+n].erase(id); upd(1, *id); answer+=qry(1, i+1, *id-1)+(s[i-1]>0); } return answer; }
#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...