Ynoi2016 這是我自己發明的

2022-02-02 07:58:00 字數 1221 閱讀 4470

link

支援換根和給定兩個點,求子樹中滿足權值相同的方案數

換根操作和遙遠的國度一題類似,直接對應到 \(\rm\) 序上處理即可

後面的問題和 \(\texttt\) 類似

仍然使用子樹對應在 \(\rm\) 序上是一段連續區間,然後容斥得到下式

\[\sum_ ^ get(l_1-1,x)\times get(l_2-1,x)+get(r_1-1,x)\times get(r_2-1,x)-get(l_1-1,x)\times get(r_2,x)-get(r_1,x)\times get(l_2-1,x)

\]其中 \(get(l,v)\) 表示在 \([1,l]\) 區間中 \(x\) 出現的個數,此時可以移動指標來統計貢獻,可能和莫隊類似

推薦卡常數技巧:把沒有用的詢問都刪掉(就是\(l_1,l_2\) 和 \(1\) 或 \(0\) 比關係的時候)

const int n=5e5+10;

int a[n],b[n],m,n,t,bl[n],fa[n][25],dep[n],st[n],ed[n],head[n],cnt,tot,dfn,block,ans[n*5],p[n];

struct nodee[n<<1];

inline void add(int u,int v)

inline void dfs(int x,int fat)

}q[n*16];

int res,l=0,r=0,s1[n],s2[n],opt,rt=1,num;

inline void add1(int x)

inline void del1(int x)

inline void del2(int x)

inline void add2(int x)

int t1[10],t2[10],now,sz,x,y;

inline void calc(int x)

else if(!(st[x]<=st[rt]&&ed[rt]<=ed[x])) else}}

} for(int i=1;i<=tot;++i) if(q[i].l>q[i].r) swap(q[i].l,q[i].r);

sort(q+1,q+tot+1);

for(int i=1;i<=tot;++i)

for(int i=1;i<=num;++i) printf("%d\n",ans[i]);

return 0;

}

YNOI2016 這是我自己的發明

看到這個標題立刻想到 絕地科學家,八倍不屏息啊,八百里外把頭打啊.首先我們發現如果只考慮第二個操作,這棵樹就是假的,我們可以直接莫隊解決 如果考慮換根的話.可以把乙個操作換成小於等於9個操作就可以了 當然怎麼換,有一些非常噁心的分類討論 嚶嚶嚶ynoi 題是好題 但是要卡常 首先要fread fwr...

Ynoi2016 這是我自己的發明(莫隊)

話說這道題資料是不是都是鏈啊,我不手動擴棧就全 re 不過 a 了這題還是很爽的,通過昨晚到今天早上的奮鬥,終於肝出了這題 其實樓上說的也差不多了,就是把區間拆掉然後莫隊瞎搞 弱化版 bzoj snoi2017 乙個簡單的詢問 那我先講弱化版吧 可以發現 sum get l 1,r 1,x time...

Ynoi2016 鏡中的昆蟲

區間不用種類的數的個數。這個問題可以轉化為對每個點維護乙個 pre 詢問 l sim r 中,有多少個位置是在 0 sim l 1 之間的。這個問題可以用二維偏序做。然後對於區間賦值的操作,可以證明,如果我們找到所有有變化的位置並且把它改掉,它的總更改次數為 o n m 級別的。那具體實現可以用 s...