叉姐的題 看了看聊天記錄發現自己光調就是至少兩個多小時...不過慢慢來吧 嚴格意義上講是自從上學期final week以來復健的第一道大資料結構題...其實寒假因為突擊駕照的緣故也荒廢掉很多時間...
題意其實很簡明扼要: 兩種操作 改變樹上某個點的權值 或者 詢問在某個點d距離範圍內的所有權值和
其實不論考不考慮權值 這道題對我來說都是不好寫的 畢竟權值在這裡就是要求乙個樹狀陣列而已
最大的困難還是來自於 要層層統計root貢獻的時候 去重以及正確記錄當前點與rt的距離!
mark幾個我wa的地方(在拍std的情況下改的還算順利):
add&sum頭一昏雙雙寫錯
記憶體超限/不夠 據說subrt是要開nlogn的 不過100w將將也能過吧
建立一套新邊表的時候時刻注意變數名...
是divide(root)而不是divide(v)
給vector init深度的時候保險起見還是要resize sum...畢竟重心只由個數決定...與深度沒有絕對關係...
#include#include#include#include#define mo 1000000007
#define n 202020
#define m 4004040
#define ll long long
using namespace std;
int edgenum,head[n],jie[n],maxx[m],vet[n],size[n];
int edgenew,headnew[n],jienew[m],vetnew[m],pri[m],id[m],maxd[n],disrt[n];
int n,q,nowd,sum,root,f[n],flag[n],a[n],nows;
struct tree
void add(int k,int x)
int sum(int k)
};tree t[n];tree subt[1001010];
void getroot(int u,int ff,int dep)
e=jie[e];
}f[u]=max(f[u],sum-size[u]);
if(f[u]0)
e=jie[e];
}}void insnew(int anc,int u,int subroot,int id,int ff,int dep)
e=jie[e];
}}void divide(int u)
e=jie[e];
}e=head[u];
while(e>0)
e=jie[e];
}return;
}int main()
a[u]=d;
}else
printf("%d\n",ans);}}
}return 0;
}
過段時間要去找claris的題刷 明天先把dp題補完然後把legilimens去年的模擬題更掉 HDU 5324(分治 樹狀陣列)
本題目的原來意思是,給定兩個長度為n的陣列,l,r,要求乙個子串行 可以不連續 使的l遞減,r遞增。分析 加上下標遞增,兩個維度增,乙個減,那麼考慮 d i 代表以i為起點的串往後找能得到的最大長度,用分治方法更新最有值。那麼下面說一下,怎麼分治維護最優。首先,陣列原順序保持不變,就是下標遞增,對於...
Luogu3806 點分治(點分治)
給定一棵有n個點的樹 詢問樹上距離為k的點對是否存在。n,m 接下來n 1條邊a,b,c描述a到b有一條長度為c的路徑 接下來m行每行詢問乙個k 對於每個k每行輸出乙個答案,存在輸出 aye 否則輸出 nay 不包含引號 點分治的模板題目,不做過多的解釋 據我這個蒟蒻的觀察 這道題的複雜度是o n2...
Luogu3806 點分治(點分治)
給定一棵有n個點的樹 詢問樹上距離為k的點對是否存在。n,m 接下來n 1條邊a,b,c描述a到b有一條長度為c的路徑 接下來m行每行詢問乙個k 對於每個k每行輸出乙個答案,存在輸出 aye 否則輸出 nay 不包含引號 點分治的模板題目,不做過多的解釋 據我這個蒟蒻的觀察 這道題的複雜度是 o n...