[破碎的状态] [-7] BZOJ 1367
这是一道权限题
所以要感谢@wnjxyk 的号
还要抱歉..拉低了他的正确率呢
解法:
因为一些奇怪的情况..
这一题是一个中位数的题..
嗯..
感觉自己不太会表达..贴个网址好了http://www.cnblogs.com/rausen/p/4033724.html
代码如下:
#include<set> #include<map> #include<list> #include<queue> #include<stack> #include<string> #include<time.h> #include<math.h> #include<memory> #include<vector> #include<bitset> #include<fstream> #include<stdio.h> #include<utility> #include<sstream> #include<string.h> #include<iostream> #include<stdlib.h> #include<algorithm> using namespace std; int b[1000005]; struct node { node * right; int val; node * ch; }; node * null; node * join(node * x,node * y) { if (x->val>y->val) swap(x,y); x->right=y->ch; y->ch=x; return y; } node * u(node * x) { if (x==null) return null; node * y=x->right; x->right=null; if (y==null) return x; node * z=y->right; y->right=null; if (z==null) return join(x,y); return join(u(z),join(x,y)); } void delete_max(node * &x) { x=u(x->ch); } node * new_node(int x) { static node a[2000005]; static int top=0; node * t=&a[top++]; t->val=x; t->ch=null; t->right=null; return t; } int main() { #ifdef absi2011 freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif null=new_node(0); null->ch=null; null->right=null; int n; scanf("%d",&n); int i; static int size[1000005]; static node * a[1000005]; int rail=0; for (i=0;i<n;i++) { int x; scanf("%d",&x); x-=i; b[i]=x; size[rail]=1; a[rail]=new_node(x); rail++; for (;;) { if (rail==1) break; if (a[rail-1]->val<a[rail-2]->val) { rail--; size[rail-1]+=size[rail]; a[rail-1]=join(a[rail],a[rail-1]); if ((size[rail-1]%2==0)&&(size[rail]%2==1)) { delete_max(a[rail-1]); } } else { break; } } } long long ans=0; int now=0; for (i=0;i<n;i++) { ans+=abs(a[now]->val-b[i]); size[now]--; if (size[now]==0) now++; } cout<<ans<<endl; return 0; }