為了提高智商,zjy 準備去往乙個新世界去旅遊。這個世界的城市布局像一棵樹,每兩座城市之間只有一條路徑可以互達。
每座城市都有一種寶石,有一定的**。zjy 為了賺取最高利益,她會選擇從 a 城市**再轉手賣到 b 城市。
由於zjy買寶石時經常賣萌,因而凡是 zjy 路過的城市,這座城市的寶石**會**。讓我們來算算 zjy 旅遊完之後能夠賺取的最大利潤。(如 a 城市寶石**為 v,則zjy****也為 v)
第一行輸入乙個正整數 n 表示城市個數
接下來一行輸入 n 個正整數表示每座城市寶石的最初** p,每個寶石的初始**不超過 100。
第三行開始連續輸入 n-1 行,每行有兩個數字 x 和 y。表示 x 城市和 y 城市有一條路徑。城市編號從1開始。
下一行輸入乙個正整數 q 表示詢問次數。
接下來 q 行每行輸入三個正整數 a,b,v,表示 zjy 從 a 旅遊到 b,城市寶石** v。
對於每次詢問,輸出 zjy 可能獲得的最大利潤,如果虧本了則輸出 0。
31 2 3
1 22 3
21 2 100
1 3 10011
\(1 \le n,q \le 5 \times 10^4\)
洛谷首先考慮如何在序列上求最大差值順序對。用線段樹維護,每個節點中記錄區間最大值、最小值、順序對的最大差值(記為答案),合併時取兩個子區間的答案和右區間最大值減左區間最小值這兩者的最大值。再把這個做法移動到樹上。首先樹鏈剖分,對於一條路徑(u,v),我們可以把它拆分成u到lca和lca到v兩條路徑。對於u到lca的路徑,我們可以在跳重鏈時記錄前面所有重鏈中的最小值,然後用當前重鏈中的最大值減去這個最小值以及這條重鏈的答案更新總答案。對於lca到v的路徑,我們從v開始跳,記錄前面重鏈中的最大值,然後是一樣的道理。注意lca到v的路徑的方向是與u到lca的路徑相反的,所以線段樹維護時要同時維護順序對和逆序對(逆序對的維護可以參考順序對)。修改用樹鏈剖分即可。
#include #include #define n 50002
using namespace std;
struct node;
struct segmenttreet[n*4];
int head[n],ver[n*2],nxt[n*2],l;
int n,q,i,a[n],son[n],size[n],dep[n],fa[n],top[n],in[n],pos[n],cnt;
node operator + (node a,node b)
int read()
return w;
}void insert(int x,int y)
void dfs1(int x,int pre) }}
void dfs2(int x,int t)
}void update(int p)
void spread(int p)
}void build(int p,int l,int r)
void change(int p,int l,int r,int ql,int qr,int x)
spread(p);
int mid=(l+r)/2;
if(ql<=mid) change(p*2,l,mid,ql,qr,x);
if(qr>mid) change(p*2+1,mid+1,r,ql,qr,x);
update(p);
}node ask(int p,int l,int r,int ql,int qr)
; int mid=(l+r)/2;
node ans=(node);
spread(p);
if(ql<=mid) ans=ask(p*2,l,mid,ql,qr)+ans;
if(qr>mid) ans=ans+ask(p*2+1,mid+1,r,ql,qr);
return ans;
}int ask(int u,int v)
else
} if(dep[u]>dep[v])
else
return max(ans,maxx-minx);
}void change(int u,int v,int w)
if(dep[u]change(1,1,n,in[v],in[u],w);
}int main()
dfs1(1,0);dfs2(1,1);
build(1,1,n);
q=read();
while(q--)
return 0;
}
洛谷P3975 TJOI2015 弦論
題目大意 求乙個字串的第 k 大字串,t 表示長得一樣位置不同的字串是否算多個 題解 sam 先求出每個位置可以到達多少個字串 right 陣列 然後在轉移圖上 dp 若 t 1 初始值賦成 right 陣列大小,否則賦成 1 卡點 無 c code include include include ...
洛谷 P3978 TJOI2015 概率論
傳送門 題目描述 為了提高智商,zjy開始學習概率論。有一天,她想到了這樣乙個問題 對於一棵隨機生成的n個結點的有根二叉樹 所有互相不同構的形態等概率出現 它的葉子節點數的期望是多少呢?輸入格式 輸入乙個正整數n,表示有根樹的結點數 輸出格式 輸出這棵樹期望的葉子節點數,要求誤差小於1e 9 這是啥...
洛谷P3978 TJOI2015 概率論
傳送門 rqy太強啦 數學太差限制了我的想象力 我連卡特蘭數是什麼都不知道 姿勢不夠 令 f i 表示有 i 個節點的二叉樹的總個數,g i 表示 i 個節點的所有二叉樹的葉子總數,那麼答案就是 frac 不難發現 f n 的遞推式如下 f n sum f if 就是列舉左子樹里有幾個點,那麼右子樹...