QBXT day2 最近點對 最長路徑 山峰

2022-08-18 04:33:11 字數 2421 閱讀 8797

a 最近點對

不會b 最長路徑

顯然有dist(u) + dist(v) - 2dist(lca(u,v))=dis(u) xor dis(v)(+- 都是 xor),然後就變成一堆數選兩個xor最大,題解是字典樹做的(似乎二叉的字典樹也不好寫啊),我就二分做了(似乎也不好做)。一開始build只加了乙個方向,囧。

code

program path;

uses math;

const maxn=200000;len=29;

var d,mid,ans,tot,root,n,x,y,z,i,j,u,h,t,a,b,l,r,query:longint;

v,next,w:array[0..maxn*2] of longint;

q,dis,adjlist:array[1..maxn] of longint;

vis:array[1..maxn] of boolean;

procedure build(x,y,z:longint);

begin

inc(tot);

v[tot]:=y;w[tot]:=z;

next[tot]:=adjlist[x];

adjlist[x]:=tot;

end;

procedure swap(var x,y:longint);

var t:longint;

begin t:=x;x:=y;y:=t;end;

procedure qsort(l,r:longint);

var i,j,mid:longint;

begin

i:=l;j:=r;mid:=dis[(l+r)>>1];

repeat

while(iand(dis[i]do inc(i);

while(land(middo dec(j);

if i<=j then

begin

swap(dis[i],dis[j]);

inc(i);dec(j);

end;

until i>j;

if(lthen qsort(l,j);

if(ithen qsort(i,r);

end;

begin

assign(input,'path.in');

assign(output,'path.out');

reset(input);rewrite(output);

readln(n);

for i:=1 to n-1 do

begin

readln(x,y,z);

build(x,y,z);

build(y,x,z);

end;

root:=1;

vis[root]:=true;

h:=0;t:=1;q[1]:=root;

while hdo

begin

inc(h);u:=q[h];

i:=adjlist[u];

while i<>0 do

begin

ifnot vis[v[i]]

then

begin

inc(t);q[t]:=v[i];

dis[v[i]]:=dis[u] xor w[i];

vis[v[i]]:=true;

end;

i:=next[i];end;

end;

qsort(1,n);

for i:=1 to n do

begin

a:=1;b:=n;query:=dis[i];

for d:=len downto 0 do

begin

l:=a;r:=b;

if((dis[l]>>d)and 1)=1 then r:=a;

if((dis[r]>>d)and 1)=0 then l:=b;

while ldo

begin

mid:=(l+r)>>1;

if boolean((dis[mid]>>d)and 1)

then r:=mid

else l:=mid;

end;

if(boolean((query>>d)and 1))

then

begin

if athen b:=l;end

else

begin

if lthen a:=r;end;

end;

ans:=max(max(query xor dis[l],query xor dis[r]),ans);

end;

writeln(ans);

close(input);close(output);

end.

c 山蜂

容斥+裝壓dp,我無力了。

求最近點對

求最近點對 就我所知道的 有三種演算法,一是演算法導論上給出的,用分治思想,時間複雜度為o n log n 詳細可見演算法導論 第二種是網上給出的 隨機演算法 時間複雜度為o n 原文如下 對於給定的平面上的n個點 xi,yi i 1,2,n 和乙個距離d,以d為尺寸可以構造乙個 邏輯上的 網格,該...

平面最近點對

求點集中的最近點對有以下兩種方法 設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,設計演算法找出集合s中距離最近的點對。1 蠻力法 適用於點的數目比較小的情況下 1 演算法描述 已知集合s中有n個點,一共可以組成n n 1 2對點對,蠻力法就是對這n n 1 2 ...

最近點對問題

在n n 1 個點的集合中尋找最近點對。即求任意兩點的歐幾里得距離的最小值。1 最簡單的暴力搜尋演算法,時間複雜對為o n n 2 這裡主要考慮分治演算法,執行時間的遞迴式為t n 2 t n 2 o n 時間複雜度為o n lgn 演算法思想 將集合中的點按x座標排序,我們可以想象一條垂直的直線將...