标签:tar mda const color style space 最长递减子序列 个人 sea
题目链接:点——点
题意: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)
标签:tar mda const color style space 最长递减子序列 个人 sea
原文地址:http://www.cnblogs.com/Leonard-/p/7613059.html