csp s測試41 T2 影子

2022-03-16 14:34:37 字數 3577 閱讀 9962

1、並查集

可以並查集:

考慮對點權的限制。

嘗試逐點列舉點權,向點權大於等於自己的節點擴充套件,計算最大路徑。

優化:瓶頸在於還是有很多重複的。

上述的每個節點擴充套件後形成的連通塊點集成為乙個集合,

從大點權到小點權只要集合拓展。

維護集合:考慮並查集

點權排序,維護集合內最長鏈即可。

nlog

#include#define f(i,a,b) for(rg int i=a;i<=b;++i)

#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

*/

view code

2、點分治。

也是對上述暴力的優化。

nlog*log,點分×set (第二個log是log當前點兒子。常數小。)

維護當前分治子樹內各點的到根距離、min點權。

然後按最小點權大到小sort記錄的資訊,更新max邊,用當前點×max邊。

為了避免來自同一子樹,要記錄該點所屬的根的兒子是誰。

multiset維護各兒子當前max邊。

wmz用了線段樹做set的功能。但是沒必要,增加了常數和碼量。不如multiset。

#include#include

#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

*/

view code

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 條無向邊構成,且滿足任意兩個結點間有且僅有一條簡單路徑。在樹中刪去乙個結點及與它關聯的邊,樹將 為若干個子樹 而在樹中刪去一條邊 保留關聯結點,下同 樹將...