제출 #182280

#제출 시각아이디문제언어결과실행 시간메모리
182280PedroBigManArranging Shoes (IOI19_shoes)C++14
100 / 100
947 ms36332 KiB
#include <iostream> #include <vector> #include <cmath> #include <algorithm> #include <string> #include <map> #include <set> #include "shoes.h" using namespace std; typedef long long int ll; typedef unsigned long long int ull; typedef long double ld; #define REP(i,a,b) for(ll i=(ll) a; i<(ll) b; i++) #define pb push_back #define mp make_pair #define pl pair<ll,ll> #define ff first #define ss second #define INF 100000000000000000LL int insig; #define In(vecBRO, LENBRO) REP(IBRO,0,LENBRO) {cin>>insig; vecBRO.pb(insig);} void Out(vector<ll> x) {REP(i,0,x.size()) {cout<<x[i]<<" ";} cout<<endl;} class ST { public: ll N; vector<ll> ar; vector<ll> p; ll neut; ll op(ll a, ll b) { return (a+b); } ST(vector<ll> arr) { neut=0; N = (ll) 1<<(ll) ceil(log2(arr.size())); REP(i,0,arr.size()) {ar.pb(arr[i]);} REP(i,arr.size(),N) {ar.pb(neut);} REP(i,0,N) {p.pb(0);} REP(i,0,N) {p.pb(ar[i]);} ll cur = N-1; while(cur>0) { p[cur]=op(p[2*cur],p[2*cur+1]); cur--; } } ll query(ll a,ll b, ll c, ll x, ll y) //c=current node, starting in 1, a,b=range of query, x,y=range of node c in the array down, x,y from 0 to N-1. query(a,b)->query(a,b,1,0,N-1) { if(y<a || x>b) {return neut;} if(x>=a && y<=b) {return p[c];} ll mid=(x+y)/2; return op(query(a,b,2*c,x,mid),query(a,b,2*c+1,mid+1,y)); } void update(ll s, ll a, ll c, ll x, ll y) //positions in [a,b] from 0 to N-1 gets +s { if(y<a || x>a) {return ;} p[c]+=s; if(c==a+N) {ar[a]+=s; return;} ll mid=(x+y)/2; update(s,a,2*c,x,mid); update(s,a,2*c+1,mid+1,y); } }; ll count_swaps(vector<int> s) { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll N=s.size()/2; map<ll,vector<ll> > m; vector<ll> xx; REP(i,0,2*N) { if(m.find(s[i])==m.end()) {m[s[i]]=xx;} m[s[i]].pb(i); } ll ind=0; ll ans=0; REP(i,0,2*N) { if(m.find(i)==m.end()) {continue;} REP(j,0,m[i].size()) { if(m[i][j]<m[-i][j]) {ans++;} s[m[i][j]]=ind; s[m[-i][j]]=ind; ind++; } } map<ll,ll> t; ind=0; REP(i,0,2*N) { if(t.find(s[i])==t.end()) {t[s[i]]=ind; ind++;} } REP(i,0,2*N) {s[i]=t[s[i]];} vector<ll> x; REP(i,0,N) {x.pb(0LL);} ST S(x); REP(i,0,2*N) { ans+=S.query(s[i]+1,S.N-1,1,0,S.N-1); S.update(1,s[i],1,0,S.N-1); } 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...