原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1297

先是暴力加优化T了最后两个点……

我还是来想想正解吧。

先写棵线段树把二叉搜索树建出来,然后在树上做下点分治就好了。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define lp (p<<1)
#define rp ((p<<1)|1)
using namespace std; int read_p,read_ca;
inline int read(){
read_p=;read_ca=getchar();
while(read_ca<''||read_ca>'') read_ca=getchar();
while(read_ca>=''&&read_ca<='') read_p=read_p*+read_ca-,read_ca=getchar();
return read_p;
}
struct na{int y,z,ne,k;}b[],B[];
int n,m,a[],x,y,l[],num=,de[],L[],Num=,s[],Si,ro,ma;
bool bo[];
long long mmh[][],S[][];
long long MMH=;
inline void in(int x,int y){b[++num].y=y;b[num].ne=l[x];l[x]=num;}
inline void In(int x,int y,int z,int k){B[++Num].y=y;B[Num].z=z;B[Num].k=k;B[Num].ne=L[x];L[x]=Num;}
struct tree{int ma,mi;}t[];
void add(int p,int l,int r,int v){
if (a[t[p].ma]<a[v]||t[p].ma==) t[p].ma=v;
if (a[t[p].mi]>a[v]||t[p].mi==) t[p].mi=v;
if (l==r) return;
int mid=l+r>>;
if (a[v]<=mid) add(lp,l,mid,v);else add(rp,mid+,r,v);
}
int quea(int p,int l,int r,int R){
if (R>=r) return t[p].ma;
int mid=l+r>>;
if (R<=mid) return quea(lp,l,mid,R);else if (mid=quea(rp,mid+,r,R)) return mid;else return t[lp].ma;
}
int quei(int p,int l,int r,int R){
if (R<=l) return t[p].mi;
int mid=l+r>>;
if (R>mid) return quei(rp,mid+,r,R);else if (mid=quei(lp,l,mid,R)) return mid;else return t[rp].mi;
}
void gs(int x,int f){
s[x]=;
int u=;
for (register int i=l[x];i;i=b[i].ne)
if (b[i].y!=f&&!bo[b[i].y]){
gs(b[i].y,x);
s[x]+=s[b[i].y];
if (u<s[b[i].y]) u=s[b[i].y];
}
if (Si-s[x]>u) u=Si-s[x];
if (u<ma) ma=u,ro=x;
}
void dfs(int x,int f,int r,int z,int k){
s[x]=;
In(x,r,z,k);
for (register int i=l[x];i;i=b[i].ne)
if (!bo[b[i].y]&&b[i].y!=f) dfs(b[i].y,x,r,z+,k),s[x]+=s[b[i].y];
}
void work(int x,int S){
Si=S;ma=1e9;gs(x,);bo[x=ro]=;
int u=;
for (register int i=l[x];i;i=b[i].ne) if (!bo[b[i].y]) dfs(b[i].y,x,x,,++u);In(x,x,,++u);
for (register int i=l[x];i;i=b[i].ne) if (!bo[b[i].y]) work(b[i].y,s[b[i].y]);
}
int main(){
register int i,j;
n=read();a[n+]=n+;add(,,n+,);add(,,n+,n+);
a[]=read();add(,,n+,);de[]=;
for (i=;i<=n;i++){
a[i]=read();
x=quea(,,n+,a[i]-);y=quei(,,n+,a[i]+);
if (de[x]>de[y]){
in(x,i);
in(i,x);
de[i]=de[x]+;
}else{
in(y,i);
in(i,y);
de[i]=de[y]+;
}
add(,,n+,i);
}
work(,n);
for (i=;i<=n;i++){
for (j=L[i];j;j=B[j].ne) MMH+=1LL*B[j].z*(S[B[j].y][]-S[B[j].y][B[j].k])+mmh[B[j].y][]-mmh[B[j].y][B[j].k],
mmh[B[j].y][]+=B[j].z,mmh[B[j].y][B[j].k]+=B[j].z,S[B[j].y][]++,S[B[j].y][B[j].k]++;
printf("%lld\n",MMH);
}
}

51 nod 1297 管理二叉树的更多相关文章

  1. 51nod 1297 管理二叉树

    一个初始为空的二叉搜索树T,以及1到N的一个排列P: {a1, a2, ..., aN}.我们向这个二叉搜索树T添加这些数,从a1开始, 接下来是 a2, ..., 以aN结束.在每一个添加操作后,输 ...

  2. 51 nod 1439 互质对(Moblus容斥)

    1439 互质对 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 有n个数字,a[1],a[2],…,a[n].有一个集合,刚开 ...

  3. 51 nod 1495 中国好区间

    1495 中国好区间 基准时间限制:0.7 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   阿尔法在玩一个游戏,阿尔法给出了一个长度为n的序列,他认为,一段好的区间,它的长度是& ...

  4. 51 nod 1427 文明 (并查集 + 树的直径)

    1427 文明 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 难度:6级算法题   安德鲁在玩一个叫“文明”的游戏.大妈正在帮助他. 这个游 ...

  5. 51 nod 1055 最长等差数列(dp)

    1055 最长等差数列 基准时间限制:2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题 N个不同的正整数,找出由这些数组成的最长的等差数列.     例如:1 3 5 6 8 9 ...

  6. 51 nod 1421 最大MOD值

    1421 最大MOD值 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有一个a数组,里面有n个整数.现在要从中找到两个数字(可以 ...

  7. 51 nod 1681 公共祖先 (主席树+dfs序)

    1681 公共祖先 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   有一个庞大的家族,共n人.已知这n个人的祖辈关系正好形成树形结构(即父亲向儿子连边). 在另 ...

  8. 51 nod 1766 树上的最远点对(线段树+lca)

    1766 树上的最远点对 基准时间限制:3 秒 空间限制:524288 KB 分值: 80 难度:5级算法题   n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间,表示点的标号请你求出两个 ...

  9. 51 nod 1405 树的距离之和

    1405 树的距离之和 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题   给定一棵无根树,假设它有n个节点,节点编号从1到n, 求任意两点之间的距离(最短路径)之 ...

随机推荐

  1. C# 委托与事件详解(三)

    今天我接着上面的3篇文章来讲一下,为什么我们在日常的编程活动中遇到这么多sender,EventArgs e 参数:protected void Page_Load(object sender, Ev ...

  2. iOS UIAlertController在Tableview中显示缓慢,迟钝,延迟

    在UITableViewCell中弹窗Alert延迟.在cellForRow中:cell.selectionStyle = UITableViewCellSelectionStyleNone; 或者在 ...

  3. 框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解)

    框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解) 一丶什么是RTTI,以及RTTI怎么设计 通过第一讲,我们知道了怎么样升成一个窗口了,以及简单的消息循环. 第二讲则是主要讲解RTTI ...

  4. Head First设计模式之生成器模式

    一.定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.建造者模式是一种对象创建型模式. 二.结构 角色 Builder(抽象建造者):它为创建一个产品Product对象的 ...

  5. sed中引用变量

    sed 中引用变量 eval sed 's/string/$REPLACE/g' file awk 中引用变量 awk 在匹配字符串的时候,有时候需要需要引用变量. $pid= eval " ...

  6. Qt Creator简单计算器的Demo

    小编在期末数据结构课设中遇到要做可视化界面的问题,特意去学习了一下Qt的用法,今天就来给大家分享一下. 我用的是Qt5.80,当然这只是一个简易的计算器Demo,,请大家勿喷. 首先我创建了一个Qt ...

  7. 固定表头,单元格td宽度自适应,多内容出现-横向纵向滚动条数据表格的<前世今生>

    固定表头,单元格td宽度自适应,多内容出现-横向纵向滚动条数据表格的<前世今生>     先上图例   & 无论多少数据--都完美! 背景:由于我司行业方向,需要很多数据报表,则t ...

  8. hadoop+hive+spark搭建(二)

    上传hive软件包到任意节点 一.安装hive软件 解压缩hive软件包到/usr/local/hadoop/目录下 重命名hive文件夹 在/etc/profile文件中添加环境变量 export ...

  9. linux中搭建solr集群出现org.apache.catalina.LifecycleException: Failed to initialize component ,解决办法

    07-Jan-2018 20:19:21.489 严重 [main] org.apache.catalina.core.StandardService.initInternal Failed to i ...

  10. 记一个CRenderTarget中的BUG及解决办法

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.问题描述 在MFC中使用Direct2D有现成的方法,在Visual Studio 2010 SP1及以上环境中MFC ...