WC2013 糖果公園

2022-02-27 11:20:15 字數 3762 閱讀 8288

candyland 有一座糖果公園,公園裡不僅有美麗的風景、好玩的遊樂專案,還有許多免費糖果的發放點,這引來了許多貪吃的小朋友來糖果公園玩。

糖果公園的結構十分奇特,它由 n

'>n

n 個遊覽點構成,每個遊覽點都有乙個糖果發放處,我們可以依次將遊覽點編號為 1

'>1

1 至 n

'>n

n。有 n−1

'>n−1

n−1 條雙向道路連線著這些遊覽點,並且整個糖果公園都是連通的,即從任何乙個遊覽點出發都可以通過這些道路到達公園裡的所有其它遊覽點。

糖果公園所發放的糖果種類非常豐富,總共 m

'>m

m 種,它們的編號依次為 1

'>1

1 至 m

'>m

m。每乙個糖果發放處都只發放某種特定的糖果,我們用 c

i'>ci

ci 來表示 i

'>i

i 號遊覽點的糖果。

大家對不同型別的糖果的喜愛程度都不盡相同。根據遊客們的反饋打分,我們得到了糖果的美味指數,第 i

'>i

i 種糖果的美味指數為 v

i'>vi

vi。另外,如果一位遊客反覆地品嚐同一種類的糖果,他肯定會覺得有一些膩。根據量化統計,我們得到了遊客第 i

'>i

i 次品嚐某類糖果的新奇指數 w

i'>wi

wi,如果一位遊客第 i

'>i

i 次品嚐第 j

'>j

j 種糖果,那麼他的愉悅指數 h

'>h

h 將會增加對應的美味指數與新奇指數的乘積,即 vjw

i'>vjwi

vjwi。這位遊客遊覽公園的愉悅指數最終將是這些乘積的和。

當然,公園中每個糖果發放點所發放的糖果種類不一定是一成不變的。有時,一些糖果點所發放的糖果種類可能會更改(也只會是 m

'>m

m 種中的一種),這樣的目的是能夠讓遊客們總是感受到驚喜。

糖果公園的工作人員小 a 接到了乙個任務,那就是根據公園最近的資料統計出每位遊客遊玩公園的愉悅指數。但數學不好的小 a 一看到密密麻麻的數字就覺得頭暈,作為小 a 最好的朋友,你決定幫他一把。

第一行包含三個正整數 n,m

,q'>n,m,q

n,m,q,分別表示遊覽點個數、糖果種類數和操作次數。

第二行包含 m

'>m

m 個正整數 v1,

v2,…

,vm'>v1,v2,…,vm

v1,v2,…,vm。

第三行包含 n

'>n

n 個正整數 w1,

w2,…

,wn'>w1,w2,…,wn

w1,w2,…,wn。

第四行到第 n+2

'>n+2

n+2 行,每行包含兩個正整數 ai,

bi'>ai,bi

ai,bi,表示這兩個遊覽點之間有路徑可以直接到達。

第 n+

3'>n+3

n+3 行包含 n

'>n

n 個正整數 c1,

c2,…

,cn'>c1,c2,…,cn

c1,c2,…,cn。

接下來 q

'>q

q 行,每行包含三個整數 t,x

,y'>t,x,y

t,x,y,表示一次操作:

若 t'>t

t 為 0

'>0

0,則 1≤x

≤n'>1≤x≤n

1≤x≤n,1≤y

≤m'>1≤y≤m

1≤y≤m,表示編號為 x

'>x

x 的遊覽點發放的糖果型別改為 y

'>y

y;若 t

'>t

t 為 1

'>1

1,則 1≤x

,y≤n

'>1≤x,y≤n

1≤x,y≤n,表示對出發點為 x

'>x

x,終止點為 y

'>y

y 的路線詢問愉悅指數。

按照輸入的先後順序,對於每個 t

'>t

t 為 1

'>1

1 的操作輸出一行,用乙個正整數表示答案。

input

4 3 5

1 9 2

7 6 5 1

2 33 1

3 41 2 3 2

1 1 2

1 4 2

0 2 1

1 1 2

1 4 2

output
84

13127

84bzoj沒有許可權號的小朋友只能去uoj辣!

樹上莫隊,我是先膜的黃學長**才會寫的……

然後壓了幾發常數,都沒有第一次交快 =_= 天生自帶大常數。。。

#include#include

#define ll long long

#define m 100001

using

namespace

std;

intread_p,read_ca;

inline

intread()

int n,m,c[m],p[m],to=0,fa[m][30],l[m],d[m],num=0,nm=0,knm=0,be[m],de[m],q,nas=0,nch=0

,pre[m],ti[m];

ll an=0

,ans[m],v[m],w[m];

bool

vi[m];

struct

nab[

2*m+10

];const

int ku=1000

;inline

void

in(int x,int

y)inline

void dfs(int

x) }

p[++to]=x;

}struct

askba[m];

struct

asbc[m];

inline

bool

cmp(ask x,ask y)

inline

void xo(int x)

inline

void work(int x,int y)

inline

void cha(int x,int y)

inline

int lca(int x,int

y)int

main()

else

}sort(ba+1,ba+1+nas,cmp);

for (i=1;i<=ba[1].t;i++) cha(bc[i].x,bc[i].y);

work(ba[

1].x,ba[1

].y);

o=lca(ba[1].x,ba[1

].y);

xo(o);ans[ba[

1].id]=an;xo(o);

for (i=2;i<=nas;i++)

for (i=1;i<=nas;i++) printf("

%lld\n

",ans[i]);

}

view code

uoj 58 WC2013 糖果公園

寒假裡lbn大爺講離線演算法時就講過了。然而現在才明白該怎麼做。這題就是樹上帶修莫隊,帶修莫隊就是再加一維時間,然後分塊size n 2 3 時間複雜度o n 1.67 樹上莫隊可以先求出括號序列,若x為y祖先,則兩點間的路徑為l x l y 否則就是r x l y lca。沒了。include i...

BZOJ 3052 wc2013 糖果公園

蒟蒻去做糖果公園了qaq 講道理速度能排rk11很開心啊 其實前人之述備矣 複雜度分析 推薦一波棟爺爺的題解 帶修改莫隊其實就是多一維時間 所以你需要資瓷修改和撤銷修改 然後就跟沒修改的莫隊其實差不多了 關於樹上莫隊 很明顯就是用dfs序這個套路 發現出現次數為奇數次的才會算到 棟老師題解那裡也有說...

BZOJ 3052 wc2013 糖果公園

讀題很容易知道這就是一道簡單的樹上帶修改莫隊,樹上待修改莫隊只要將待修改莫隊和樹上莫隊結合起來使用就可以了。感謝darkbzoj include include include include include include include include set include include i...