HDU 5957 線段樹 附資料生成器

2021-07-24 06:59:50 字數 2221 閱讀 7297

題目大意:

給乙個樹,然後再隨便再多連一條邊,形成乙個帶乙個環的樹。

一開始,所有樹的節點的權重為0

有2個操作。

操作1: 距離結點u距離小於k的所有節點,權重+d

操作2:詢問距離節點u距離小於k的所有節點的權重之和。

思路: 先假設題目的圖只是一棵樹,找乙個根節點,bfs一下,dfn[i]表示i節點的bfs時間序列。 可以看出,每個節點的所有兒子的bfs時間序列是連續的,這就可以考慮到線段樹來維護了。  並且,用線段樹維護還挺好想的。

回到原題,這多乙個環,把環弄出來(拓撲排序,最後度為2的點都是環上的)。

環上的點,視為若干個樹的根。現在是好多棵樹,每棵樹的根彼此相連,依舊用線段樹來解決,只不過在操作的時候,要多考慮一些東西~細節的話自己考慮一下就行了。

ac code:

#include using namespace std;

const int maxn =100000 + 100;

vectorg[maxn];

int n;

void init()

for (int i = 1; i <= n; ++ i) }

const int maxnode = 6*maxn;

struct node

tree[maxnode];

int tail;

char input[20];

int du[maxn];

queueq;

int dfn[maxn], dfncnt;

bool vis[maxn];

vectorroot[maxn];//作為根的節點的朋友節點

void bfs(int arg) }}

int minson[maxn], maxson[maxn];//最小最大的兒子編號

int mingrandson[maxn], maxgrandson[maxn];//最小最大的孫子編號

int pre[maxn];//父節點

//dfs是找出自己兒子層的數字,和孫子層的數字

void dfs(int now, int fa)

}//#define pr(x) cout<<#x<<" = "else maintain(rson);

maintain(self);

return ret;

}void update(int o, int l, int r)

else

maintain(self);

}vectorsb;

void ud(int u, int k, int d)

else if (k==1)

else

ql = qr = dfn[u];

update(0, 1, n);

pr(ql),prln(qr);

} }else//也就是k==2

else

}} else

sort(sb.begin(), sb.end());

sb.erase(unique(sb.begin(),sb.end()),sb.end());

for (auto will : sb)

} }}

void qu(int u, int k)

else if (k==1)

else

ql = qr = dfn[u];

sum += query(0, 1, n);

pr(ql),prln(qr);

} }else//也就是k==2

else

}} else

sort(sb.begin(), sb.end());

sb.erase(unique(sb.begin(),sb.end()),sb.end());

for (auto will : sb)

}} printf("%d\n", sum);

}void doit()

else

}}int main()

return 0;

}

data maker:

#include #include #include #include #include #include using namespace std;

int g[500][500];

int main()

{ srand(time(0));

int t = 5;

cout<

hdu 預處理 線段樹)

給n個數,m個詢問,問任意區間內與其它數互質的數有多少個 比如3個數1 2 4,詢問 1,3 那麼答案是1 千萬要記住,這樣的題目,如果你不轉變下,使勁往線段樹想 雖然轉變之後,也說要用到線段樹,但是維護的東西不同了 那麼會發現這樣的題目,區間與區間之間是無法傳遞資訊的,區間與區間是無法傳遞資訊的,...

初步線段樹 hdu1166

include include includeusing namespace std define max 50000 struct node node maintree 4 max void settree int n,int l,int r int main printf case d n tt...

hdu 1556 初級線段樹

include include include define max 100005 define mid l r 1 define lson l,m,rt 1 define rson m 1,r,rt 1 1 using namespace std int n struct tree tree tr...