一天機房的夜晚,無數人在mc裡奮鬥著。。。
大家都知道礦產對於mc來說是多麼的重要,但由於礦越挖越少,勇士們不得不跑到更遠的地方挖礦,但這樣路途上就會花費相當大的時間,導致挖礦效率底下。
cjj提議修一條鐵路,大家一致同意。
zjmfrank2012負責繪製出乙個礦道地圖,這個地圖包括家(當然這也是乙個礦,畢竟不把家掏空我們是不會走的),和無數個礦,所以大家應該可以想出這是乙個無向無環圖,也就是一棵樹。
digital_t和cstdio負責鋪鐵路。。所以這裡沒他們什麼事,兩位可以勞作去了。
這個時候song526210932和rmb突然發現有的礦道會刷怪,並且怪的數量會發生變化。作為採礦主力,他們想知道從乙個礦到另乙個礦的路上哪一段會最困難。。。(困難值用zjm的死亡次數表示)。
輸入檔案的第一行有乙個整數n,代表礦的數量。礦的編號是1到n。
接下來n-1行每行有三個整數a,b,c,代表第i號礦和第j號礦之間有一條路,在初始時這條路的困難值為c。
接下來有若干行,每行是「change i ti」或者「query a b」,前者代表把第i條路(路按所給順序從1到m編號)的困難值修改為ti,後者代表查詢a到b所經過的道路中的最大困難值。
輸入資料以一行「done」結束。
對每個「query」操作,輸出一行乙個正整數,即最大困難值。
實在是讓人無語的背景改變,順便膜拜一下夢迪神牛orzzzzzzzz。
最基本的樹鏈剖分。
1 #include 2 #include 3 #include 4 #include 5 #include 6const
int maxn=100000+1000;7
using
namespace
std;
8struct
edge9;
13int d[maxn][3],edge=0,n,root;//
用來記錄邊的屬性
14int siz[maxn],son[maxn];//
子樹大小和重兒子
15int fa[maxn],dep[maxn],z;//
父親和深度
16int
w[maxn],top[maxn],tree[maxn];
17char str[55
];18 vectormap[maxn];
1920 inline void
init();
21 inline void
work();
22 inline void dfs(int u);//
第一次dfs
23 inline void addedge(int u,int v);//
加邊 24 inline void make_tree(int u,int tp);//
第二次dfs
25 inline void update(int root,int l,int r,int num,int c);//
c是變更值
26 inline int read();//
讀入函式
27 inline int find(int a,int
b);28 inline int maxi(int root,int l,int r,int l1,int
l2);
2930
31 inline void addedge(int u,int
v)32
);35
}36 inline void dfs(int u)//
第一次dfs
3752}53
}54//建樹操作
55 inline void make_tree(int u,int
tp)56 67
}68//修改操作
69 inline void update(int root,int l,int r,int num,int
c)70 73
int mid=(l+r)/2;74
//遞迴修改
75 update(root*2
,l,mid,num,c);
76 update(root*2+1,mid+1
,r,num,c);
77 tree[root]=max(tree[root*2],tree[root*2+1
]);78
} 79 inline void
init()
8095 dfs(root);//
第一次96
make_tree(root,root);
97for (i=1;i)98
102return
;103
}104 inline int
read()
105
112 inline int maxi(int root,int l,int r,int l1,int
r1)113
119//
進行從a到b的詢問
120 inline int find(int a,int
b)121
130 temp=max(temp,maxi(1,1
,z,w[f1],w[a]));
131 a=fa[f1];f1=top[a];//
向上傳遞
132}
133if (a==b) return
temp;
134if (dep[a]>dep[b]) swap(a,b);
135return max(temp,maxi(1,1
,z,w[son[a]],w[b]));
136}
137 inline void
work()
138146
return
;147
}148
intmain()
149
訓練題 分隊 P1672
每年的cqoi比賽結束後都會組織選手參加一次遊玩活動。由於人數眾多,通常會把選手分成兩隊出發。組委會為了和諧,想盡量把比較熟悉的選手分在同一隊。我們用 友好度 乙個正整數值 來表示某兩位選手之間的熟悉程度,友好度越大,則兩名選手越熟悉。而 和諧度 定義為兩隊中熟悉程度最低的那對選手的友好度。現在告訴...
1672 最富有客戶的資產總量
1672.最富有客戶的資產總量 給你乙個 m x n 的整數網格 accounts 其中 accounts i j 是第 i 位客戶在第 j 家銀行託管的資產數量。返回最富有客戶所擁有的 資產總量 客戶的 資產總量 就是他們在各家銀行託管的資產數量之和。最富有客戶就是 資產總量 最大的客戶。示例 1...
1672 最富有客戶的資產總量
給你乙個 m x n 的整數網格 accounts 其中 accounts i j 是第 i 位客戶在第 j 家銀行託管的資產數量。返回最富有客戶所擁有的 資產總量 客戶的 資產總量 就是他們在各家銀行託管的資產數量之和。最富有客戶就是 資產總量 最大的客戶。示例 1 輸入 accounts 1,2...