1. 程式人生 > >CS Round #50 Min Races(nlogn級別的LDS)

CS Round #50 Min Races(nlogn級別的LDS)

tar ... out sin 題目 logs dem int 理解

題目鏈接:點——點

題意:n個比賽者,每個比賽者都有自己的班級(似乎是這樣翻譯,就像實力至上的教室那裏面的A,B,C班一樣,1班最強...),和自己在n名選手中能排到的名次。

如果名次排在自己前面的選手的班級更厲害(比如1班就比2班強,廢話...),那麽這個選手自己心裏就覺得自己贏了。

題解:看了好久的題目才理解它要問什麽。簡單來說,先按照名次排個序,然後去取最長遞增序列,把每個人都遍歷過,然後算出有幾條就可以了。(這個其實反過來就是求最長遞減子序列)

給出的n達到1e5,所以肯定不能直接dp,要用到nlogn的LDS。

 1 #include <iostream>
 2
#include <algorithm> 3 using namespace std; 4 5 const int N=1e5+10; 6 struct TnT{ 7 int a,b; 8 }T[N]; 9 10 int A[N],B[N]; 11 12 bool cmp(TnT x,TnT y){ 13 return x.b<y.b; 14 } 15 16 int binsearch(int low,int high,int num){ 17 while(low<=high){ 18 int
mid=(low+high)/2; 19 if(B[mid]>=num) low=mid+1; 20 else high=mid-1; 21 } 22 return low; 23 } 24 25 int dp(int n){ 26 B[1]=A[1]; 27 int len=1; 28 for(int i=2;i<=n;i++){ 29 if(A[i]<=B[len]) {len++;B[len]=A[i];} 30 else{ 31 int
pos=binsearch(1,n,A[i]); 32 B[pos]=A[i]; 33 } 34 } 35 return len; 36 } 37 38 int main(){ 39 int n,k; 40 cin>>n>>k; 41 for(int i=1;i<=n;i++) cin>>T[i].a>>T[i].b; 42 sort(T+1,T+1+n,cmp); 43 for(int i=1;i<=n;i++) A[i]=T[i].a; 44 cout<<dp(n)<<endl; 45 return 0; 46 }

CS Round #50 Min Races(nlogn級別的LDS)