1. 程式人生 > >【Hack!】bzoj2850 TLE && 求正解

【Hack!】bzoj2850 TLE && 求正解

感激 discuss true nbsp blank amp strong 時間限制 題解

題目及題解傳送門

然而今天在做另一道題時回想起了這道題,發現時間復雜度並不能證明為$O(n\log n)$或$O(n\sqrt n)$。

然後仔細一想竟然發現時間復雜度是$O(n^2)$的?!

該題題解為KD-tree,然而事實上這樣分割矩形的方法是非常不科學的,於是出了一組數據卡掉了它。

原題中要求的是ax+by<c的,即在ax+by-c=0這條直線以下的所有點的權值之和。那麽只要讓直線穿過所有矩形即可。

然後有了右圖的思路:技術分享

這樣建樹的中序遍歷就是從左下到右上的順序,而這裏面任意兩個點構成的矩形均被直線所穿過。這樣一來每次查詢都需要查詢整棵樹,從而時間復雜度退化到$O(n^2)$。

數據生成器:

#include <cstdio>
int main()
{
	freopen("data.in" , "w" , stdout);
	int n = 50000 , m = 50000 , i;
	printf("%d %d\n" , n , m);
	for(i = 1 ; i <= n ; i ++ )
		printf("%d %d 1\n" , i / 2 * 2 , (i + 1) / 2 * 2 - 1);
	for(i = 1 ; i <= m ; i ++ ) printf("1 -1 0\n");
	return 0;
}

然後博主本人做了一個小實驗,把網上的標程都復制粘貼下來,使用Lemon,時間限制10s,內存限制512MB並開啟O2開關進行評測。

結果通過率為0%

結果如下:

技術分享 技術分享

(這裏為保護其他人隱私,將別人的名稱塗掉了,只留下尷尬的爆零的博主)。

所以說本題正解一定不是KD-tree!(正解被Hack掉了)

那麽正解究竟是什麽?

其實博主也很好奇,但是網上的題解全都是被卡掉了的KD-tree,於是在這裏真心求正解。

希望知道正解的好心人能夠將題解發給博主,博主將萬分感激!

另附bzoj discuss: http://www.lydsy.com/JudgeOnline/wttl/thread.php?tid=4493

【Hack!】bzoj2850 TLE && 求正解