幻想鄉一共有n處居所,編號從1到n。這些居所被n-1條邊連起來,形成了乙個樹形的結構。
每處居所都居住著乙個小精靈。每天小精靈們都會選出乙個區間[l,r],居所編號在這個區間內的小精靈一起來完成一項任務。
特別的,居所相鄰的(有邊相連的)兩個小精靈會自發的組成一隊,並且如果a和b相鄰b和c相鄰,那麼a和c也在同一隊裡面。每天的任務完成之後,隊伍就會解散;第二天再根據新的區間組成新的隊伍。
給出每天小精靈們選出的區間,你知道每天組成的隊伍數量嗎?
第一行兩個數n和q(1 <= n, q <= 100000),表示居所的數目和組隊的天數。
接下來n-1行,每行兩個數a和b,表示居所a和b之間有一條邊。
接下來q行,每行兩個數l和r,滿足1<=l<=r<=n,為該天小精靈選出的區間。
輸出q行,每行乙個整數表示該天隊伍的數量。
樣例輸入
3 1樣例輸出1 22 3
1 3
1草草看完題,媽媽我不會做啊。再看一遍,原來是一顆樹!
那麼乙個區間[l,r]的答案就是r-l+1-滿足l<=ui<=r&&l<=vi<=r的邊的數目。
那麼這就是乙個二維偏序模型,離線用個fenwich什麼的就行了。
#include#includeview code#include
#include
#include
#include
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using
namespace
std;
inline
intread()
const
int maxn=200010
;int
n,q,u[maxn],v[maxn],ans[maxn],e[maxn];
struct
query
}q[maxn];
int cmp(int x,int y)
intsumv[maxn];
int sum(int
x) void add(int x)
intmain() ;
q[i*2]=(query);
ans[i]=r-l+1
; }
q<<=1;int cur=0
; sort(q+1,q+q+1);sort(e+1,e+n,cmp);
rep(i,
1,q)
rep(i,
1,q>>1) printf("
%d\n
",ans[i]);
return0;
}
幻想鄉三連C 狂飆突進的幻想鄉
題解 不難發現,對於每一條從 s 到 t 的路徑,設其 x y 的和為 s x s y 其對答案的貢獻是 a cdot s x 1 a cdot s y 這是乙個關於 a 的一次函式。而所有的路徑就對應著許多 a in 0,1 直線,而不同 a 所對應的最短路長度恰好構成了這些直線的上凸殼,而求最短...
幻想鄉的符卡
靈夢和魔理沙即將展開彈幕大戰,為了提高實力,靈夢打算突擊學習一些符卡。每張符卡有三個屬性 火力 時長和等級。求勝心切的靈夢希望在一次戰鬥中,使用的符卡的火力值總和不小於 k 然而,由於一些特殊的原因,如果兩張符卡的時長之和是乙個質數,那麼它們便不能在一次戰鬥中同時使用。此外,如果符卡的等級超過了靈夢...
幻想鄉三連A 五顏六色的幻想鄉
非常直接地構造 由於答案與生成樹計數有關,所以一定要使用矩陣樹定理,但這樣就不能限制每種顏色的便使用的數量 我們構造 n 2 個關於 ans 的方程,列舉將紅色的邊拆成 x 條,將藍色的邊拆成 y 條,跑一遍矩陣樹定理,就得到 g sum limits sum limits ans cdot x i...