2018山東一輪集訓 Tree

2022-06-03 08:06:12 字數 2203 閱讀 2556

為什麼出題人這麼毒瘤啊??!!乙個分塊還要帶log的題非要出成n<=2*1e5。。。。。。。

為了卡過最後兩個點我做了無數常數優化,包括但不限於:把所有線段樹改成 存差分的樹狀陣列;把樹剖求lca的極小的log優化成rmq o(1)求lca;根據測試情況手動調整siz的大小;

但就是死也卡不過去,算了算了qwq

(常規套路,先把1設成根建有根樹)

這個題的主要思路就是 對節點的下標分塊,設 f[i][j] 為 第i個塊內所有點到點j的距離和,然後看如何快速的動態維護這個玩意。。。。

發現改動一條邊權的時候,只有兩個點分別位於這條邊兩側的時候才會對它們之間的dis有影響。

我們設p為邊端點中更深的那個,那麼也就是乙個在p子樹內,乙個在子樹外的才有影響。。。。

於是我們對每個塊開乙個vector記錄一下這個塊內的點的dfs序集合,排完序之後就可以之間o(log)的查詢某個塊在一棵子樹內/外的點數了。。。

因為f的第一維比較小,所以我們可以暴力列舉第一維,然後對第二維進行快速的修改。。。。。這時候發現第二維如果是存dfs序的話會更加方便(子樹內可以直接進行區間修改),所以就改成下標代表dfs序啦。。。

對於整塊整塊的一些點到某個點的距離,用上述方法就行啦。。。可以發現都是區間修改單點查詢,所以用差分的樹狀陣列可以快(可能還不止)4倍常數哦。。。

查詢零散的點對(i,j)之間的距離的話更加簡單。。可以動態維護dis[i]表示i到根的距離(發現也是區間修改單點查詢,所以可以類似上述整塊的方法處理),答案就是dis[i]+dis[j]-2*dis[lca(i,j)]。。。

可能說起來不是很多吧qwq?但是要寫一輩子啊qwqwqwq。。。。

(我美好的下午就這麼沒了qwq)

話說我把樹剖求lca改成rmq之後反而更慢了qwq,這是什麼鬼啊。。。。

/*

inside : b * derta

outside : a * derta

all -> a * derta

inside -> (b-a) * derta

*/#include#include#include#include#include#include#include#define ll long long

using namespace std;

#define pb push_back

const int maxn=200003,n=205;

inline int read()

void w(ll x)

int n,m,t,dep[maxn],siz[maxn],cl[maxn];

int f[maxn],dc,dfn[maxn],dy[maxn],son[maxn];

int bl[maxn],num,val[maxn*2],uu,vv,ww;

int hd[maxn],ne[maxn*2],to[maxn*2];

ll ans=0,f[n][maxn];

vectorid[n];

char s[10];

void add(const int &x,const int &y,const int &z)

void update(const int &t,int x,const int &y)

ll query(const int &t,int x)

void fdfs(int x,int fa)

}void sdfs(int x,int tp)

inline int lca(int a,int b)

return dep[a]>dep[b]?b:a;

}inline int get(int t,int x)

inline void maintain(int o,int derta)

}inline ll calc(int qz,int p)

return an;

}inline void prework()

for(int i=1;i<=200;i++) sort(id[i].begin(),id[i].end());

for(int i=1;i

}inline void solve()

else }}

int main()

prework();

solve();

return 0;

}

2017 山東一輪集訓 Day4 基因

設定 sqrt 個關鍵點,維護出關鍵點到每個右端點之間的答案以及pam的左指標,每次暴力向左插入元素即可,為了去重,還需要記錄一下pam上每個節點在每個關鍵點為左端點插入到時候到最左邊出現位置,總複雜度 o n sqrt program by mangoyang pragma gcc optimiz...

2017 山東一輪集訓 Day7 逆序對

題解 滿滿的套路題。首先顯然從大到小列舉 然後每次生成的逆序對是1 i 1 的 這樣做dp是nk的 複雜度太高了 那我們轉化一下問題 變成sigma ai ai 據說是個經典問題。感覺非常奇妙 先容斥一下,也就是說 總的 至少1個條件不滿足 至少2個條件不滿足 那考慮一下如何算有x個條件不滿足 不滿...

2017 山東一輪集訓 Day6 重建

考試的時候以為兩者最短路差值的絕對值為 階梯拋物線 像這樣 可以二分,然而並沒有單峰性。不過騙了70分,混了個rank1,血賺 include.h define gt p1 p2 p2 p1 buf fread buf,1,1000000 stdin p1 p2 eof p1 define pt c...