80%:做不出100%,先來個80分水法
首先將x,y之間有邊的記錄兩個,存在a陣列裡,乙個是x,y,另乙個是y,x
然後將這個a陣列排序,將a[i,1]按公升序排序。
then 就可以求出每乙個點與多少個點有邊,求出每乙個點的"子點"的區間,用l和r陣列存
再用dfs求出以1作根,每乙個點的father是誰
預處理over
如果為1,新建乙個陣列k來存它們的變化;
如果為2,就從這個點往回推,如果為偶數次就+k[j],如果為奇數次就-k[j],j=father[j]
80%**:
var a:array[0..200000,1..2]of longint;
father,l,r,k,d:array[0..100000]of longint;
v:array[0..100000]of boolean;
n,m,i,j,z,y,x,w:longint;
procedure
qsort
(l,r:longint);
var i,j,mid:longint;
begin
if l>=r then
exit;
i:=l; j:=r; mid:=a[(l+r) div
2,1];
repeat
while a[i,1]do inc(i);
while a[j,1]>mid do dec(j);
if i<=j then
begin
a[0]:=a[i];a[i]:=a[j];a[j]:=a[0];
inc(i);dec(j);
end;
until i>j;
qsort(i,r);
qsort(l,j);
end;
procedure
find_father
(x:longint);
var i:longint;
begin
v[x]:=false;
for i:=l[x] to r[x] do
if v[a[i,2]]=true
then
begin
father[a[i,2]]:=x;
find_father(a[i,2]);
end;
end;
begin
readln(n,m);
for i:=1
to n do
read(d[i]);
readln;
for i:=1
to n-1
dobegin
readln(x,y);
a[i*2-1,1]:=x;
a[i*2-1,2]:=y;
a[i*2,1]:=y;
a[i*2,2]:=x;
end;
qsort(1,(n-1)*2);
for i:=1
to (n-1)*2
dobegin
if a[i,1]<>a[i-1,1] then l[a[i,1]]:=i;
if a[i,1]<>a[i+1,1] then r[a[i,1]]:=i;
end;
fillchar(v,sizeof(v),true);
find_father(1);
for i:=1
to m do
begin
read(x);
if x=1
then
begin
readln(j,y);
k[j]:=k[j]+y;
end;
if x=2
then
begin
readln(w);
j:=w;y:=0;z:=d[w];
while j<>0
dobegin
y:=1-y;
if y=0
then z:=z-k[j] else z:=z+k[j];
j:=father[j];
end;
writeln(z);
end;
end;
end.
2017 6 4 入門組 NO 1 k好數
方法 資料1 n 1000000,時間複雜度最大o 1000000 6 暴力足夠了,於是,便開始碼暴力 迴圈列舉i,將i轉為字串,每一位的判斷是否超過k 如果每一位都沒超過就 1 方法 動態規劃 找一找每一位於上一位的關係,可以發現。設n 236,k 5,如果最後一位的數x大於k,則上一位數,只能取...
2017 6 4 入門組 NO 4 猜數
這題就是求乙個區間 l.r 那開始將l 10000 r 10000 每次輸入一次判斷,如果為 n 那麼就將符號反轉,如 那麼符號處理好後,如果為 或 那麼如果當x大於l且小於或等於r,則l x 如果當x大於r,則輸出 impossible 如果為 如果當x小於l,則輸出 impossible tip...
2016藍橋杯B組 NO 6
方格填數 如下的10個格仔 填入0 9的數字。要求 連續的兩個數字不能相鄰。左右 上下 對角都算相鄰 一共有多少種可能的填數方案?請填寫表示方案數目的整數。注意 你提交的應該是乙個整數,不要填寫任何多餘的內容或說明性文字。include include include include using n...