营业额统计(SBT)
题目:
Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。
输入
第一行为正整数 ,表示该公司从成立一直到现在的天数
接下来的n行每行有一个整数(一定有数据小于〇) ,表示第i天公司的营业额。
输出
输出文件仅有一个正整数,即每一天的最小波动值之和。答案保证在int范围内
营业额统计(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;
}
AVL代码:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
#define MAXN 100005
#define INF 123456789
int ans,tmpdiff=INF,cnt,root,dayv;
struct node
{
int lch,rch,num,h;
}tree[MAXN];
int sum;
int n,m;
void zig(int &r)
{
int t=tree[r].lch;
tree[r].lch=tree[t].rch;
tree[t].rch=r;
tree[r].h=max(tree[tree[r].lch].h,tree[tree[r].rch].h)+1;
tree[t].h=max(tree[tree[t].lch].h,tree[tree[t].rch].h)+1;
r=t;
}
void zag(int &r)
{
int t=tree[r].rch;
tree[r].rch=tree[t].lch;
tree[t].lch=r;
tree[r].h=max(tree[tree[r].lch].h,tree[tree[r].rch].h)+1;
tree[t].h=max(tree[tree[t].lch].h,tree[tree[t].rch].h)+1;
r=t;
}
void insert(int &root,int x)
{
if(root==0)
{
tree[++cnt].num=x;
tree[cnt].h=1;
root=cnt;
return;
}
tmpdiff=min(tmpdiff,abs(x-tree[root].num));
if(x<tree[root].num)
insert(tree[root].lch,x);
else if(x>tree[root].num)
insert(tree[root].rch,x);
else return;
tree[root].h=max(tree[tree[root].lch].h,tree[tree[root].rch].h)+1;
if(tree[tree[root].lch].h-tree[tree[root].rch].h>1)
{
if(x<tree[tree[root].lch].num)
{
zig(root);
}
else
{
zag(tree[root].lch);
zig(root);
}
}
else if(tree[tree[root].rch].h-tree[tree[root].lch].h>1)
{
if(x>tree[tree[root].rch].num)
zag(root);
else
{
zig(tree[root].rch);
zag(root);
}
}
tree[root].h=max(tree[tree[root].lch].h,tree[tree[root].rch].h)+1;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&dayv);
if(i==1)ans+=dayv;
tmpdiff=INF;
insert(root,dayv);
if(tmpdiff!=INF)
ans+=tmpdiff; }
printf("%d",ans);
return 0;
}
营业额统计(SBT)的更多相关文章
- BZOJ1588: [HNOI2002]营业额统计[BST]
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 14151 Solved: 5366[Submit][Sta ...
- 【Treap】bzoj1588-HNOI2002营业额统计
一.题目 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司 ...
- NOI 2002 营业额统计 (splay or fhq treap)
Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...
- BZOJ 1588: [HNOI2002]营业额统计
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 14396 Solved: 5521[Submit][Sta ...
- 营业额统计(bzoj1588)
Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...
- BZOJ 1588: [HNOI2002]营业额统计 双向链表 / splay / treap
1588: [HNOI2002]营业额统计 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger ...
- Splay树-Codevs 1296 营业额统计
Codevs 1296 营业额统计 题目描述 Description Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司 ...
- 【BZOJ-1588】营业额统计 Splay
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 12485 Solved: 4508[Submit][Sta ...
- BZOJ1588 HNOI2002 营业额统计 [Splay入门题]
[HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 4128 Solved: 1305 Description 营业额统计 ...
随机推荐
- codeforces 734E(DFS,树的直径(最长路))
题目链接:http://codeforces.com/contest/734/problem/E 题意:有一棵黑白树,每次操作可以使一个同色连通块变色,问最少几次操作能使树变成全黑或全白. 思路:先进 ...
- Protobuf C#教程 ThriftC#教程大合辑
android与PC,C#与Java 利用protobuf 进行无障碍通讯[Socket] http://www.cnblogs.com/TerryBlog/archive/2011/04/23/20 ...
- 响应式图片srcset学习
响应式图片srcset全新释义sizes属性w描述符 先转再看
- c#中方法的重载
转自:http://www.cnblogs.com/lovesong_blog/articles/1416617.html string和program都是Object的派生类,string类型是se ...
- Excel 导入 Sql Server出错——“文本被截断,或者一个或多个字符在目标代码页中没有匹配项”错误的解决
有人说应该先转成Access, 再转到Sql Server. 其实用处并不大, 要截断的还是被截断了. 原因是,SQL Server的导入导出为了确定数据表的字段类型,取excel文件的前8行来判别. ...
- 命令行模式 svn版本管理
linux 下svn 在命令行模式下的操作安装完svn服务并配置了环境变量之后,要创建一个存放工厂(项目)的仓库repositories用于版本控制(比如我的repositories的路径为 path ...
- Linux 压缩和解压缩常用命令
主要记录tar,zip,gzip,bzip2,rar等常用命令,对.tar..gz..tar.gz..tgz..bz2..tar.bz2..zip..rar这8种压缩文件的操作. 1. tar 命令 ...
- A Look At Android Support Annotations
转自:https://asce1885.gitbooks.io/android-rd-senior-advanced/content/shen_ru_qian_chu_android_support_ ...
- sql server 里类似replace的字符串子串删除
做如下替换: 将字符串asd#sdf#sdfsf中含# …# 形式的子串删除,写出sql语句 sql语句如下: UPDATE MM SET name =substring(name,0,CHAR ...
- appium +python 一个简单的例子
appium 安装和python 安装好后. 1. 启动android模拟器--Genymotion-点击Start 2. 启动appium 3. 运行代码. # -*- ...