CSP S模擬41影子,玫瑰花精題解

2022-04-14 06:30:57 字數 1458 閱讀 1927

題面:

影子:暴力方法:列舉每一對點暴力統計最小權

優化:考慮並查集,列舉每個點,如果沒有被訪問過,那麼嘗試把這兩個點加到乙個集合裡

維護每乙個點作為最小權時的樹上路徑的兩個端點,合併時維護即可

將所有點按照權值從大到小排序,對於將當前點和與其相連的所有點依次合

並到乙個集合中。並查集需要維護當前集合中的最長路徑長度和對應的兩個端點。在合併兩個集合後,最終集合的最長路一定只有兩類情況:一類是其中乙個集合的最長路,一共有 2 種;一類是由兩個集合的最長路的端點互相連線而成,一共有 2×2=4 種。需要用到最近公共祖先的演算法預處理求兩點在樹上的距離,離線處理即可。每次合併並查集之後用當前點的權值乘以最長路的總長度來更新最優結果即可。即使這個點不在當前合併後的集合的最長路上也是沒有問題的,因為如果這樣的話,必然已經在之前得到了對應的結果,這次合併不會對最終結果產生影響。

#include#include#include#include#include#define int long long

using namespace std;

const int maxn=1e5+5;

int t,n,d[maxn],ans=0;

int to[maxn<<1],nxt[maxn<<1],pre[maxn],val[maxn<<1],cnt=0;

inline void add(int u,int v,int w)

int f[maxn][19],deep[maxn],dis[maxn];

void dfs(int x)

for(int i=pre[x];i;i=nxt[i]) }}

int lca(int x,int y)

struct node

}p[maxn];

bool vis[maxn];

int fa[maxn];

struct dataq[maxn];

int find(int x)

void unionn(int x,int y)tr[maxn<<2];

int get_pos()

void pushup(int k)

void update(int k,int l,int r,int pos)

int mid=(l+r)>>1;

if(pos<=mid) update(k<<1,l,mid,pos);

else update(k<<1|1,mid+1,r,pos);

pushup(k);

}void change(int k,int l,int r,int pos)

int mid=(l+r)>>1;

if(pos<=mid) change(k<<1,l,mid,pos);

else change(k<<1|1,mid+1,r,pos);

pushup(k);

}int main()else

} return 0;

}

python玫瑰花數量的含義 玫瑰花數量代表的含義

1朵玫瑰代表 我的心中只有你 only you!2朵玫瑰代表 這世界只有我倆!3朵玫瑰代表 我愛你 i love you!4朵玫瑰代表 至死不渝!5朵玫瑰代表 由衷欣賞!6朵玫瑰代表 互敬 互愛 互諒!7朵玫瑰代表 我偷偷地愛著你!8朵玫瑰代表 感謝你的關懷扶持及鼓勵!9朵玫瑰代表 長久 alway...

python玫瑰花數量的含義 玫瑰花數量多少的含義

一 1朵玫瑰 1朵玫瑰花大多數是在剛剛相戀時贈送,1朵玫瑰花所代表的含義就是一見鐘情,或者是我的心中只有你乙個人。二 11朵玫瑰 11朵玫瑰花是很多人都經常選擇的玫瑰數量,通常是情侶之間表達愛意時送花,11朵玫瑰代表著一生一世,同時也是在向愛人表達 一生相伴,一世相隨 的美好愛情寓意。三 50朵玫瑰...

python玫瑰花數量的含義 玫瑰花數量代表含義

個人收集整理 zq1 3 支玫瑰一心一意 一見鐘情 約會求婚贈花 朵你是我地唯一 朵玫瑰代表 我地心中只有你 支玫瑰成雙成對 喜結良緣 夫妻戀人互增 朵你濃我濃,世界只有你和我 支玫瑰我愛你 贈愛人朋友 朵玫瑰代表 我愛你支玫瑰 四季平安 贈友人居家 朵誓言 承諾 朵玫瑰代表 至死不渝!支玫瑰無悔 ...