每天,農夫約翰的奶牛都要從農場的一邊通過農場中的某一條路到達農場的另一邊。我們可以認為農場的一邊是直線y=0
y=0y=
0,農場的另一邊是y=1
y=1y=
1。從農場的一邊到另一邊有很多的路可以走,路的兩邊端點是(ai
,0
)(ai,0)
(ai,0)
和( bi
,1
)(bi,1)
(bi,1)
,這裡所有的aiai
ai都是不同,同樣所有的bibi
bi也是不同的。
約翰每天都會擔心他的奶牛們會不會在中途的時候相撞了,也就是如果兩條路有交點,那麼奶牛們就有可能相撞。
請你幫助約翰計算,在所有的道路中,有多少路是安全的(即不可能相撞的路)。
第乙個乙個整數n
nn,表示路的條數。
接下裡第2
22行到第n+1
n+1n+
1行,第i+1
i+1i+
1行表示的兩個整數是aiai
ai和b ibi
bi。輸出不會與其他道路相交的道路的條數。
1
<=n
<
=100000
1<=n<=100000
1<=n
<=1
0000
0−1000000
<=a
i,bi
<
=1000000
。-1000000<=ai,bi<=1000000。
−10000
00<=a
i,bi
<=1
0000
00。這個問題可以用幾種不同的方法來解決。
最初可能想到但不完全正確的乙個想法是,對a上的奶牛進行排序,然後再對b上的奶牛進行排序,如果牛在兩次排序中都處於相同的位置,則將其視為安全的。然而,不幸的是,由於這樣的情況:
31 3
2 23 1
解決這一問題的關鍵觀察是,如果a次序中所有的母牛在她之前也在b次序中,而a次序中所有的母牛在她之後也在b次序中,那麼母牛是安全的。ing,保持每一頭奶牛的b值的最大值。當我們到達特定的母牛(a,b)時,我們檢查到目前為止我們看到的最大b是否小於b——這意味著在a次序中(a,b)之前的所有母牛也在b次序中的這頭母牛之前。然後我們需要反過來做同樣的事情:在保持b值的最小值的同時向後掃瞄a順序;當我們遇到一頭母牛(a,b)時,我們測試到目前為止我們看到的最小b是否大於b,因為這確保在a順序中(a,b)之後的所有母牛也處於尾部。這牛在b排序。
#include
#include
#include
using
namespace std;
#define nmax 100000
struct crossing
;crossing crossings[nmax]
;inline
bool
cmp1
(crossing a, crossing b)
inline
bool
cmp2
(crossing a, crossing b)
intmain()
sort
(crossings, crossings + n, cmp2)
;for
(int i =
0; i < n; i++
)sort
(crossings, crossings + n, cmp1)
;int answer =0;
int maxx2indexseen =-1
;for
(int i =
0; i < n; i++
) maxx2indexseen =
max(maxx2indexseen, crossings[i]
.x2index);}
printf
("%d"
, answer)
;}
奶牛的交叉路(jzoj 1756)
有兩個數軸,之間有n條線分別連線著兩個數軸的點各乙個,這些線可能會相交,問有多少條線沒有和其他點相交 4 3 4 7 8 10 16 3 921 n 100000,1000000 ai,bi 1000000。說明 第一條路和第三條路不會和其他的路相交,所以答案是2。先用第乙個數軸 a軸 上的數來排序...
他們不知不覺中跑到了乙個交叉路口
我家電腦就有的怨言 今天的我家電腦就有的怨言,我點了我最愛吃的的蛋撻,他是怎麼畫的啊,他們不知不覺中跑到了乙個交叉路口,他們都想跟我請教哎,我心底裡得意極了,可樂買好單我小心翼翼的把食物端到我們占領的位子,嘿,教教我啊,它給老人吹來了清涼的晚風。乙個小朋友在前面跑,苦苦甜甜的真好喝,煞一聞,收銀台排...
奶牛的鍛鍊
這題有一點比較猥瑣,就是一休息就要休息到疲勞值為0 奶牛果然沒有人類勤奮啊 辣麼如果不讓奶牛休息,這題是不是好解的多呢?任何乙個蒟蒻都可以看出,f i j f i 1 j 1 d i 現在加入了休息也很好辦,一休息就去替換f 0 而不參加迴圈部分的運算,這樣可以減去一些負擔。於是我們可以寫出偽 f ...