點此看題面
大致題意:每次問你樹上兩點之間路徑中有多少種顏色,每次詢問可能會將一種顏色\(a\)看成\(b\)。
這題是一道樹上莫隊板子題。
畢竟求區間中有多少種不同的數是莫隊演算法的經典應用啊。
這操作其實很好處理。
只要判斷\(cnt_a\)和\(cnt_b\)是否同時\(>0\)即可。
但要注意特判\(a==b\)的情況。
#include#define n 50000
#define q 100000
#define add(x,y) (e[++ee].nxt=lnk[x],e[lnk[x]=ee].to=y)
#define swap(x,y) (x^=y^=x^=y)
using namespace std;
int n,query_tot,col[n+5];
int ee,lnk[n+5];
struct edge
e[(n<<1)+5];
class class_fio
}q[q+5];
public:
inline void solve()
for(sort(q+1,q+query_tot+1),i=1;i<=query_tot;++i)//處理詢問
for(i=1;i<=query_tot;++i) f.writeln(ans[i]);//輸出答案
}}c;
int main()
BZOJ 3757 蘋果樹 樹上莫隊
題目大意 給定一棵樹,每個節點有乙個顏色,多次求兩個節點的路徑上有多少種不同的顏色 其中還有兩個引數a和b,若蘋果樹上同時有這兩種顏色,ans 傳說中的樹上莫隊 顏色數既不滿足區間加法也不滿足區間減法,直接維護極其困難,這種東西就直接考慮莫隊好了 但是怎麼轉移是個問題 首先樹分塊 然後以左端點所在塊...
bzoj3757 蘋果樹 樹上莫隊
題目大意 給定一棵n nn個節點的樹,每個節點有乙個顏色a ia i ai 有m mm個詢問,每次給出u,v a,b u,v,a,b u,v,a,b,表示u uu到v vv的路徑上,把所有顏色a aa看成顏色b bb,求出有多少種顏色。詢問不會修改節點真實的顏色。n 50000.n 50000.n ...
BZOJ3757 蘋果樹 樹上莫隊
樹上莫隊共有三種寫法 1.按dfs序列分塊,和普通莫隊類似。常數大,不會被卡。2.按塊狀樹的方式分塊。常數小,會被菊花圖卡到o n 3.按 bzoj1086 王室聯邦的方式分塊。常數小,不會被卡。唯一的缺點是較抽象,乙個塊可能是不連通的。權衡一下當然還是寫第三種做法,具體看 然後還有乙個問題,手動模...