Tsinsen A1486 樹 樹分治 字典樹

2021-07-23 21:29:34 字數 1169 閱讀 4134

傳送門:tsinsen a1486. 樹

題意:給你一棵樹(n<=1e5),每個點有乙個權值和喜歡不喜歡之分,找出一條路徑至少包含k個喜歡的點,而且異或和最大

思路:

樹分治,同時維護字典樹

字典樹每個點維護乙個喜歡的點數的最大值

時間複雜度:nlogn*30

#include

using

namespace

std;

const

int n=101000;

typedef pair pi;

struct edgee[n*2];

int tot,head[n];

void addedge(int from,int to);

head[from]=tot++;

}void init()

int count,size[n],f[n],root,k,ans,a[n],color[n];

bool del[n];

void getroot(int u,int fa)

f[u]=max(f[u],count-size[u]);

if(f[u]struct trie

void insert(int x,int dep)

u=ch[u][c];

val[u]=max(val[u],dep);}}

int find(int x,int dep)

return ans;

}}trie;

vector

tmp;

void getdeep(int u,int pre,int dep,int pre_value,int value));

for(int i=head[u];i!=-1;i=e[i].next)

}void work(int u)

}}int main()

count=f[0]=n,ans=-1;

memset(del,false,sizeof(del));

getroot(1,root=0);

work(root);

printf("%d\n",ans);

return

0;}

樹鏈剖分 樹鏈剖分講解

好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 vector v maxn int size maxn dep maxn val maxn id maxn hson maxn top maxn fa maxn 定義 int edge 1,num 1 struct tree e ma...

樹鏈剖分(輕重樹)模板

例題 樹鏈剖分就是用兩個dfs重新給樹編號 深度 求父節點 求重兒子 子樹大小 每條重鏈的頂端,然後用線段樹維護新的編號的樹 include include using namespace std define n 200010 int n,m,r,mod int head n nex n e n ...

目錄樹 (30 分)

在zip歸檔檔案中,保留著所有壓縮檔案和目錄的相對路徑和名稱。當使用winzip等gui軟體開啟zip歸檔檔案時,可以從這些資訊中重建目錄的樹狀結構。請編寫程式實現目錄的樹狀結構的重建工作。輸入首先給出正整數n 10 4 表示zip歸檔檔案中的檔案和目錄的數量。隨後n行,每行有如下格式的檔案或目錄的...