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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CS Round #50 Min Races(nlogn级别的LDS)相关的知识,希望对你有一定的参考价值。

题目链接:点——点

题意: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)的主要内容,如果未能解决你的问题,请参考以下文章

最大/最小/计数等没有给出好的价值

MySQL MIN/MAX 所有行

Codeforce 835A - Key races

blade and soul races guide

03JavaScript程序设计修炼之道 2019-06-23_15-50-11 验证码

[CF115E]Linear Kingdom Races