Gym 100820-G

题目:https://codeforces.com/gym/100820/problem/G

该题目可以通过十分巧妙的方法转换成nlogn求最长不下降子序列。

#include<iostream>
#include<algorithm>
using namespace std;
struct point {
    long long x , y ;
    bool operator < (point &a){
        return x < a.x ;
    }
}a[110000];
long long n , r , w , h , x , y , t ;
long long ans[110000] ; 
int main(){
    cin>>n>>r>>w>>h;
    for(int i = 1 ; i <= n ; i ++ ){
        cin>>x>>y;
        a[i].x = ( x * r + y ) ; 
        a[i].y = ( ( w - x ) * r + y ) ;
    }
    sort( a + 1 , a + n + 1 );
    for( int i = 1 ; i <= n ; i ++ ){
        if( a[i].y >= ans[t] ) ans[++t] = a[i].y ;
        else{
            int p = lower_bound( ans + 1 , ans + t + 1 , a[i].y ) - ans ;
            ans[p] = a[i].y ; 
        }
    }
    cout<<t<<endl;
    return 0 ;
}

这里将输入的x,y坐标转换了。

具体怎么做,这个题解讲的很好。我也是看了该题解才发现可以这么巧妙的转化。

 

posted @ 2020-07-13 11:27  Xcsj  阅读(134)  评论(0编辑  收藏  举报