【BZOJ2298】【HAOI2011】problem a 动态规划

链接:

#include <stdio.h>
int main()
{
    puts("转载请注明出处[vmurder]谢谢");
    puts("网址:blog.csdn.net/vmurder/article/details/44979323");
}

题解:

一句话 (a,b) 可以理解成一个线段 (a,n?b] 。

然后排个序去下重,最后一个线段的权值 x 就是表示 这 x 人互不冲突,一起算。

然后动态规划求若干条不相交线段的权值最大值,最后用总人数减去就行了。

fi 表示有 i 人时最大权值。

fseqi→ r=max  (    fsi→ r    ,    fsi→ l+si→ x    );

然后一个线段的权值不能单纯看有多少人说的相同,因为可以有100个人都说了同一个线段 (a,a+1] ,那么显然这个线段的权值不是100,而是1。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 101000
using namespace std;
int n,m,p;
struct Eli
{
    int l,r,x;
    void read()
    {
        scanf("%d%d",&l,&r);
        r=n-r;
    }
    bool operator < (const Eli &A)const
    {return r==A.r?l<A.l:r<A.r;}
}s[N];
int f[N];
int main()
{
    freopen("test.in","r",stdin);

    int i;

    scanf("%d",&n);
    for(i=1;i<=n;i++)s[i].read();
    sort(s+1,s+n+1);
    for(i=1;i<=n;i++)
    {
        if(s[i].l>=s[i].r)continue;
        if(s[i].l!=s[i-1].l||s[i].r!=s[i-1].r)
            s[++m].l=s[i].l,s[m].r=s[i].r,s[m].x=1;
        else s[m].x++;
    }

    for(i=1;i<=m;i++)
    {
        while(p<s[i].l)f[p+1]=max(f[p+1],f[p]),p++;
        s[i].x=min(s[i].x,s[i].r-s[i].l);
        f[s[i].r]=max(f[s[i].r],f[s[i].l]+s[i].x);
    }
    while(p<s[m].r)f[p+1]=max(f[p+1],f[p]),p++;
    printf("%d\n",n-f[s[m].r]);

    return 0;
}
时间: 2024-11-06 07:36:26

【BZOJ2298】【HAOI2011】problem a 动态规划的相关文章

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 Outp

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?

bzoj2298 [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 正解:$dp$+树状数组优化. 对于每一个人

[BZOJ2298] [HAOI2011] problem a (dp)

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 Solution a个人在他前

【BZOJ2298】[HAOI2011]problem a DP

[BZOJ2298][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≤

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

HAOI2011 problem b

其实就是容斥原理了 代码: 1 uses math; 2 const maxn=55000; 3 var i,n,a,b,c,d,w,tot:longint; 4 ans:int64; 5 sum,mu,p:array[0..maxn] of int64; 6 procedure get; 7 var i,j,k:longint; 8 check:array[0..maxn] of boolean; 9 begin 10 fillchar(check,sizeof(check),false);