BZOJ 2298: [HAOI2011]problem a 动态规划

2298: [HAOI2011]problem a

Time Limit: 1 Sec  

Memory Limit: 256 MB

题目连接

http://www.lydsy.com/JudgeOnline/problem.php?id=2298

Description

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

Input

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

Output

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

Sample Input

3

2 0

0 2

2 2

Sample Output

1

HINT

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

题意

 

题解:

转换一下,就是求最多有多少个人满足题意

dp[i]表示前i名最多有多少个人没有说谎

那么dp[i]=max(dp[i],dp[j]+sum[j+1][i])其中sum(j+1](i)表示赞同这个区间的人数

代码:

//qscqesze
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <bitset>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
#include <stack>
typedef long long ll;
using namespace std;
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
#define maxn 200500
#define mod 1001
#define eps 1e-9
#define pi 3.1415926
int Num;
//const int inf=0x7fffffff;
const ll inf=999999999;
inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
//*************************************************************************************

struct node
{
    int l,r;
};
vector<int> Q[maxn];
map<pair<int,int> ,int> H;
int dp[maxn];
int main()
{
    int n=read();
    for(int i=0;i<n;i++)
    {
        int x=read(),y=read();
        if(x+y>=n)continue;
        x++,y=n-y;
        if(!H[make_pair(x,y)])Q[y].push_back(x);
        H[make_pair(x,y)]++;
        if(H[make_pair(x,y)]>y-x+1)H[make_pair(x,y)]=y-x+1;
    }
    for(int i=1;i<=n;i++)
    {
        dp[i]=dp[i-1];
        for(int j=0;j<Q[i].size();j++)
            dp[i]=max(dp[i],dp[Q[i][j]-1]+H[make_pair(Q[i][j],i)]);
    }
    printf("%d\n",n-dp[n]);
}

 

posted @ 2015-09-08 17:23  qscqesze  阅读(263)  评论(0编辑  收藏  举报