B. Greenhouse Effect
考虑最多几个不用移动 很容易想到最长非严格递增子序列不动 答案就是n-LIS
code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back
const int N = 5005;
struct node
{
int first;
double second;
}b[N];
bool cmp(node a,node b)
{
return a.second<b.second;
}
int bin(int a[],int len,int num)
{
int left=1,right=len;
while(left<=right)
{
int mid=(left+right)/2;
if(num<a[mid]) //若最长不下降子序列,改<= 为 <
right=mid-1;
else
left=mid+1;
}
return left;
}
int LIS(int a[],int len) //最长上升子序列
{
int i,j,cnt=1;
int *dp=new int[len+1];
dp[1]=a[1];
for(i=2;i<=len;i++)
{
if(a[i]>=dp[cnt]) //若最长不下降子序列,改> 为 >=
dp[++cnt]=a[i];
else if(a[i]<dp[1]) //若最长不下降子序列,改<= 为 <
dp[1]=a[i];
else
dp[bin(dp,cnt,a[i])]=a[i];
}
return cnt;
}
int n,m;
int a[N];
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>b[i].first>>b[i].second;
}
sort(b+1,b+1+n,cmp);
for(int i=1;i<=n;i++) a[i] = b[i].first;
cout<<n-LIS(a,n);
}

浙公网安备 33010602011771号