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]);
}
时间: 2024-10-10 17:56:47

BZOJ 2298: [HAOI2011]problem a 动态规划的相关文章

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

Description 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话(可能有相同的分数) Input 第一行一个整数n,接下来n行每行两个整数,第i+1行的两个整数分别代表ai.bi Output 一个整数,表示最少有几个人说谎 Sample Input 32 00 22 2Sample Output1HINT 100%的数据满足: 1≤n≤100000   0≤ai.bi≤n 思路:很明显,有x人比他成绩好,y个人比他成绩差,那剩下

bzoj 2298: [HAOI2011]problem a

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 Source 首先我们需要对问题进

BZOJ 2302 HAOI2011 Problem c 动态规划

题目大意:给定n个人和n个位置,要求生成一个序列ai,然后第1...n个人依次走到第a1...n个位置,如果那个位置已经有人了就走到下一个位置,直到找到一个空位,坐下.如果找完第n个座位还是没有找到就称这个序列不合法 现在已经确定了一些ai,求合法序列的数量 一个序列合法等价于编号≤i的人至少有i个 然后就可以DP辣... 令fi,j表示编号≤i的人有j个的方案数,cnti表示确定编号为i的人的个数,sumi表示编号可以≤i的人的个数 那么有 fi,j=∑j?i+1k=cntifi?1,j?k?

2298: [HAOI2011]problem a

2298: [HAOI2011]problem a 链接 分析: 每个人说的话,可以转化成区间[l,r]的人的排名是一样的,于是就转化成了区间带权覆盖问题. f[i]表示到第i个人,的最多有多少人说了真话,n-f[n]为答案. 对于f[i],如果没有线段以i为右端点,f[i] = f[i-1]. 如果有的话,那么这些线段可以选或不选,不选f[i]=f[i-1]:选,它可以从最近的不想交的地方转移,找到此线段的左端点,然后f[i]=max(f[l]+min(w[l,i],i-l+1)):w表示线段

BZOJ 2301: [HAOI2011]Problem b(莫比乌斯反演 + 容斥原理 + 分块优化)

传送门 Problem 2301. – [HAOI2011]Problem b 2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 3671  Solved: 1643[Submit][Status][Discuss] Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input

BZOJ 2302: [HAOI2011]Problem c( dp )

dp(i, j)表示从i~N中为j个人选定的方案数, 状态转移就考虑选多少人为i编号, 然后从i+1的方案数算过来就可以了. 时间复杂度O(TN^2) --------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> using namespace std; typedef long lo

[BZOJ 2301] [HAOI2011] Problem b

2301: [HAOI2011]Problem b Time Limit: 50 SecMemory Limit: 256 MB Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数n,接下来n行每行五个整数,分别表示a.b.c.d.k Output 共n行,每行一个整数表示满足要求的数对(x,y)的个数 Sample Input 2 2 5 1 5

BZOJ 2301([HAOI2011]Problem b-mobius反演)

2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MB Submit: 2170  Solved: 934 [Submit][Status][Discuss] Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数n,接下来n行每行五个整数,分别表示a.b.c.d.k Out

BZOJ 2301 [HAOI2011]Problem b (容斥+莫比乌斯反演+分块优化 详解)

2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MB Submit: 2096  Solved: 909 [Submit][Status][Discuss] Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数n,接下来n行每行五个整数,分别表示a.b.c.d.k Out