营业额统计(SBT)
#include<cstdio> #include<cstring> #include<string> #include<cstdlib> using namespace std; #define MAXN 100005 #define INF 10000000 int sz[MAXN],ch[MAXN][2],val[MAXN],root,fa[MAXN],n,cnt; #define abs(a) ((a)>0?(a):-(a)) void rotato(int &r,bool flag) { int t=ch[r][!flag]; if(!t)return; ch[r][!flag]=ch[t][flag]; ch[t][flag]=r; sz[r]=sz[ch[r][0]]+sz[ch[r][1]]+1; sz[t]=sz[ch[t][0]]+sz[ch[t][1]]+1; r=t; } void maintain(int &r,bool flag) { if(!flag) { if(sz[ch[ch[r][0]][0]]>sz[ch[r][1]]) rotato(r,1); else if(sz[ch[ch[r][0]][1]]>sz[ch[r][1]]) { rotato(ch[r][0],0); rotato(r,1); } else return; } else { if(sz[ch[ch[r][1]][1]]>sz[ch[r][0]]) rotato(r,0); else if(sz[ch[ch[r][1]][0]]>sz[ch[r][0]]) {rotato(ch[r][1],1); rotato(r,0); } else return; } maintain(ch[r][0],0); maintain(ch[r][1],1); maintain(r,0); maintain(r,1); } void insert(int &r,int t) { if(!r) { cnt++; val[cnt]=t; sz[cnt]=1; r=cnt; return; } if(val[r]==t) return; else if(val[r]>t) insert(ch[r][0],t); else insert(ch[r][1],t); maintain(r,t>=val[r]); } int find(int r,int t) { int ans=INF; while(r) { if(abs(val[r]-t)<ans) ans=abs(val[r]-t); if(t<val[r]) r=ch[r][0]; else if(t>val[r]) r=ch[r][1]; else break; } return ans; } int main() { int t,ans=0; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&t); if(i>1) { int tmp=find(root,t); ans+=tmp; } else ans=t; insert(root,t); } printf("%d\n",ans); return 0; }
原文:http://www.cnblogs.com/hefenghhhh/p/6239959.html