思路:
首先將所有的查詢有乙個vector儲存起來。我們從1號點開始dfs這顆二叉樹,用線段樹記錄到當前節點時,走左節點的有多少比要查詢該節點的x值小的,有多少大的,
同樣要記錄走右節點的有多少比x小的,多少比x大的。小和大的x,y值題目給了。當要進行左兒子時,建該節點值插入走左的線段樹,回退的時候將其刪除,進入右兒子時將其插入走右的線段樹,同樣回退時刪除。遍歷完乙個樹,整個查詢就做完了,最後輸出。
#include#include#include
#include
#include
#include
#define maxn 200100
#define lson(x) (x<<1)
#define rson(x) ((x<<1)+1)
#define mid ((tree[po].l+tree[po].r)>>1)
#define inf 100000000
using
namespace
std;
struct
query;
struct
aaans[maxn];
struct
treetree[maxn*20
];int head[maxn],e,w[maxn],index[maxn],flag=0
,l,r,lsum,rsum;
vector
query[maxn];
struct
edgeedge[maxn];
void buildtree(int l,int r,int
po)void insert(int val,int po,int
type)
if(type)
tree[po].rnum++;
else
tree[po].lnum++;
if(index[mid]>=val)
insert(val,lson(po),type);
else
insert(val,rson(po),type);
}void del(int val,int po,int
type)
if(type)
tree[po].rnum--;
else
tree[po].lnum--;
if(index[mid]>=val)
del(val,lson(po),type);
else
del(val,rson(po),type);
}void get_num(int val,int
po)
if(tree[po].l==tree[po].r)
get_num(val,lson(po));
get_num(val,rson(po));
}void
init()
}void add(int u,int
v)void dfs(int u)//
進行二叉樹遍歷
ans[query[u][i].i].y+=l*3
; ans[query[u][i].i].y+=lsum-l;
ans[query[u][i].i].y+=r*3
; ans[query[u][i].i].y+=rsum-r;
ans[query[u][i].i].x+=r;
}int f=0
;
for(i=head[u];i!=-1;i=edge[i].next)
else
f++;
dfs(edge[i].v);
if(f==2
)
else
}}int
main()
sort(index+1,index+n+1
); num=1
;
for(i=2;i<=n;i++)//
將座標離散化
if(index[i]>index[num])
index[++num]=index[i];
buildtree(
1,num,1);//
建立線段樹
scanf("
%d",&m);
for(i=1;i<=m;i++)
scanf("%d
",&q);
query temp;
intv;
for(i=1;i<=q;i++)//
將所有查詢儲存起來
int f=0;//
標記走左還是右
for(i=head[1];i!=-1;i=edge[i].next)//
從1號節點開始遍歷
else
f++;
dfs(edge[i].v);
if(f==2
)
else
}for(i=1;i<=q;i++)
}return0;
}
二叉樹 滿二叉樹與完全二叉樹
二叉樹 binary tree 是n n 0 個元素的有限集合,該集合為空或者為由乙個稱為 根 的元素及兩個不相交的 被分別稱為左子樹和右子樹的二叉樹組成 二叉樹的基本特點 每個結點最多有兩棵子樹 左子樹和右子樹是有順序的,且不可顛倒 圖一1 結點 二叉樹中的每乙個元素都稱為結點。通常二叉樹的許多名...
hdu1710(二叉樹的歷遍)
題意 依次給出二叉樹的前序歷遍和中序歷遍,要你輸出它的後序歷遍。感嘆 這個題目,我不得不感慨用遞迴解決二叉樹的問題真心碉堡了。也不得不感嘆,自己還是太水了,記得以前我的乙個學長做這個題目,沒超過十分鐘後就ac了。思路 用遞迴做的巨集觀思路很簡單,就是結合前序歷遍和中序歷遍,找根節點,在中序歷遍中,根...
hdu1710(二叉樹的歷遍)
題意 依次給出二叉樹的前序歷遍和中序歷遍,要你輸出它的後序歷遍。感嘆 這個題目,我不得不感慨用遞迴解決二叉樹的問題真心碉堡了。也不得不感嘆,自己還是太水了,記得以前我的乙個學長做這個題目,沒超過十分鐘後就ac了。思路 用遞迴做的巨集觀思路很簡單,就是結合前序歷遍和中序歷遍,找根節點,在中序歷遍中,根...