NOI2019 彈跳 題解(KD樹)

2021-09-27 09:08:03 字數 2199 閱讀 8188

題意:w×h網格中有n個點,m條邊。每條邊可以從p點花費t時間到乙個矩形中的任意點,求1號點到每個點的最少時間。

\(1<=w,h<=n<=70000,1<=m<=150000\)

時間2s,空間128m

本題如果放在序列上,使用線段樹建圖,可以做到\(o(mlogn)\)的複雜度,通過資料分治可以獲得72分。

對於二維問題可以想到將線段樹變為二維線段樹,然而會被卡空間。

考慮此題暴力dij的本質:就是每次找最小的點,然後把乙個矩形中大於z的數都改為z,再刪除這個點。

看到矩形修改,可以想到kd樹。

kd樹的空間複雜度是\(o(n)\)的,很優秀。

在矩形修改時,採用類似線段樹的方法:如果當前矩形與修改的矩形沒有交,就直接返回。如果被包含,則直接打標記。

但與線段樹不同的:還需要考慮當前的點是否在矩形內,如果在則直接修改這個點。

這就是kd樹處理矩形的方法。

時間複雜度:\(o(m\sqrt)\)。

刪除乙個點可以打乙個特殊標記實現。

把這個寫上後,會發現超時。

考慮剪枝:如果z大於當前點的標記,就直接返回。

這樣就能過了。

**:

#include #include #define max(a,b) a>b?a:b

#define min(a,b) ax-((spx*)b)->x;

}int cmpy(const void*a,const void*b)

int cl[70010],cr[70010],fa[70010],lx[70010],rx[70010],ly[70010],ry[70010];

int zx[70010],wz[70010],qz[70010],ld[70010],inf=2000000000,root;

bool bk[70010];

void update(int x)

void pur(int x,int y)

void pushdown(int x)

void clean(int x)

void del(int x)

int buix(spx sz[70010],int l,int r);

int buiy(spx sz[70010],int l,int r);

void pushup(int rt)

if(cr[rt]!=0)

}bool fugai(int lx,int rx,int ly,int ry,int lx,int rx,int ly,int ry)

bool fenli(int lx,int rx,int ly,int ry,int lx,int rx,int ly,int ry)

int x[70010],y[70010];

int buix(spx sz[70010],int l,int r)

int buiy(spx sz[70010],int l,int r)

void songc(int i,int lx,int rx,int ly,int ry,int z)

pushdown(i);

if(fugai(lx,rx,ly,ry,x[i],x[i],y[i],y[i]))

if(cl[i]!=0)

songc(cl[i],lx,rx,ly,ry,z);

if(cr[i]!=0)

songc(cr[i],lx,rx,ly,ry,z);

update(i);

}void dfs(int u)

int dis[70010];

int fr[70010],ne[150010],x1[150010],x2[150010],y1[150010],y2[150010],w[150010],bs=0;

void addb(int a,int lx,int rx,int ly,int ry,int b)

spx sz[70010];

void dij(int u,int n)

}int main()

{ wz[0]=-1;

int n,m,w,h;

scanf("%d%d%d%d",&n,&m,&w,&h);

for(int i=1;i<=n;i++)

scanf("%d%d",&x[i],&y[i]);

for(int i=1;i<=n;i++)

fr[i]=ld[i]=-1;

for(int i=0;i

NOI2019 彈跳 區間連邊最短路問題

loj3159 n nn個點,每個點有乙個二維座標,有m mm條邊,每條邊從乙個點出發,可以走到座標範圍在乙個矩形區域內的點,代價為t it i ti 求從1號點到其他點的最短路。n 7 104 m 1.5 1 05 n le7 10 4,m le1.5 10 5 n 7 10 4,m 1.5 10...

NOI2019 序列 題解

同步賽當場降智了,認為貪心是假的。然後。就寫了個暴力。開題一看,這不是模擬費用流嗎?然而這個費用流並不顯然。所以我當時放棄了t3部分分沒想到。當然也希望這個題解能讓大家懂得什麼是真正的模擬費用流啦 大概是這麼一張圖 正確性嘛 就是如果選下標不同的一對數的話必須走 c d 這條路徑 那麼就保證了下標不...

NOI2019模擬2019 3 18 總結

今天的比賽再次打爛了 見識到了自己和外校大佬們的差距 t1一看就感覺不是什麼友善的題 t2感覺是貪心或者dp t3是個類似組合數的遞推,但是直接轉移顯然會t,感覺有可能可以用多項式來做,又想不出來 心態就徹底崩了 推了1ht3的式子,無果,暴力走人。t2又玩了1h,猜了一發結論,搞了個lis之類的東...