51 nod 1297 管理二叉树
原题链接: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 管理二叉树的更多相关文章
- 51nod 1297 管理二叉树
一个初始为空的二叉搜索树T,以及1到N的一个排列P: {a1, a2, ..., aN}.我们向这个二叉搜索树T添加这些数,从a1开始, 接下来是 a2, ..., 以aN结束.在每一个添加操作后,输 ...
- 51 nod 1439 互质对(Moblus容斥)
1439 互质对 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 有n个数字,a[1],a[2],…,a[n].有一个集合,刚开 ...
- 51 nod 1495 中国好区间
1495 中国好区间 基准时间限制:0.7 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 阿尔法在玩一个游戏,阿尔法给出了一个长度为n的序列,他认为,一段好的区间,它的长度是& ...
- 51 nod 1427 文明 (并查集 + 树的直径)
1427 文明 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 安德鲁在玩一个叫“文明”的游戏.大妈正在帮助他. 这个游 ...
- 51 nod 1055 最长等差数列(dp)
1055 最长等差数列 基准时间限制:2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题 N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 6 8 9 ...
- 51 nod 1421 最大MOD值
1421 最大MOD值 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有一个a数组,里面有n个整数.现在要从中找到两个数字(可以 ...
- 51 nod 1681 公共祖先 (主席树+dfs序)
1681 公共祖先 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有一个庞大的家族,共n人.已知这n个人的祖辈关系正好形成树形结构(即父亲向儿子连边). 在另 ...
- 51 nod 1766 树上的最远点对(线段树+lca)
1766 树上的最远点对 基准时间限制:3 秒 空间限制:524288 KB 分值: 80 难度:5级算法题 n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间,表示点的标号请你求出两个 ...
- 51 nod 1405 树的距离之和
1405 树的距离之和 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给定一棵无根树,假设它有n个节点,节点编号从1到n, 求任意两点之间的距离(最短路径)之 ...
随机推荐
- 【java API基本实现】ArrayList
ArrayList: package com.tn.arraylist; public class ArrayList { Object[] objects=new Object[10]; int i ...
- iOS 类似2048、4096小游戏-OC
大概思路(初步制作,粗工制造):demo 1.Collection 创建cell 2.cell上添加一个view,用来添加手势 3.字典用来存放数据->每次执行StarGame数组接收没有数字的 ...
- iOS cocos2d游戏引擎的了解之一
ios游戏引擎之Cocos2d(一) cocos2d是一个免费开源的ios游戏开发引擎,并且完全采用object-c进行编写,这对于已经用惯object-c进行ios应用开发的童鞋来说非常容易上手.这 ...
- C语言中一些不被熟知的特性
designated initializers(c99) C99允许你对结构体中指定的变量初始化,如 struct Foo { int x; int y; int z; }; }; 指定初始化也可适用 ...
- C# TreeView 控件的综合使用方法
1.概述 该篇文章开发使用的语言c#,环境visualstudio2010,sql数据库.主要内容包括: (1)treeView控件添加根节点.子节点的基本方法,节点的删除. (2)把treeView ...
- BGP网络学习总结
1.前言 云计算在中国发展越来越快,企业逐步开始将业务迁移到公有云中,方便运维,节省成本.公有云最复杂的地方是网络,客户对网络的需求千奇百怪,造成网络环境极其复杂,稍有不慎,就会出现网络连通性 ...
- bzoj 2588 Count on a tree
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...
- 开发过程遇到的bug
1.transition和display的冲突: 解决方法:1)使用visibility:2)使用js的setTimeout使动画延迟:3)可以改变高度: 2.form表单提交和js中的提交冲突 解决 ...
- js文件加载优化
在js引擎部分,我们可以了解到,当渲染引擎解析到script标签时,会将控制权给JS引擎,如果script加载的是外部资源,则需要等待下载完后才能执行. 所以,在这里,我们可以对其进行很多优化工作. ...
- 关于vs2010下水晶报表的使用入门
关于vs2010下使用水晶报表了解情况记录如下: 1.首先vs2010不再自带水晶报表控件了,需要下载安装vs2010配套的水晶报表控件:CRforVS_13_0.这个控件安装很简单,基本上都选择默认 ...