日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu5692【dfs序】【线段树】

發布時間:2024/9/5 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu5692【dfs序】【线段树】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Snacks

Time Limit: 10000/5000 MS (Java/Others)????Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 4446????Accepted Submission(s): 980


Problem Description百度科技園內有n個零食機,零食機之間通過n?1條路相互連通。每個零食機都有一個值v,表示為小度熊提供零食的價值。

由于零食被頻繁的消耗和補充,零食機的價值v會時常發生變化。小度熊只能從編號為0的零食機出發,并且每個零食機至多經過一次。另外,小度熊會對某個零食機的零食有所偏愛,要求路線上必須有那個零食機。

為小度熊規劃一個路線,使得路線上的價值總和最大。

Input輸入數據第一行是一個整數T(T10),表示有T組測試數據。

對于每組數據,包含兩個整數n,m(1n,m100000),表示有n個零食機,m次操作。

接下來n?1行,每行兩個整數xy(0x,y<n),表示編號為x的零食機與編號為y的零食機相連。

接下來一行由n個數組成,表示從編號為0到編號為n?1的零食機的初始價值v(|v|<100000)。

接下來m行,有兩種操作:0?x?y,表示編號為x的零食機的價值變為y1?x,表示詢問從編號為0的零食機出發,必須經過編號為x零食機的路線中,價值總和的最大值。

本題可能棧溢出,辛苦同學們提交語言選擇c++,并在代碼的第一行加上:

`#pragma comment(linker, "/STACK:1024000000,1024000000") `
Output對于每組數據,首先輸出一行”Case #?:”,在問號處應填入當前數據的組數,組數從1開始計算。

對于每次詢問,輸出從編號為0的零食機出發,必須經過編號為x零食機的路線中,價值總和的最大值。

Sample Input1 6 5 0 1 1 2 0 3 3 4 5 3 7 -5 100 20 -5 -7 1 1 1 3 0 2 -1 1 1 1 5
Sample OutputCase #1: 102 27 2 20
Source2016"百度之星" - 初賽(Astar Round2A)
Recommendwange2014???|???We have carefully selected several similar problems for you:??6275?6274?6273?6272?6271?

Well不太會寫貼幾個博客鏈接吧dfs序https://acm.sjtu.edu.cn/w/images/3/35/%E6%A0%91%E7%9A%84dfs%E5%BA%8F%E5%8F%8A%E5%85%B6%E5%BA%94%E7%94%A8%EF%BC%88%E9%97%AB%E9%B8%BF%E5%AE%87%EF%BC%89.pdf
線段樹http://www.cnblogs.com/TenosDoIt/p/3453089.html
lazy操作https://blog.csdn.net/xs18952904/article/details/72763467
以及 題解http://www.cnblogs.com/liyinggang/p/5925196.html

這是一條已經看懂的分割線? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

基本就是按照題解寫的思路

先dfs遍歷所有的路徑 確定dfs序 這個序就是未來線段樹的的基礎

相當于線段樹的先序遍歷

用這些節點建立線段樹 轉換成了求區間最大值

RE 了一發是因為cnt忘記初始化了

WA了一發是因為inf定的0x3f3f3f3f太小了 改成1e18就過了

類型改成longlong的時候inf也要記得改過來

#pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #define inf 1e18 using namespace std;const int maxn = 100005; int n, t, m; struct node{int v, next; }edges[maxn << 2]; int head[maxn], tot, cnt;//tot為邊的數量 cnt用于標記dfs序 int in[maxn] ,out[maxn]; long long lazy[maxn << 2]; long long dis[maxn], b[maxn]; long long sum[maxn << 2], cost[maxn];void init() {memset(head, -1, sizeof(head));tot = cnt = 0; }void addedge(int u, int v, int &k) {edges[k].v = v;edges[k].next = head[u];head[u] = k++; }void pushup(int idx) {sum[idx] = max(sum[idx<<1], sum[idx<<1|1]); }void pushdown(int idx) {if(lazy[idx]){sum[idx<<1] += lazy[idx];sum[idx<<1|1] += lazy[idx];lazy[idx<<1] += lazy[idx];lazy[idx<<1|1] += lazy[idx];lazy[idx] = 0;}return; }void build(int l, int r, int root) {lazy[root] = 0;if(l == r){sum[root] = b[l];return;}int mid = (l + r) >> 1;build(l, mid, root << 1);build(mid + 1, r, root << 1 | 1);pushup(root); }void update(int l, int r, int ll, int rr, int idx, int val) {//讓l和r進入llrr的區間內if(l >= ll && r <= rr){sum[idx] = sum[idx] + val;//val為變化量lazy[idx] = lazy[idx] + val;return;}int mid = (l + r) >> 1;pushdown(idx);if(mid >= ll) update(l, mid, ll, rr, idx << 1, val);if(mid < rr) update(mid + 1, r, ll, rr, idx << 1 | 1, val);pushup(idx); }long long mm = -1; void query(int l, int r, int ll, int rr, int idx) {if(l >= ll && r <= rr){mm = max(mm, sum[idx]);return;}int mid = (l + r) >> 1;pushdown(idx);if(mid >= ll) query(l, mid, ll, rr, idx << 1);if(mid < rr) query(mid + 1, r, ll, rr, idx << 1 | 1); } void dfs(int u, int pre) {//cnt標記dfs序in[u] = ++cnt;b[cnt] = dis[u];for(int k = head[u]; k != -1; k = edges[k].next){int v = edges[k].v;if(v == pre) continue;dis[v] = dis[u] + cost[v];dfs(v, u);}out[u] = cnt; }int main() {cin>>t;for(int cas = 1; cas <= t; cas++){init();scanf("%d%d", &n, &m);for(int i = 0; i < n - 1; i++){int u, v;scanf("%d%d", &u, &v);addedge(u, v, tot);addedge(v, u, tot);}for(int i = 0; i < n; i++){scanf("%lld", &cost[i]);}dis[0] = cost[0];dfs(0, -1);//dfs路徑 dfs序build(1, n, 1);printf("Case #%d:\n", cas);while(m--){int op, x, y;scanf("%d", &op);if(op == 1){scanf("%d", &x);mm = -inf;query(1, n, in[x], out[x], 1);printf("%lld\n", mm);}else{scanf("%d%d", &x, &y);long long change = (long long)y - cost[x];update(1, n, in[x], out[x], 1, change);cost[x] = y;}}}return 0; }

轉載于:https://www.cnblogs.com/wyboooo/p/9643406.html

總結

以上是生活随笔為你收集整理的hdu5692【dfs序】【线段树】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。