傲嬌少女幽香正在玩乙個非常有趣的戰略類遊戲,本來這個遊戲的地圖其實還不算太大,幽香還能管得過來,但是不知道為什麼現在的網遊廠商把遊戲的地圖越做越大,以至於幽香一眼根本看不過來,更別說和別人打仗了。 在打仗之前,幽香現在面臨乙個非常基本的管理問題需要解決。 整個地圖是乙個樹結構,一共有n塊空地,這些空地被n-1條帶權邊連線起來,使得每兩個點之間有一條唯一的路徑將它們連線起來。在遊戲中,幽香可能在空地上增加或者減少一些軍隊。同時,幽香可以在乙個空地上放置乙個補給站。 如果補給站在點u上,並且空地v上有dv個單位的軍隊,那麼幽香每天就要花費dv×dist(u,v)的金錢來補給這些軍隊。由於幽香需要補給所有的軍隊,因此幽香總共就要花費為sigma(dv*dist(u,v),其中1<=v<=n)的代價。其中dist(u,v)表示u個v在樹上的距離(唯一路徑的權和)。 因為遊戲的規定,幽香只能選擇乙個空地作為補給站。在遊戲的過程中,幽香可能會在某些空地上製造一些軍隊,也可能會減少某些空地上的軍隊,進行了這樣的操作以後,出於經濟上的考慮,幽香往往可以移動他的補給站從而省一些錢。但是由於這個遊戲的地圖是在太大了,幽香無法輕易的進行最優的安排,你能幫幫她嗎? 你可以假定一開始所有空地上都沒有軍隊。
第一行兩個數n和q分別表示樹的點數和幽香操作的個數,其中點從1到n標號。 接下來n-1行,每行三個正整數a,b,c,表示a和b之間有一條邊權為c的邊。 接下來q行,每行兩個數u,e,表示幽香在點u上放了e單位個軍隊(如果e<0,就相當於是幽香在u上減少了|e|單位個軍隊,說白了就是du←du+e)。資料保證任何時刻每個點上的軍隊數量都是非負的。
對於幽香的每個操作,輸出操作完成以後,每天的最小花費,也即如果幽香選擇最優的補給點進行補給時的花費。
題解 :
構造點分樹,記錄每個點管轄子樹的大小vc,這個點管轄子樹內所有點到這個點的費用和cos和這個子樹對上一級重心費用的貢獻scos
每次修改直接點分樹上修改
查詢乙個點,如果該點最大子樹的大小大於全圖一半,就把這個點除了最大子樹外的部分貼到那個子樹裡對應的點上再遞迴去查詢那個子樹
如果最大子樹也小於全圖一半,那麼這個點就是當前圖的重心,答案就是cos
原題有限制每個點度數不大於20,如果去掉這個限制可以套個線段樹,複雜度多個log
** :
#include#define pa pair#define inf 0x3f3f3f3fview code#define ll long long
using
namespace
std;
inline
int _max(int a,int b)
#define maxn 100005
intn,m;
inthead[maxn],cnt;
struct
edgee[maxn
<<1
];inline
void insert(int a,int b,int
c) bool vis[maxn];int sz[maxn],weight[2
];void findw(int v,int
all)
}sz[v]++;mx=_max(mx,all-sz[v]);
if(weight[0]>mx) weight[0]=mx,weight[1]=v;
vis[v]=0;}
int anc[maxn][26],len[maxn],to[maxn],tdis[maxn];ll dis[maxn][26
];void comp(int v,int anc,int
d) }
sz[v]++;vis[v]=0;}
void solve(int
w) }
}ll vc[maxn],cos[maxn],scos[maxn],all;
inline
void modify(int x,int
y) }
void change(int x,int sp,ll v,ll c,int
fx)
}ll query(
int v,int
d)
else
return
cos[v];
}int
main()
weight[
0]=inf;findw(1
,n);
comp(weight[
1],weight[1],0
); solve(weight[
1]);
for(int x,y,i=1;i<=m;i++)
return0;
}
bzoj3924幻想鄉戰略遊戲
今天一整天都感覺有點心神不定。這題我的寫法是跟kczno1大爺的寫法一樣。然後覺得點分治複雜度跟度數有關,是不對的。那標算還點分治?在洛谷上ac後,又在bzoj上交了一發,好像是rk10?接著就發現原版題面裡有一句話 每個點的度數不超過20 真想 出題人。include include includ...
bzoj 5010 Fjoi2017 矩陣填數
給定乙個 h w 的矩陣,矩陣的行編號從上到下依次為 1.h,列編號從左到右依次1.w。在這個矩陣中你需要在每 個格仔中填入 1.m 中的某個數。給這個矩陣填數的時候有一些限制,給定 n 個該矩陣的子矩陣,以及該子矩陣的 最大值 v,要求你所填的方案滿足該子矩陣的最大值為 v。現在,你的任務是求出有...
bzoj5010 FJOI2017 矩陣填數
給定乙個 h w 的矩陣,矩陣的行編號從上到下依次為 1.h,列編號從左到右依次1.w。在這個矩陣中你需要在每 個格仔中填入 1.m 中的某個數。給這個矩陣填數的時候有一些限制,給定 n 個該矩陣的子矩陣,以及該子矩陣的 最大值 v,要求你所填的方案滿足該子矩陣的最大值為 v。現在,你的任務是求出有...