a 最近點對
不會b 最長路徑
顯然有dist(u) + dist(v) - 2dist(lca(u,v))=dis(u) xor dis(v)(+- 都是 xor),然後就變成一堆數選兩個xor最大,題解是字典樹做的(似乎二叉的字典樹也不好寫啊),我就二分做了(似乎也不好做)。一開始build只加了乙個方向,囧。
c 山蜂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.
容斥+裝壓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座標排序,我們可以想象一條垂直的直線將...