BZOJ5457 城市(線段樹合併)

2022-05-14 14:12:23 字數 1157 閱讀 2965

點此看題面

大致題意:一棵樹上每個點有顏色\(a_i\)和權值\(b_i\),求以每個點為根的子樹內權值和最大的顏色及其權值和。

這是一道線段樹合併板子題。

(關於線段樹合併,可參考我的這篇部落格)

重複此過程即可求出答案。

注意當有多種顏色權值和相同時輸出編號最小的顏色,一開始判錯\(wa\)了好幾發。

#include#define tp template#define ts template#define reg register

#define ri reg int

#define con const

#define ci con int&

#define i inline

#define w while

#define n 400000

#define ln 20

#define add(x,y) (e[++ee].nxt=lnk[x],e[lnk[x]=ee].to=y)

#define mp make_pair

#define fir first

#define sec second

using namespace std;

int n,m,ee,a[n+5],b[n+5],lnk[n+5],rt[n+5],ans1[n+5],ans2[n+5];

struct edge e[n<<1];typedef pairpr;

class fastio

tp i void read(ty& x)

ts i void read(ty& x,ar&... y)

tp i void write(ty x)

tp i void write(con ty& x,con char& y)

i void clear()

}f;class segmenttree//動態開點線段樹

i void update(ci l,ci r,int& rt,ci x,ci v)//修改

i pr query(ci rt) //詢問

}s;i void dfs(ci x,ci lst)//dfs遍歷樹

int main()

BZOJ 4756 線段樹合併(線段樹)

思路 1.最裸的線段樹合併 2.我們可以觀察到子樹求乙個東西 那我們直接dfs序好了 入隊的時候統計一下有多少比他大的 出的時候統計一下 減一下 搞定 線段樹合併 by siriusren include include include using namespace std const int n...

bzoj 2212(線段樹合併)

傳送門 題解 權值線段樹從下往上合併,每個點統計兩個兒子中某乙個交換 不交換的答案,取min後加到總答案中。不禁讓人想起cdqz challenge 13 p.s.形態樹開兩倍空間,因為這種讀入方式肯定會讀成一棵滿二叉樹 不管存不存在子節點先加了時間戳 另外,定義變數要搞清楚哪個是輸入的形態樹,哪個...

bzoj2212(線段樹合併)

description 現在有一棵二叉樹,所有非葉子節點都有兩個孩子。在每個葉子節點上有乙個權值 有n個葉子節點,滿足這些權值為1 n的乙個排列 可以任意交換每個非葉子節點的左右孩子。要求進行一系列交換,使得最終所有葉子節點的權值按照遍歷序寫出來,逆序對個數最少。input 第一行n 下面每行,乙個...