[BZOJ]2436 [NOI2011] Noi嘉年华 DP

NOI/NOIP中的DP(动态规划)类型 1、背包模型 包括0-1背包、无限背包、有限背包、有价值背包、小数背包(贪心即可)等,是极为经典的模型,其转化与优化也是很重要的。 2、最长非降子序列模型 改版:渡河问题、合唱队型等 3、最大子段和模型 改版:K大子段和、最佳游览,最大子矩阵和等。 4、LCS模型 改版:回文字串、多串的LCS等 5、括号序列模型 改版:关灯问题(TSOJ)、charexp(TSOJ)、最大算式等,核心思想在于以串的长度为阶段。 6、递推模型 这类题是属于徘徊在DP与递归之间得一类题,本质是类似于记忆化搜索的一种填表,有很强的数学味。 7、线段覆盖问题 改版:Tom的烦恼(TOJ)等。经常利用到离散化等技巧辅助。 8、 ……………… ……………… 立即下载

2436: [Noi2011]Noi嘉年华

Time Limit: 10 Sec   Memory Limit: 128 MB
Submit: 748   Solved: 492
[ Submit][ Status][ Discuss]

Description

NOI2011 在吉林大学开始啦!为了迎接来自全国各地最优秀的信息学选手,
吉林大学决定举办两场盛大的 NOI 嘉年华活动,分在两个不同的地点举办。每
个嘉年华可能包含很多个活动,而每个活动只能在一个嘉年华中举办。 
现在嘉年华活动的组织者小安一共收到了 n个活动的举办申请,其中第 i 个
活动的起始时间为 Si,活动的持续时间为Ti。这些活动都可以安排到任意一个嘉
年华的会场,也可以不安排。 
小安通过广泛的调查发现,如果某个时刻,两个嘉年华会场同时有活动在进
行(不包括活动的开始瞬间和结束瞬间),那么有的选手就会纠结于到底去哪个
会场,从而变得不开心。所以,为了避免这样不开心的事情发生,小安要求不能
有两个活动在两个会场同时进行(同一会场内的活动可以任意进行)。 
另外,可以想象,如果某一个嘉年华会场的活动太少,那么这个嘉年华的吸
引力就会不足,容易导致场面冷清。所以小安希望通过合理的安排,使得活动相
对较少的嘉年华的活动数量最大。 
此外,有一些活动非常有意义,小安希望能举办,他希望知道,如果第i 个
活动必须举办(可以安排在两场嘉年华中的任何一个),活动相对较少的嘉年华
的活动数量的最大值。

Input

 

输入的第一行包含一个整数 n,表示申请的活动个数。 
接下来 n 行描述所有活动,其中第 i 行包含两个整数 Si、Ti,表示第 i 个活
动从时刻Si开始,持续 Ti的时间。

Output


输出的第一行包含一个整数,表示在没有任何限制的情况下,活动较少的嘉
年华的活动数的最大值。 
接下来 n 行每行一个整数,其中第 i 行的整数表示在必须选择第 i 个活动的
前提下,活动较少的嘉年华的活动数的最大值。

 

Sample Input


5
8 2
1 5
5 3
3 2
5 3

Sample Output

2
2
1
2
2
2

HINT


在没有任何限制的情况下,最优安排可以在一个嘉年华安排活动 1, 4,而在

另一个嘉年华安排活动 3, 5,活动2不安排。


1≤n≤200 0≤Si≤10^9

 

1≤Ti≤ 10^9

 

Source

[ Submit][ Status][ Discuss]


HOME Back

这道题真的难....之前考试的时候一开始拿到这道题的时候以为是二分图, 后面觉得不对应该是网络流, 看了下数据范围正好合适....然而半个小时过去并没有建出来图. 觉得那就只有可能是n^3的算法... 那就DP吧, 设了好几个状态都搞不出来, 想了半天终究放弃.

没想到正解居然有4个DP数组(有一个只起维护作用). 我平常做DP最多就用到两个, 这次一共用4个...果然自己还是太弱了, DP什么的还得再练练. 

以下引自whjpji的题解:

首先将所有的区间离散化,这一步很好实现。 
然后就是求三个数组 num[i][j],pre[i][j],suf[i][j]  
num[i][j]=[i,j] 区间内的线段个数。 
pre[i][j]=[0,i] 区间内给B  j 个线段,A得到最多线段个数。 
suf[i][j]=[j,∞) 区间内给B  j 个线段,A得到最多线段个数。

容易推出 num[i][j] 。我们枚举 i ,对于所有左端点 Lt 大于等于 i 的区间右端点 Rt ,标记 num′[i][Rt]++ ,那么显然 num[i][j]=∑jk=inum′[i][k] ,这一个求和的步骤,可以将所有的 num[i][t] 在 O(n) 时间内通过递推求前缀和的形式求出。

然后就是 pre[i][j]和suf[i][j] 了,这两个其实基本上一样,下面只讲 pre[i][j] 的求法。

pre[i][j]=max{max0≤k<i{pre[k][j]+num[k][i],pre[k][j−num[k][i]]}}

(注:区间 [0,i] 中给B放入 j 个线段,可以枚举 k<i ,要么在区间 [0,k] 中给B放入 j 个线段, (k,i] 这段里的所有线段都给A;要么在区间 [0,k] 中给B放入 j−num[j][k] 个线段, (k,i] 这段里的所有线段都给B)

然后就要求一个 g[i][j] , g[i][j]=[i,j] 区间内的所有线段必须选,使得A和B中保含线段少的那个集合里的线段个数最多多少。 

g[i][j]=maxx,y∈[0,n]{min{x+y,pre[i][x]+num[i][j]+suf[j][y]}}

令 
fx,y=min{x+y,pre[i][x]+num[i][j]+suf[j][y]}

x 是 [i,j] 左边放入B中的线段个数, y 是 [i,j] 右边放入B中的线段个数

在 x 固定的情况下, fx,y随y 递增呈单凸特点,因此可以利用这一性质,维护两个指针 x,y ,遍历 x ,对于每个 x ,可以在期望复杂度 O(1) 时间内,移动指针 y 并快速找到使得当前的 fx,y 最大的 y 。

#include<stdio.h>
#include<cstring>
#include<algorithm>
#define loss(a) memset(a, -10, sizeof(a))
using namespace std;
const int maxn = 410;
struct point{int l, r;}a[maxn];
int n, cnt, top, ans, q[maxn];
int f[maxn][maxn], c[maxn][maxn], g[maxn][maxn], num[maxn][maxn];
int main(){
    scanf("%d", &n);
    loss(f), loss(g), loss(c);
    for(int i = 1; i <= n; ++i){
        scanf("%d%d", &a[i].l, &a[i].r);
        a[i].r += a[i].l;
        q[++cnt] = a[i].l, q[++cnt] = a[i].r;
    }
    sort(q + 1, q + cnt + 1);
    top = unique(q + 1, q + cnt + 1) - q - 1;
    for(int i = 1; i <= n; ++i){
        a[i].l = lower_bound(q + 1, q + top + 1, a[i].l) - q;
        a[i].r = lower_bound(q + 1, q + top + 1, a[i].r) - q;
    }
    for(int i = 1; i <= top; ++i){
        for(int j = 1; j <= n; ++j)
            if(a[j].l >= i) ++num[i][a[j].r];
        for(int j = i + 1; j <= top; ++j)
            num[i][j] += num[i][j - 1];
    }
    f[1][0] = num[1][1], f[1][num[1][1]] = 0;
    for(int i = 2; i <= top; ++i)
        for(int j = 0; j <= n; ++j)
            for(int k = 1; k < i; ++k){
                f[i][j] = max(f[i][j], max(f[k][j] + num[k][i], f[k][j - num[k][i]]));
    }
    for(int i = 0; i <= n; ++i) ans = max(ans, min(i, f[top][i]));
    printf("%d\n", ans);
    g[top][0] = num[top][top], g[top][num[top][top]] = 0;
    for(int i = top - 1; i; --i)
        for(int j = 0; j <= n; ++j)
            for(int k = i + 1; k <= top; ++k)
                g[i][j] = max(g[i][j], max(g[k][j] + num[i][k], g[k][j - num[i][k]]));
    for(int i = 1; i <= top; ++i)
        for(int j = i; j <= top; ++j){
            for(int x = 0, y = n; x <= n; ++x){
                while(y >= 0 && x + y > num[i][j] + f[i][x] + g[j][y]) y--;
                if(y >= 0) c[i][j] = max(c[i][j], x + y);
            }
        }
    for(int i = 1; i <= n; ++i){
        ans=0;
        for(int j = 1; j <= a[i].l; ++j)
            for(int k = a[i].r; k<=top; ++k)
                ans=max(ans, c[j][k]);
        printf("%d\n",ans);
    }
}


硬件开发流程 研发流程在一个有一定规模的企业中起到了非常重要的作用,也是一个产品或者项目成功量产出货依赖的平台体系,作为工程师如果想要走的更远,就必须了解流程体系,了解如何对产品的开发质量进行更好的管控。... 阅读详情

相关推荐

深入解析CAN总线BusOff故障的检测与恢复机制

本文深入解析了CAN总线BusOff故障的检测与恢复机制。BusOff是CAN节点因发送错误过多而被强制离线的一种严重状态。文章详细阐述了其触发原理,即发送错误计数器(TEC)超过255,并重点介绍了通过软件实现的快慢恢复机制,以增强网络在异常情况下的稳定性和韧性。

weixin_29158047的博客 523

Noip DP 总结 1

对各位学NOI的大佬对于DP的总结的总结。———-DP数据范围:———1} 15,20 -> 状压/暴搜 2} 30 -> 折半搜索-二分搜索 3} 50 -> N^4 DP 4} 100~200 -> Floyed,图论等 5} 1000~2000 -> N^2 DP 6} 1e5 -> ……可能不是DP 7} 1e6

AVALON_X的博客 627

Python使用netmiko配置华为交换机

1.netmiko就是专门为网络设备做的模块,非常强大。1.更适合网络设备的自动化运维模块。2、批量配置变更、备份。1.安装netmiko。2. 创建SSH连接。一、netmiko介绍。

博然的宝藏库 2795

noip dp总结

最后做的两个题(飞扬的小鸟、过河)巨坑,,直接做了两天+两个晚上(还都没做出来)实在非常失败 先分题说一下特点: 子串:dp其实挺裸的(相对于思维巨题),要注意字数和连续两个条件 花匠:神题,贪心,要证明正确性还是很模糊的 子矩阵:搜索+dp 换教室:期望dp入门题,难点是期望的机理、、 引水入城:搜索+最小区间覆盖、 表达式的值:中缀表达式 能量项链:区间dp+特

-----PSI----- 1047

U盘文件变exe?3步教你用火绒+批处理脚本恢复隐藏文档(附注册表修复)

本文详细解析了U盘文件被病毒隐藏并伪装成exe文件的原理,并提供了三步解决方案:首先使用火绒安全软件进行全盘查杀清除病毒;其次通过批处理脚本批量恢复被隐藏的文件属性;最后修复被篡改的注册表设置,彻底解决文件无法显示的问题,帮助用户安全找回数据并加固系统防护。

weixin_28622215的博客 912

BERT + BiLSTM-CRF 处理流程

BERT是一个基于 Transformer 的预训练语言模型。与传统的语言模型不同,BERT 是双向的,即它同时利用上下文信息进行词表示学习。BERT 在大规模语料库上进行预训练,可以捕捉到深层次的语言知识和上下文关系,生成非常丰富的词向量表示。在序列标注任务中,BERT 被用作输入文本的编码器,将每个词映射为上下文相关的词嵌入(embeddings)。

AI Agent 首席体验官 2254

【NOI模拟赛】寄(树形DP)

原本以为是OID带坏外校风气,结果是OID联合外校搞我们

DD(XYX)的硫氰化氘博客 274

C++碰撞检测库FCL安装(MinGW,CMake)

FCL碰撞检测库、libccd\Eigen库编译配置,全流程问题记录

weixin_45650767的博客 4673

【NOI2019】机器人(区间DP)(记忆化搜索)(下降幂多项式)

传送门 题解: 首先考虑一个区间DP,枚举区间中的最大值最右边的位置,左边所有点不大于这个位置,右边所有点严格小于这个位置。 容易发现这个位置只能是中间几个地方。 设 dp[l][r][x]dp[l][r][x]dp[l][r][x] 表示考虑区间 [l,r][l,r][l,r],其中最大值为 xxx 的时候的合法方案数。 容易注意到有转移: dp[l][r][x]=∑∣(r−i)−(i−l)∣...

zxyoi_dreamer的博客(不定期诈尸) 461

海康安防平台接口调试指南:从签名生成到Vue项目集成

本文详细解析了海康安防平台接口认证规则,从签名生成到Vue项目集成的完整流程。通过核心机制解析、签名工具使用技巧及Vue项目中的优雅集成方案,帮助开发者高效完成接口调试,避免常见问题。特别适合需要将海康安防平台接口集成到Vue项目中的开发者参考。

weixin_42533120的博客 437

基于STM32L4XX 、HAL库的TMC2209-LA-T步进电机驱动器驱动程序应用设计

/ R/W=0 表示写。uint32_t gconf_value = (0 << 0) // I_scale_analog: 禁用,使用UART控制电流。uint32_t ihold_irun = (8 << 0) // 保持电流 8/31 最大值。

PP_Cottage的博客 448

[BZOJ 2436][NOI 2011]NOI嘉年华(DP优化)

题目链接http://www.lydsy.com/JudgeOnline/problem.php?id=2436思路这个题做起来很复杂很繁琐。。。以下思路整理自http://blog.youkuaiyun.com/whjpji/article/details/7547159 首先将所有的区间离散化,这一步很好实现。 然后就是求三个数组num[i][j],pre[i][j],suf[i][j]num[i][j

某沙茶的OI代码库 2309

SAP_SD模块更改销售订单定价简介

方式优点缺点适用场景MASS简单,无需开发不能触发重新定价逻辑修改特定字段BDC (VA02)可模拟人工操作维护复杂,速度慢少量订单批改稳定、安全需ABAP支持推荐用于批量重新定价VBOF标准重算返利仅适返利类条件返利更新通过本文,我们了解了 SAP 的[SAP_SD模块更改销售订单定价]的基本概念和应用方法。希望这些信息能帮助您在实际工作中更好地使用 SAP 系统,提高工作效率和管理水平。更多SAP文章请点击更多SAP文章更新,大家一起学习进步!!!

我小时候很黑的博客 706

[BZOJ2436][Noi2011]Noi嘉年华(dp)

永远不要放弃你真正想要的东西,等待虽难,但后悔更甚。

zyf2000 1027

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

[BZOJ2436][Noi2011]Noi嘉年华(DP)

Address 洛谷 P1973 BZOJ 2436 LOJ #2446 Solution NOIP 2018 前的最后一篇博文,为自己的爆零做好准备 先把区间端点离散化 预处理出: cnt[l][r]cnt[l][r]cnt[l][r] 表示包含于 [l,r][l,r][l,r] 的区间个数 计算两个 DP 值 f[i][j]f[i][j]f[i][j] 表示 [1,i][1,i][1,i] ...

女装的你,如此好看! 349

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【BZOJ2436】【NOI2011】—NOI嘉年华(dp)

传送门 发现这要把一段的活动归到一边去 先离散化时间 num[l][r]num[l][r]num[l][r]表示全部在[l,r][l,r][l,r]内的活动的个数 pre[i][j]pre[i][j]pre[i][j]表示前iii的时间内给一边jjj个另一边最多有多少个 则pre[i][j]=Maxkmax(pre[k][j]+num[k][i],pre[k][j−num[k][i]])pre[i...

Stargazer的博客 311

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

BZOJ 2436 [NOI2011] NOI嘉年华 DP

BZOJ 2436 [NOI2011] NOI嘉年华 题目描述 Description NOI2011 在吉林大学开始啦!为了迎接来自全国各地最优秀的信息学选手,吉林大学决定举办两场盛大的 NOI 嘉年华活动,分在两个不同的地点举办。每个嘉年华可能包含很多个活动,而每个活动只能在一个嘉年华中举办。 现在嘉年华活动的组织者小安一共收到了 n个活动的举办申请,其中第 i 个活动的起始时间为 Si...

Chlience的博客 782

bzoj 2436: [Noi2011]Noi嘉年华 (dp)

2436: [Noi2011]Noi嘉年华 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 525  Solved: 378 [Submit][Status][Discuss] Description NOI2011 在吉林大学开始啦!为了迎接来自全国各地最优秀的信息学选手, 吉林大学决定举办两场盛大的 NOI 嘉年华活动,分在两个

clover_hxy的博客 1160

【bzoj 2436】[Noi2011] Noi嘉年华 (dp)

淡语轻描怎道碧海深渊

reverie_mjp的博客 463

【BZOJ2436】【NOI2011】NOI嘉年华(DP)

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

დ♂Hany01's Blog Space♂ღ 406

BZOJ2436 [Noi2011]Noi嘉年华 【dp】

题目链接 BZOJ2436 题解 看这\(O(n^3)\)的数据范围,可以想到区间\(dp\) 发现同一个会场的活动可以重叠,所以暴力求出\(num[l][r]\)表示离散化后\([l,r]\)的完整活动数 我们的目标求出\(F[l][r]\)表示\([l,r]\)必须选时,二者的最小值 我们不妨令\(A\)选了\([l,r]\),我们枚举\(A\)在\([1,l - 1]\)和\([r + 1,...

weixin_30443813的博客 119

[BZOJ2436] [NOI2011] Noi嘉年华 [单调性优化DP]

Link https://www.lydsy.com/JudgeOnline/problem.php?id=2436 题意 安排 nnn 个活动,每个活动举办时间 (si,ti)(s_i,t_i)(si​,ti​) ,同一时间两个场地只能有一个办活动(可以办好多个)。 对于每个询问,钦定一个活动必须举办(或者不钦定),要求最大化举办的活动数量较少的场地举办的活动数量。 输出这个最大值。 好 我...

最后一次修改 285

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

2436: [Noi2011]Noi嘉年华 Description NOI2011 在吉林大学开始啦!为了迎接来自全国各地最优秀的信息学选手,吉林大学决定举办两场盛大的 NOI 嘉年华活动,分在两个不同的地点举办。每个嘉年华可能包含很多个活动,而每个活动只能在一个嘉年华中举办。现在嘉年华活动的组织者小安一共收到了 n个活动的举办申请,其中第 i 个活动的起始时间为 Si...

weixin_30912051的博客 103

【BZOJ2436】NOI嘉年华(NOI2011)-区间DP+决策单调性优化

测试地址:NOI嘉年华 做法:本题需要用到区间DP+决策单调性优化。 因为两个会场不能同时有活动,不难想到活动一定会排成,在A会场一段,又在B会场一段,这样交替的形式。很快想到区间DP来决策每一段是在A会场还是B会场。 我们首先将所有时刻离散化,接着为了转移方便,我们显然应该处理出num(i,j)num(i,j)num(i,j):时刻i,ji,ji,j之间的活动数量。这个直接O(n3)O(n...

Maxwei_wzj的OI世界 426

BZOJ 2436 Noi嘉年华 (dp)

2436: [Noi2011]Noi嘉年华Time Limit: 10 Sec Memory Limit: 128 MB DescriptionNOI2011 在吉林大学开始啦!为了迎接来自全国各地最优秀的信息学选手,吉林大学决定举办两场盛大的 NOI 嘉年华活动,分在两个不同的地点举办。每个嘉年华可能包含很多个活动,而每个活动只能在一个嘉年华中举办。 现在嘉年华活动的组织者小安一共收到了 n个

w4149 456
上一篇: [BZOJ]1079 [SCOI2008]着色方案 记忆化搜索
下一篇: [BZOJ]2437 [NOI2011] 兔兔与蛋蛋 二分图博弈
MaxMercer
博客等级 码龄10年 55粉丝 261原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值