[区间DP][HAOI2011]problem a

题目描述

 

一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低。”问最少有几个人没有说真话(可能有相同的分数)

 

输入格式

 

第一行一个整数n,接下来n行每行两个整数,第i+1行的两个整数分别代表ai、bi

 

输出格式

 

一个整数,表示最少有几个人说谎

 

输入输出样例

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int N=100000+5;
 5 int n,m;
 6 struct hehe{int l,r,v;}a[N],b[N];
 7 bool cmp(hehe x,hehe y) 
 8  {if(x.r!=y.r) return x.r<y.r;
 9   return x.l<y.l;
10  }
11 int f[N];
12 int main()
13  {        
14  scanf("%d",&n); int x,y;
15  for(int i=1;i<=n;i++)    
16   {scanf("%d%d",&x,&y);
17    a[i].l=x+1; a[i].r=n-y;    
18   }    
19  sort(a+1,a+n+1,cmp); 
20  for(int i=1;i<=n;i++)
21   {if(a[i].l>a[i].r) continue;
22   
23    if(a[i].l==b[m].l && a[i].r==b[m].r) 
24                 b[m].v=min(b[m].v+1,b[m].r-b[m].l+1);
25               
26    else         {b[++m]=a[i]; b[m].v=1;
27                 }                    
28   }    
29  int j=1; 
30  for(int i=1;i<=n;i++)
31   {f[i]=f[i-1];
32    while(j<=m && i==b[j].r)
33      {f[i]=max(f[i],f[b[j].l-1]+b[j].v);
34       j++;
35      }
36   }
37  printf("%d",n-f[n]);     
38 return 0;
39  }

 

输入

 

 

3
2 0
0 2
2 2

 

输出

 

1

 

说明/提示

100%的数据满足: 1≤n≤100000 0≤ai、bi≤n

题解

本题问题的转化很巧妙 注意排序要以l为第二关键字,因为要合并,不仅仅是用于DP。。。

https://www.luogu.org/problemnew/solution/P2519
 
posted @ 2019-11-13 21:34  YuXiaoze  阅读(134)  评论(0编辑  收藏  举报