[区间DP][HAOI2011]problem a
Posted yuxiaoze
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[区间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。。。
以上是关于[区间DP][HAOI2011]problem a的主要内容,如果未能解决你的问题,请参考以下文章
bzoj2298: [HAOI2011]problem a DP