題目大意:
給乙個樹,然後再隨便再多連一條邊,形成乙個帶乙個環的樹。
一開始,所有樹的節點的權重為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...