Submission #267029

#TimeUsernameProblemLanguageResultExecution timeMemory
267029Dremix10Arranging Shoes (IOI19_shoes)C++17
100 / 100
268 ms35448 KiB
#include "shoes.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; typedef unsigned long long ull; typedef pair<int,int> pi; typedef pair<ll,ll> pl; #define F first #define S second #define endl '\n' #define all(x) (x).begin(),(x).end() #if dremix #define p(x) cerr<<#x<<" = "<<x<<endl; #define p2(x,y) cerr<<#x<<" , "<<#y<<" = "<<x<<" , "<<y<<endl; #define pp(x) cerr<<#x<<" = ("<<x.F<<" , "<<x.S<<")"<<endl; #define pv(x) cerr<<#x<<" = {";for(auto u : x)cerr<<u<<", ";cerr<<"}"<<endl; #define ppv(x) cerr<<#x<<" = {";for(auto u : x)cerr<<u.F<<"-"<<u.S<<", ";cerr<<"}"<<endl; #else #define p(x) #define p2(x,y) #define pp(x) #define pv(x) #define ppv(x) #endif #define fastio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); const int maxp = 22; const ld EPS = 1e-18; const ll INF = 1e18; const int MOD = 1e9+7; const int N = 2e5+1; template<typename T> struct SEGTREE{ struct node{ T val; // for adding more stuff node() : val(0) {} node(T _val) : val(_val) {} }; vector<node> seg; int N; void init(int n){ N = n; seg.assign(4*n,node()); } node merge(node x, node y){ node res; res.val = x.val + y.val; return res; } void build(int s, int e, int idx, T arr[]){ if(s == e){ seg[idx] = node(arr[s]); return; } int mid = (s+e)/2; build(s,mid,idx*2,arr); build(mid+1,e,idx*2+1,arr); seg[idx] = merge(seg[idx*2],seg[idx*2+1]); } // supports 1-indexing void build(T arr[]){ build(1,N,1,arr); } void update(int s, int e, int idx, int k, T val){ if(s==e && s==k){ seg[idx].val += val; return; } if(s>k || e<k) return; int mid = (s+e)/2; update(s,mid,idx*2,k,val); update(mid+1,e,idx*2+1,k,val); seg[idx] = merge(seg[idx*2],seg[idx*2+1]); } // arr[k] += val void update(int k, T val){ update(1,N,1,k,val); } node query(int s, int e, int idx, int qs, int qe){ if(qs<=s && e<=qe) return seg[idx]; if(s>qe || e<qs) return node(); int mid = (s+e)/2; return merge(query(s,mid,idx*2,qs,qe),query(mid+1,e,idx*2+1,qs,qe)); } T query(int l, int r){ return query(1,N,1,l,r).val; } }; long long count_swaps(vector<int> s) { int i,n = s.size(); int arr[n+1]; for(i=1;i<=n;i++)arr[i]=1; SEGTREE<int> seg; seg.init(n); seg.build(arr); vector<set<int> > l(n+1); vector<set<int> > r(n+1); ll ans = 0; for(i=0;i<n;i++){ if(s[i]<0)l[-s[i]].insert(i+1); else r[s[i]].insert(i+1); } for(i=1;i<=n/2;i++){ pv(l[i]) pv(r[i]) } for(i=0;i<n;i++){ if(seg.query(i+1,i+1)==0)continue; for(int j=1;j<=n/2;j++){ pv(l[j]) pv(r[j]) } if(s[i]<0){ int nxt = *(r[-s[i]].begin()); ans += seg.query(1,nxt) - 2; p2(nxt,ans) seg.update(i+1,-1); seg.update(nxt,-1); r[-s[i]].erase(nxt); l[-s[i]].erase(i+1); } else{ int nxt = *(l[s[i]].begin()); ans += seg.query(1,nxt) - 1; p2(nxt,ans) seg.update(i+1,-1); seg.update(nxt,-1); r[s[i]].erase(i+1); l[s[i]].erase(nxt); } } 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...