hiho 1145 幻想鄉的日常

2022-05-04 00:57:08 字數 1474 閱讀 1988

幻想鄉一共有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#include

#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;

}

view code

幻想鄉三連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...