题目: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坐标转换了。
具体怎么做,这个题解讲的很好。我也是看了该题解才发现可以这么巧妙的转化。