To Heart 題解 老死不相往來

2022-09-18 10:36:27 字數 1060 閱讀 4437

咯咯咯,鴿

馬孔多是乙個奇怪的小鎮,鎮上的房子沿著一條河流的南岸而建,而且鎮上的居民一輩子都只在自家附近乙個固定半徑的範圍內活動,有些居民永遠不會相互接觸,即使他們生活一輩子也老死不相往來。

馬孔多小鎮一共有n座房子,以到鎮子的西端的距離算,居民家的位置為p,他們活動的範圍為r,請問馬孔多小鎮一共會有多少對住戶之間老死不相往來。

第1行:乙個數n,表示房子的數量(1 <= n <= 50000)

第2 - n + 1行:每行2個數p, r中間用空格分隔,p表示房子的位置,r表示這家住戶的活動範圍半徑(1 <= p, r <= 10^9)

輸出共有多少對老死不相往來的住戶。

41 1

2 13 2

4 1首先,因為題目給的是乙個點可以運動的範圍,我們就把這個點可以運動到的最左邊界以及最右邊界給儲存下來,再用sort從小到大排序左邊界後,我們把每個點所能到達的所有點累加,再用總數減去累加值就是正確答案了。這裡有兩個地方需要注意一下:

如何計算總數?

從樣例入手,假設共有4個點,且每個點之間都無法相同,則此時的答案即是我們的方案總數,即:3+2+1=6(因為第乙個點到不了三個點,第二個點也到不了三個點,但第乙個點已經被計算過了,其餘點同理);

2.如何計算每個點能到達的點?

首先,因為我們經過了排序,所以當點i到達不了點j時,它也一定到達不了點(j+1),我們可以利用這一性質進行二分,定義乙個mid來確定每個點能到達的最遠點,如果此點能到達點mid,則將mid往後二分,否則相反;

#include

using

namespace std;

struct zz a[

50005];

bool

cmp(zz x, zz y)

intmain()

m -= n;

//m為總方案數;

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

else

} sum +

= ans;

} cout <<

/*mreturn0;

}

To Heart 題解 戳西瓜

請不要吝嗇你的點讚!有 n 個西瓜,編號為0 到 n 1,每個西瓜上都標有乙個數字,這些數字存在陣列 nums 中。現在要求你戳破所有的西瓜。每當你戳破乙個西瓜 i 時,你可以獲得 nums left nums i nums right 個硬幣。這裡的 left 和 right 代表和 i 相鄰的兩...

To Heart 題解 內需消費

題目鏈結 首先,我們先假設這道題不需要修改物價,那麼我們如何找到最好的情況呢?差分。如下數列 1 4 3 5 2很容易觀察出,在第乙個商店到第二個商店中,我們最多可以賺3元,在第乙個商店進貨,第二個商店賣出。但是在第二個商店到第三個商店的途中,我們不能賺錢。因為第二個商店的 比第三個商店的 的 大,...

To Heart 題解 內需消費

題目鏈結 首先,我們先假設這道題不需要修改物價,那麼我們如何找到最好的情況呢?差分。如下數列 1 4 3 5 2很容易觀察出,在第乙個商店到第二個商店中,我們最多可以賺3元,在第乙個商店進貨,第二個商店賣出。但是在第二個商店到第三個商店的途中,我們不能賺錢。因為第二個商店的 比第三個商店的 的 大,...