BZOJ 2298 problem a(区间DP)
题意:一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低。”问最少有几个人没有说真话(可能有相同的分数)
思路:考虑最多有多少人说真,那么答案就是n-max.
ai个人分数比他高,bi个人分数比他低,说明[bi+1,n-ai]里面的人分数相同。
用map维护某个区间是否相同.
1 #include<algorithm> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<iostream> 6 #include<vector> 7 #include<map> 8 int f[200005]; 9 std::map<std::pair<int,int>,int>mp; 10 std::vector<int>v[200005]; 11 int n; 12 int main(){ 13 scanf("%d",&n); 14 for (int i=1;i<=n;i++){ 15 int x,y; 16 scanf("%d%d",&x,&y); 17 int L=x+1,R=n-y; 18 if (L>R) continue; 19 if (mp.count(std::make_pair(L,R))){ 20 if (mp[std::make_pair(L,R)]<R-L+1) 21 mp[std::make_pair(L,R)]++; 22 }else{ 23 24 mp[std::make_pair(L,R)]=1; 25 v[R].push_back(L); 26 } 27 } 28 29 for (int i=1;i<=n;i++){ 30 std::vector<int>::iterator j; 31 f[i]=f[i-1]; 32 for (j=v[i].begin();j!=v[i].end();j++){ 33 int t=*j; 34 f[i]=std::max(f[i],f[t-1]+mp[std::make_pair(t,i)]); 35 } 36 } 37 printf("%d\n",n-f[n]); 38 }