小新經常陪小白去公園玩,也就是所謂的遛狗啦……在小新家附近有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個公園,小白早就看花了眼,自己也不清楚該去...