小白逛公園加強版 park

2021-08-24 17:29:04 字數 2449 閱讀 8870

小新經常陪小白去公園玩,也就是所謂的遛狗啦……在小新家附近有n個公園,這些公園通過一些路徑相連,並保證每兩個公園之間有且僅有一條通路相連(也就是說這是一棵樹),小白早就看花了眼,自己也不清楚該去哪些公園玩了。

小白對每個公園都有乙個評價(可正可負),並且它只會讓小新做兩件事:

1. 詢問公園a到公園b路徑上最大連續公園的評價和,就是說我們把公園a到公園b路徑上的公園(包括a和b)排成一條直線,那麼小白希望知道一段連續的公園的評價和最大為多少。

2. 修改公園a到公園b路徑上(包括a和b)每個公園的評價值。

小新現在已經處理不了n超過10的情況,因此請你來幫忙……

第一行有乙個自然數,表示n

第二行有n個自然數,表示一開始小白對每個公園的評價(評價值的絕對值不超過10000)

下面有n-1行,每行兩個數a和b,表示公園a和公園b直接由道路相連

再下面一行有乙個自然數,表示m

最後m行,每行第乙個數k表示要執行的操作。如果k為1,那麼後面有兩個自然數a和b,表示詢問公園a到公園b路徑上(包含a和b)最大的連續公園評價和(如果這條路徑上每個公園的評價都為負數,那麼最大連續和為0)。如果k為2,那麼後面有三個自然數a、b和c,表示把公園a到公園b路徑上所有的公園(包括a和b)的評價都修改為c。(c的絕對值不超過10000)

對於每次詢問,輸出最大連續和。(每行乙個)

5

-3 -2 1 2 3

1 22 3

1 44 5

31 2 5

2 3 4 2

1 2 5

5

9

對於30%的資料:n,m <= 100

對於70%的資料:n,m <= 50000

對於100%的資料:n,m <= 100000

solution

先寫個樹剖,轉化為區間問題。

考慮如何求一段區間權值和最大的連續子串行

lm:從左開始的最大值

rm:從右開始的最大值

x:中間的最大值(包括兩邊)

sum:和

這樣就可以維護了

void wh(int k)
#include#include#include#include#include#include#define maxn 100005

#define inf 1e9

using namespace std;

int n,m,head[maxn],son[maxn],fa[maxn],size[maxn],top[maxn],deep[maxn];

int dfn[maxn],dy[maxn],sc,t1,t2,tot,w[maxn],op,a,b,c,li,ri,ans;

struct nodetree[maxn*4],ansa,ansb;

struct noe[maxn*2];

void lj(int t1,int t2)

void dfs1(int k,int fath)

}size[k]=sz+1;son[k]=gp;

}void dfs2(int k)

}}void wh(int k)

void update(int k,int v)

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

int mid=l+r>>1;

build(k*2,l,mid);build(k*2+1,mid+1,r);

wh(k);

}node hb(node a,node b)

void down(int k)

}node ask(int k)

down(k);

int mid=tree[k].l+tree[k].r>>1;

node now;now.x=-1e9;now.lm=now.rm=now.sum=0;

if(li<=mid)now=ask(k*2);

if(ri>mid)now=hb(now,ask(k*2+1));

return now;

}void lian(int k)

down(k);

int mid=tree[k].l+tree[k].r>>1;

if(li<=mid)lian(k*2);

if(ri>mid)lian(k*2+1);

wh(k);

}int main()

else

}if(deep[a]else

ans=max(ansa.x,ansb.x);

ans=max(ans,ansa.lm+ansb.lm);

printf("%d\n",max(ans,0));

}else

if(deep[a]li=dfn[b],ri=dfn[a];

lian(1);}}

return 0;

}

小白逛公園加強版 park

小新經常陪小白去公園玩,也就是所謂的遛狗啦 在小新家附近有n個公園,這些公園通過一些路徑相連,並保證每兩個公園之間有且僅有一條通路相連 也就是說這是一棵樹 小白早就看花了眼,自己也不清楚該去哪些公園玩了。小白對每個公園都有乙個評價 可正可負 並且它只會讓小新做兩件事 1.詢問公園a到公園b路徑上最大...

小白逛公園

描述 小新經常陪小白去公園玩,也就是所謂的遛狗啦 在小新家附近有一條 公園路 路的一邊從南到北依次排著n個公園,小白早就看花了眼,自己也不清楚該去哪些公園玩了。一開始,小白就根據公園的風景給每個公園打了分 小新為了省事,每次遛狗的時候都會事先規定乙個範圍,小白只可以選擇第a個和第b個公園之間 包括a...

小白逛公園

小白逛公園 time limit 20000ms memory limit 65536k case time limit 2000ms description 小新經常陪小白去公園玩,也就是所謂的遛狗啦 在小新家附近有一條 公園路 路的一邊從南到北依次排著n個公園,小白早就看花了眼,自己也不清楚該去...