description
題目背景: 尊者神高達作為乙個萌新,在公升級路上死亡無數次後被乙隻大黃嘰帶回了師門。他加入師門後發現有無窮無盡的師兄弟姐妹,這幾天新副本開了,尊者神高達的師門作為乙個 pve師門,於是他們決定組織一起去開荒。
題目描述: 師門可以看做以 1 為根的一棵樹,師門中的每乙個人都有一定的裝備分數。一共會有 q 個事件。每個事件可能是一次開荒,也可能是因為開荒出了好裝備而導致乙個人的裝分出現了變化。對於一次開荒,會有 k 個人組織,由於師門的號召力很強,所以所有在組織者中任意兩個人簡單路徑上的人都會參加。
input
第一行 n ,q; 接下來 1 行 n 個數,代表每個人的分值; 接下來 n-1 行 u,v 代表一條邊 接下來 q 行 q 代表詢問,接下來 k 個數代表組織的人數,讀入為 0時停止讀入。 c 代表修改,輸入 x,w 代表將 x 的分值變為 w
output
共 q 的數量行,為開荒的人的總分值
sample input
4 410 5 2 2
1 22 3
2 4q 3 4 0
c 3 200
q 3 4 0
q 1 4 0
sample output
樣例解釋:
第一次詢問,參加的人有 2,3,4 5+2+2=9
第一次修改,權值為 10 5 200 2
第二次詢問,參加的人有 2,3,4 5+200+2=207
第三次詢問,參加的人有 1,2,4 10+5+2=17
data constraint
資料範圍:
20%的資料 n<=10000,q<=500;
另外 20%的資料 k=2
另外 20%的資料 沒有修改操作
所有資料 n,q<=100000,所有詢問 k 的和<=1000000
保證資料合法
–長知識了
首先是虛樹:只把lca中要用到的有用點拿出來,重新建的一棵樹
具體實現主要是按dfs序排序的棧的維護
發現在統計答案的時候就是dfs序相鄰的兩個點之間的路徑上的和
又可以用樹狀陣列維護(差分的思想)
修改也可以o(1)在樹狀陣列上處理了
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int maxn=
1e5+5;
int n,q;
int head[maxn]
,next[maxn*2]
,to[maxn*2]
,cnt;
long
long w[maxn]
,s[maxn]
;int fa[maxn][20
],d[maxn]
,dfn[maxn]
,last[maxn]
,sum;
char opt;
int a[maxn*2]
,k,tot;
int stack[maxn]
,top;
long
long ans;
void
add(
int u,
int v)
void
build
(int x,
int f)
last[x]
=sum;
}void
putin
(int x,
long
long y)
bool
comp
(const
int&a,
const
int&b)
intlca
(int x,
int y)
return fa[x][0
];}long
long
ask(
int x)
intmain()
d[1]=
1;build(1
,0);
for(
int i=
1;i<=n;i++
)while
(q--)}
sort
(a+1
,a+1
+k,comp)
; tot=k;
for(
int i=
1;i) a[
++k]
=lca
(a[i]
,a[i+1]
);sort
(a+1
,a+1
+k,comp)
; k=
unique
(a+1
,a+1
+k)-a-1;
ans=0;
top=0;
for(
int i=
1;i<=k;i++
)printf
("%lld\n"
,ans);}
else
}return0;
}
NOIP2018模擬賽2018 10 18 輕功
description 題目背景 尊者神高達進入了基三的世界,作為乙個 mmorpg 做任務是必不可少的,然而跑地圖卻令人十分不爽。好在基三可以使用輕功,但是尊者神高達有些手殘,他決定用梅花樁練習輕功。題目描述 一共有 n 個木樁,要求從起點 0 開始,經過所有梅花樁,恰好到達終點 n,尊者神高達一...
NOIp2018模擬賽三十六
好久沒打模擬賽了。今天一樣是兩道國集,一道bzoj題 成績 13 0 95 108 a題開始看錯題了。導致樣例都沒看懂,結果xfz提醒我後我理解了乙個我自認為正確的題意 事實證明我和xfz都錯了qwq 然後瞎打了乙個線段樹,結果只有13分。c題一看就是乙個大平衡樹,開始手打了100 行發現自己肯定調...
NOIP2018 信心賽 雞腿
波波手上有許多校慶時分發的雞腿券,他決定用玩遊戲的方式來分配這些雞腿券。已知波波會給出乙個 的 棋盤,並且他會在棋盤的左上角 1,1 處放置乙個棋子。兩名雞腿競爭者 和 將輪流移動棋子,每一回合 選手只能向上 下 左 右四個方向使棋子移動一步。為了使遊戲盡快結束波波還規定不能重複經過已經經過的格 子...