1、並查集
可以並查集:
考慮對點權的限制。
嘗試逐點列舉點權,向點權大於等於自己的節點擴充套件,計算最大路徑。
優化:瓶頸在於還是有很多重複的。
上述的每個節點擴充套件後形成的連通塊點集成為乙個集合,
從大點權到小點權只要集合拓展。
維護集合:考慮並查集
點權排序,維護集合內最長鏈即可。
nlog
#include#define f(i,a,b) for(rg int i=a;i<=b;++i)view code#define rg register
#define ll long long
#define il inline
#define pf(a) printf("%d ",a)
#define phn puts("")
using
namespace
std;
#define int ll
intread();
/*可以並查集:
考慮對點權的限制。
嘗試逐點列舉點權,向點權大於等於自己的節點擴充套件,計算最大路徑。
優化:瓶頸在於還是有很多重複的。
上述的每個節點擴充套件後形成的連通塊點集成為乙個集合,
從大點權到小點權只要集合拓展。
維護集合:考慮並查集
點權排序,維護集合內最長鏈即可。
*/#define n 100010
intn;
int to[n<<1],fir[n<<1],len[n<<1
],head[n],cnt;
intval[n];
int f[n][20
],s[n],d[n];
il int max(int x,int y)
il void add(int x,int y,int w)
void dfs(int x,int
fa)}
il int lca(int x,int
y)struct
node
}a[n];
intjh[n],w[n],dl[n],dr[n];
bool
vis[n];
ll ans;
int find(int x)
il int hb(int x,int
y),b[2]=;
int mxd=w[y],l=dl[y],r=dr[y];
f(i,
0,1)}}
if(mxd>w[x])
jh[y]=x;
returnx;}
signed main();
for(rg int i=2,u,v,val;i<=n;++i)
u=read(),v=read(),val=read(),add(u,v,val),add(v,u,val);
dfs(
1,0);
sort(a+1,a+n+1
); ans=0
; f(i,
1,n)
rg intu;
f(i,
1,n)}}
printf(
"%lld\n
",ans);//}}
il int
read()
/*g++ 1.cpp -g
time ./a.out13
1 2 3
1 2 1
1 3 2
*/
2、點分治。
也是對上述暴力的優化。
nlog*log,點分×set (第二個log是log當前點兒子。常數小。)
維護當前分治子樹內各點的到根距離、min點權。
然後按最小點權大到小sort記錄的資訊,更新max邊,用當前點×max邊。
為了避免來自同一子樹,要記錄該點所屬的根的兒子是誰。
multiset維護各兒子當前max邊。
wmz用了線段樹做set的功能。但是沒必要,增加了常數和碼量。不如multiset。
#include#includeview code#include
#include
#define lch p<<1
#define rch p<<1|1
using
namespace
std;
const
int n=1e5+7
;const
int inf=0x7f7f7f7f
;struct
nodes[n
<<2
];inline
void down(int
p)inline
void up(int
p)void insert(int p,int l,int r,int pos,long
long
val)
long
long query(int p,int l,int r,int l,int
r)struct
data
data(
int mn,long
long sum,int
k):mn(mn),sum(sum),k(k){}
inline friend
bool
operator
< (const data &a,const data &b)
}que[n];
intn,tot,root,sumsz,mn,cnt;
bool
v[n];
int head[n],nxt[n<<1],to[n<<1],w[n<<1
],d[n],sz[n];
long
long
ans;
void calc(int x,int
from,int mn,long
long sum,int
k)void findroot(int x,int
from,int mxp=0
)
if(sumsz-sz[x]>mxp) mxp=sumsz-sz[x];
if(mxpx;
}void solve(int x,int num=0
) insert(
1,1,num,que[i].k,que[i].sum);}s[
1].clear=1
;
for(int i=head[x];i;i=nxt[i])
}inline
void add(int a,int b,int
val)
inline
int read(register int x=0,register char ch=getchar(),bool f=0
)int
main()
findroot(
1,1);
solve(1);
printf(
"%lld\n
",ans);
}return0;
}/*g++ bf.cpp -g
./a.out
*/
CSP S模擬41影子,玫瑰花精題解
題面 影子 暴力方法 列舉每一對點暴力統計最小權 優化 考慮並查集,列舉每個點,如果沒有被訪問過,那麼嘗試把這兩個點加到乙個集合裡 維護每乙個點作為最小權時的樹上路徑的兩個端點,合併時維護即可 將所有點按照權值從大到小排序,對於將當前點和與其相連的所有點依次合 並到乙個集合中。並查集需要維護當前集合...
題解 csp s2021 T2 括號序列
本文首先發布於個人部落格,不定期更新。推薦去我的部落格閱讀,效果更佳。因為 csp s 考的太慘了,所以一直想著回頭把前三題都ac了,結果一拖拖到現在才做完 還有就是動態規劃好難 wtcl 本題題意較複雜,建議直接去看原題 題目鏈結 總的來說,合法的括號序列一共分兩類 包含型 a s as sa 並...
CSP S2019 D2T3 樹的重心
小簡單正在學習離散數學,今天的內容是圖論基礎,在課上他做了如下兩條筆記 乙個大小為 n nn 的樹由 n nn 個結點與 n 1 n 1 n 1 條無向邊構成,且滿足任意兩個結點間有且僅有一條簡單路徑。在樹中刪去乙個結點及與它關聯的邊,樹將 為若干個子樹 而在樹中刪去一條邊 保留關聯結點,下同 樹將...