咯咯咯,鴿
馬孔多是乙個奇怪的小鎮,鎮上的房子沿著一條河流的南岸而建,而且鎮上的居民一輩子都只在自家附近乙個固定半徑的範圍內活動,有些居民永遠不會相互接觸,即使他們生活一輩子也老死不相往來。
馬孔多小鎮一共有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元,在第乙個商店進貨,第二個商店賣出。但是在第二個商店到第三個商店的途中,我們不能賺錢。因為第二個商店的 比第三個商店的 的 大,...