bzoj1367 [Baltic2004]sequence
2017-04-18 09:44
441 查看
左偏树论文模板题,不过想法很好。。
把序列分成m个区间,答案就是m个区间的中位数,中位数的维护,我们每次只维护当前区间前一半的最大堆,然后如果超过一半就弹出,堆顶就是中位数。
把序列分成m个区间,答案就是m个区间的中位数,中位数的维护,我们每次只维护当前区间前一半的最大堆,然后如果超过一半就弹出,堆顶就是中位数。
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) using namespace std; const int N=1e6+5; typedef long long ll; int n,m; int a ,tot=0; int v ,tr [2],dist ,siz ; int root ,l ,r ; inline int merge(int x,int y) { if (!x||!y)return x+y; if (v[x]<v[y])swap(x,y); tr[x][1]=merge(tr[x][1],y); siz[x]=siz[tr[x][0]]+siz[tr[x][1]]+1; if (dist[tr[x][1]]>dist[tr[x][0]])swap(tr[x][0],tr[x][1]); dist[x]=dist[tr[x][1]]+1; return x; } inline void pop(int &x) { x=merge(tr[x][0],tr[x][1]); } inline int newnode(int x) { v[++tot]=x; siz[tot]=1; tr[tot][0]=tr[tot][1]=dist[tot]=0; return tot; } int main() { scanf("%d",&n); fo(i,1,n) { scanf("%d",&a[i]); a[i]-=i; } int cnt=0; fo(i,1,n) { cnt++; root[cnt]=newnode(a[i]); l[cnt]=r[cnt]=i; while (cnt>1&&v[root[cnt]]<v[root[cnt-1]]) { cnt--; root[cnt]=merge(root[cnt],root[cnt+1]); r[cnt]=r[cnt+1]; while (siz[root[cnt]]*2>r[cnt]-l[cnt]+2)pop(root[cnt]); } } ll ans=0; fo(i,1,cnt) { int t=v[root[i]]; fo(j,l[i],r[i])ans+=abs(t-a[j]); } printf("%lld\n",ans); return 0; }
相关文章推荐
- 【BZOJ 1367】 1367: [Baltic2004]sequence (可并堆-左偏树)
- [BZOJ1367] [Baltic2004]sequence
- BZOJ1367 [Baltic2004]sequence
- bzoj 1367: [Baltic2004]sequence(中位数+可并堆)
- BZOJ[1367][Baltic2004]Sequence 可并堆
- BZOJ 1367 [Baltic2004]sequence
- 【BZOJ 1367】 [Baltic2004]sequence 可并堆
- 【bzoj1367】[Baltic2004]sequence
- BZOJ_1367_[Baltic2004]sequence_结论题+可并堆
- bzoj1367【Baltic2004】sequence
- BZOJ 1367([Baltic2004]sequence-左偏树+中位数贪心)
- 【BZOJ】1367: [Baltic2004]sequence
- 【可并堆】BZOJ1367(Baltic2004)[sequence]题解
- BZOJ 1367: [Baltic2004]sequence
- BZOJ1367 [Baltic2004]sequence 【左偏树】
- bzoj1367: [Baltic2004]sequence
- [可并堆 中位数] BZOJ 1367 [Baltic2004]sequence
- bzoj 1367: [Baltic2004]sequence
- 【BZOJ1367】【Baltic2004】sequence
- bzoj 1367: [Baltic2004]sequence 左偏树+贪心