码迷,mamicode.com
首页 > 其他好文 > 详细

CS Round #50 Min Races(nlogn级别的LDS)

时间:2017-09-30 00:24:35      阅读:172      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!