BZOJ 2436 Noi嘉年华(优化DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2436

题意:有一些活动,起始时间持续时间已知。有两个场地。每个活动最多只能在一个场地举行,且两个场地同一时间不能都举行活动。但是同一场地同一时间可以举行多个活动。要求的是两个场地中活动数目少的场地的活动数目的最大值S。再输出某个活动必须被安排时的S值。

思路:我直接粘贴原思路了。

区间离散化,设A={嘉年华1的活动}, B={嘉年华2的活动},C={未安排的活动}。
设num[i][j]为包含在区间[i,j]中的区间个数;
pre[i][j]为在区间[0,i]中放入j个区间到B后,最多能放入A的个数;
suf[i][j]为在区间[i, +∞)中放入j个区间到B后,最多能放入A的个数。

那么第一问答案为:max(min(i,suf[0][i]))。

int pre[N][N],suf[N][N],g[N][N],L[N],R[N];
int p[N],n,num[N][N],m;

void DP()
{
    int i,j,k;
    FOR0(i,N) FOR0(j,N) pre[i][j]=suf[i][j]=g[i][j]=-INF;
    pre[0][0]=suf[m-1][0]=0;
    FOR0(i,m)
    {
        for(j=0;j<=n;j++) if(pre[i][j]>=0)
        {
            upMax(pre[i][pre[i][j]],j);
        }
        for(j=n-1;j>=0;j--) upMax(pre[i][j],pre[i][j+1]);
        for(j=0;j<=n+1;j++) for(k=i+1;k<m;k++) if(pre[i][j]>=0)
        {
            upMax(pre[k][pre[i][j]],j+num[i][k]);
        }
    }
    for(i=m-1;i>=0;i--)
    {
        for(j=0;j<=n+1;j++) if(suf[i][j]>=0)
        {
            upMax(suf[i][suf[i][j]],j);
        }
        for(j=n-1;j>=0;j--) upMax(suf[i][j],suf[i][j+1]);
        for(j=0;j<=n;j++) for(k=i-1;k>=0;k--) if(suf[i][j]>=0)
        {
            upMax(suf[k][suf[i][j]],j+num[k][i]);
        }
    }
    int x,y;
    FOR0(i,m) FOR0(j,m)
    {
        y=n;
        for(x=0;x<=n;x++)
        {
            while(y>=0&&x+y>num[i][j]+pre[i][x]+suf[j][y]) y--;
            if(y>=0) upMax(g[i][j],x+y);
        }
    }
    int ans=0;
    for(i=0;i<=n;i++) upMax(ans,min(i,suf[0][i]));
    PR(ans);
    FOR0(i,n)
    {
        ans=0;
        for(j=0;j<=L[i];j++) for(k=R[i];k<m;k++)
        {
            upMax(ans,g[j][k]);
        }
        PR(ans);
    }
}

int main()
{
    RD(n);
    int i,j;
    FOR0(i,n)
    {
        RD(L[i],R[i]); R[i]=R[i]+L[i];
        p[m++]=L[i];
        p[m++]=R[i];
    }
    sort(p,p+m);
    m=unique(p,p+m)-p;
    FOR0(i,n)
    {
        L[i]=lower_bound(p,p+m,L[i])-p;
        R[i]=lower_bound(p,p+m,R[i])-p;
    }
    FOR0(i,m)
    {
        FOR0(j,n) if(L[j]>=i) num[i][R[j]]++;
        for(j=i+1;j<m;j++) num[i][j]+=num[i][j-1];
    }
    DP();
}

BZOJ 2436 Noi嘉年华(优化DP),布布扣,bubuko.com

时间: 2024-10-06 00:01:23

BZOJ 2436 Noi嘉年华(优化DP)的相关文章

BZOJ 2436 NOI嘉年华

http://www.lydsy.com/JudgeOnline/problem.php?id=2436 题意:两个会场不能同时表演,但是同一个时间可以同时表演,要求让两个会场表演数量最小的最大,然后限制某一个必须表演,最小的要最大是多少.. 思路:先将时间离散化,预处理数组num[i][j],代表时间i到时间j一共包含了几个表演. 然后进行dp,pre[i][j],代表1~时间i,会场A表演了j个,此时会场B最多能表演几个. pre[i][j]=max(pre[i][j+1],pre[k][j

BZOJ 3156: 防御准备 斜率优化DP

3156: 防御准备 Description Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战线花费值. Sample Input 10 2 3 1 5 4 5 6 3 1 2 Sample Output 18 HINT 1<=N<=10^6,1<=Ai<=10^9 题解: 斜率优化DP: 首先将数组倒置 设定dp[i] 为前i的点的最优答案 易得 dp[i] = min{dp[j

BZOJ - 1010【斜率优化DP】

1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9961  Solved: 4056[Submit][Status][Discuss] Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压 缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过 压缩后变成一维长度为Ci.为了方便整理

【BZOJ 2436】 2436: [Noi2011]Noi嘉年华 (区间DP)

2436: [Noi2011]Noi嘉年华 Description NOI2011 在吉林大学开始啦!为了迎接来自全国各地最优秀的信息学选手,吉林大学决定举办两场盛大的 NOI 嘉年华活动,分在两个不同的地点举办.每个嘉年华可能包含很多个活动,而每个活动只能在一个嘉年华中举办. 现在嘉年华活动的组织者小安一共收到了 n个活动的举办申请,其中第 i 个活动的起始时间为 Si,活动的持续时间为Ti.这些活动都可以安排到任意一个嘉年华的会场,也可以不安排. 小安通过广泛的调查发现,如果某个时刻,两个嘉

[bzoj 1911][Apio 2010]特别行动队(斜率优化DP)

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1911 分析: 首先可以的到裸的方程f[i]=max{f[j]+a*(Si-Sj)^2+b*(Si-Sj)+c} 0<j<i 简化一下方程,我们知道对于一次项,最后结果肯定是b*Sn 所以可以写成f[i]=max{f[j]+a*(Si-Sj)^2+c} 0<j<i 我们不妨设0<x<y<i,且x比y优 即f[x]+a*(Si-Sx)^2+c>f[y]+a*

BZOJ 1855 股票交易(单调队列优化DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1855 题意:最近lxhgww又迷上了投资股票, 通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价为每股APi,第i天的股票卖出价为每股BPi(数据保证对于每 个i,都有APi>=BPi),但是每天不能无限制地交易,于是股票交易所规定第i天的一次买入至多只能购买ASi股,一次卖出至多只能卖出BS

BZOJ 1835 基站选址(线段树优化DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1835 题意:有N个村庄坐落在一条直线上,第 i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci.如果在距离第i个村 庄不超过Si的范围内建立了一个通讯基站,那么就成它被覆盖了.如果第i个村庄没有被覆盖,则需要向他们补偿,费用为Wi.现在的问题是,选择基站的位 置,使得总费用最小. 思路: 另外,程序中的n=n+1,m=

BZOJ 1010 玩具装箱toy(四边形不等式优化DP)(HNOI 2008)

Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的.同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一个容器中,那么容器的长度将为 x=j-i+Sigma(Ck) i<

bzoj 3437 斜率优化DP

写题解之前首先要感谢妹子. 比较容易的斜率DP,设sum[i]=Σb[j],sum_[i]=Σb[j]*j,w[i]为第i个建立,前i个的代价. 那么就可以转移了. 备注:还是要感谢妹子. /************************************************************** Problem: 3437 User: BLADEVIL Language: C++ Result: Accepted Time:3404 ms Memory:39872 kb **