GXOI GZOI2019 舊詞 解題報告

2022-04-29 04:45:08 字數 1469 閱讀 2339

對於一棵 \(n\) 個節點的樹,給出 \(m\) 次詢問和常數 \(k\) ,每次給出 \(r,x\) ,求 \(\sum\limits_^r depth(lca(i,x))^k\) 。

\(n,m\le 5\times 10^4 , 1\le r,x\le n , k\le 10^9\)

如果有做過[lnoi2014]lca,就很容易想出解法。

可以通過樹上差分,點 \(x\) 的權值為 \(depth(x)^k-(depth(x)-1)^k\) ,那麼對於乙個點的深度的 \(k\) 次方就等於該點到根的路徑上的所有點的權值之和。

可以將詢問離線,按照 \(r\) 排序,依次修改 \(1\) 到 \(n\) 的點到根的點權,每次修改就是將 \(x\) 點加上 \(depth(x)^k-(depth(x)-1)^k\) ,那麼對於相應的 \(r\) ,查詢 \(x\) 到根的路徑上的所有點的權值之和就是答案了。

可以通過樹剖+線段樹解決,效率 \(\mathcal\) ,精細實現可以做到 \(\mathcal\) 。

#includeusing namespace std;

#define int long long

const int m=5e5+5,jyy=998244353;

void swap(int &x,int &y)

int min(int x,int y)

int n,q,k,mi[m],fa[m],de[m],ans[m];

int read()

while(ch>='0'&&ch<='9')

return x*y;

}int tot=0,first[m];

struct edgee[m<<1];

void add(int x,int y)

int num=0,dfn[m],pre[m],son[m],top[m],size[m];

struct treetr[m<<2];

void pushup(int u)

void pushdown(int u)

void build(int u,int l,int r)

void change(int u,int l,int r,int l,int r,int x)

int query(int u,int l,int r,int l,int r)

void dfs1(int u)

struct quesq[m];

bool cmp(ques x,ques y)

void solve();

} sort(q+1,q+q+1,cmp);

// for(int i=1;i<=2*q;i++)

for(int i=1,now=0;i<=q;i++)

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

}signed main()

GXOI GZOI2019 逼死強迫症

傳送門 to luogu 將道路看成乙個很高很瘦的傢伙 乙個 n 2 n times 2 n 2 的瘦高個 考慮最後一行 或者說,第一行 是什麼情況。用 f n f n f n 表示答案。不好搞定的是第三種情況。下面都只討論第三種情況。如圖。不妨設第一行的 1 1 1 times 1 1 1 磚塊在...

題解 GXOI GZOI2019 旅行者

調這個題調了兩個月,被自己蠢哭 給乙個有向圖,一組關鍵點,求關鍵點之間的最短的距離 這個題目有兩種做法,分別是 nlogn 和 nlog 2n 的 首先說 nlogn 的官方做法,我們考慮多源迪傑斯特拉 正圖上從 k 個關鍵點出發跑 dijkstra 記某個點離最近的關鍵點距離為 dis 0 i 反...

GXOI GZOI2019 旅行者 (最短路)

給定乙個有向圖,其中一些頂點為關鍵點。求這些關鍵點兩兩之間最小距離。考試時沒怎麼想寫了50分暴力走了。以為是什麼強連通分量的解法,結果就是個最短路。直接從關鍵點跑一次最短路dis 0 再把圖反向在跑一次最短路dis 1 跑最短路的時候記錄起點col 0 1 那麼最後直接列舉一條邊 x,y,w 當co...