제출 #1040947

#제출 시각아이디문제언어결과실행 시간메모리
1040947idasArranging Shoes (IOI19_shoes)C++17
컴파일 에러
0 ms0 KiB
#include "shoes.h" #include <bits/stdc++.h> #define FOR(i, begin, end) for(int i=(begin); i<(end); i++) #define pb push_back #define int long long using namespace std; typedef long long ll; typedef vector<int> vi; const int N=2e5+10; int n, cn[N], pos[N]; vi p_pos, n_pos[N]; void upd_cn(int p, int x) { p++; for(int i=p; i<N; i+=i&(-i)) cn[i]+=x; } int get_cn_pref(int p) { p++; ll ret=0; for(int i=p; i>0; i-=i&(-i)) ret+=cn[i]; return ret; } int get_cn(int x, int y) { x++; y++; return get_cn_pref(y)-get_cn_pref(x-1); } void upd_pos(int p, int x) { p++; for(int i=p; i<N; i+=i&(-i)) pos[i]+=x; } int add_pos(int p) { p++; ll ret=0; for(int i=p; i>0; i-=i&(-i)) ret+=pos[i]; return ret; } int get_pos(int p) { return p+add_pos(p); } void shift(int p, int x) { int l=p, r=n-1; while(l<r){ int m=(l+r+1)/2; if(get_cn(p, m)<=x) l=m; else r=m-1; } upd_pos(p, -1); upd_pos(l+1, 1); } long long count_swaps(vector<int> s) { ll true_ans=1e18; n=s.size(); FOR(i, 0, n) { if(s[i]<0) n_pos[-s[i]].pb(i); else p_pos.pb(i); } FOR(i, 0, n) upd_cn(i, 1); ll ans=0; int in=n-1; while(!p_pos.empty()){ int pos=p_pos.back(); p_pos.pop_back(); upd_cn(pos, -1); int true_pos=get_pos(pos); assert(in>=true_pos); ll dist=in-true_pos; ans+=dist; in--; shift(pos, dist); int neg_pos=n_pos[s[pos]].back(); n_pos[s[pos]].pop_back(); upd_cn(neg_pos, -1); int true_neg_pos=get_pos(neg_pos); dist=in-true_neg_pos; ans+=dist; in--; shift(neg_pos, dist); } true_ans=min(true_ans, ans); // FOR(i, 0, n) s[i]=-s[i]; FOR(i, 0, N) cn[i]=pos[i]=0, n_pos[i].clear(); p_pos.clear(); reverse(s.begin(), s.end()); FOR(i, 0, n) { if(s[i]>0) n_pos[s[i]].pb(i); else p_pos.pb(i); } FOR(i, 0, n) upd_cn(i, 1); ans=0; in=n-1; while(!p_pos.empty()){ int pos=p_pos.back(); p_pos.pop_back(); upd_cn(pos, -1); int true_pos=get_pos(pos); assert(in>=true_pos); ll dist=in-true_pos; ans+=dist; in--; shift(pos, dist); int neg_pos=n_pos[-s[pos]].back(); n_pos[-s[pos]].pop_back(); upd_cn(neg_pos, -1); int true_neg_pos=get_pos(neg_pos); dist=in-true_neg_pos; ans+=dist; in--; shift(neg_pos, dist); } true_ans=min(true_ans, ans); return true_ans; }

컴파일 시 표준 에러 (stderr) 메시지

/usr/bin/ld: /tmp/cc9ug8iZ.o: in function `main':
grader.cpp:(.text.startup+0x2a8): undefined reference to `count_swaps(std::vector<int, std::allocator<int> >)'
collect2: error: ld returned 1 exit status