不难发现两边的活动是交替进行的,我们可以dp

先对时间离散化,设f[i,j]到时间i一个会场选j个活动,另一个会场最多有多少活动,那么f[i,j]=max(f[k,j]+s[k,i],f[k,j-s[k,i]])

然后第一问的答案就是max(min(f[n*2,i],i))

第二问是要求必选一个,那这一定形如中间一段必须选,向左向右分别dp

假设中间那段是(i,j)时最优值是g[i,j]

肯定要预处理时间i前一个会场选j个活动,另一个会场最多有多少活动和时间i到结束一个会场选j个活动,另一个会场最多有多少活动

我们记为fl[i,j],fr[i,j],不难得到g[i,j]=max{min(x+y+s[i,j],fl[i,x]+fr[j,y])} (注意到f[]数组的两个会场取值是对称的)

处理g[i,j]是O(n4)的,拍几组数据可以发现当i,j固定时,随着x的增大,对应最优的y减小

其实主观上也很好理解,肯定是两个会场活动尽量平衡,证明吗……不会……

  1. var fl,fr,f,g:array[..,..] of longint;
  2. a,s,e:array[..] of longint;
  3. i,n,m,k,j,x,y,ans,t:longint;
  4.  
  5. procedure max(var a:longint; b:longint);
  6. begin
  7. if a<b then a:=b;
  8. end;
  9.  
  10. function min(a,b:longint):longint;
  11. begin
  12. if a>b then exit(b) else exit(a);
  13. end;
  14.  
  15. procedure swap(var a,b:longint);
  16. var c:longint;
  17. begin
  18. c:=a;
  19. a:=b;
  20. b:=c;
  21. end;
  22.  
  23. procedure sort(l,r:longint);
  24. var i,j,x:longint;
  25. begin
  26. i:=l;
  27. j:=r;
  28. x:=a[(l+r) shr ];
  29. repeat
  30. while a[i]<x do inc(i);
  31. while x<a[j] do dec(j);
  32. if not(i>j) then
  33. begin
  34. swap(a[i],a[j]);
  35. inc(i);
  36. dec(j);
  37. end;
  38. until i>j;
  39. if l<j then sort(l,j);
  40. if i<r then sort(i,r);
  41. end;
  42.  
  43. function find(l,r,x:longint):longint;
  44. var m:longint;
  45. begin
  46. while l<=r do
  47. begin
  48. m:=(l+r) shr ;
  49. if a[m]=x then exit(m);
  50. if a[m]>x then r:=m- else l:=m+;
  51. end;
  52. end;
  53.  
  54. begin
  55. readln(n);
  56. for i:= to n do
  57. begin
  58. readln(s[i],e[i]);
  59. e[i]:=s[i]+e[i];
  60. inc(t);
  61. a[t]:=s[i];
  62. inc(t);
  63. a[t]:=e[i];
  64. end;
  65. sort(,t);
  66. m:=;
  67. for i:= to t do
  68. if a[i]<>a[m] then
  69. begin
  70. inc(m);
  71. a[m]:=a[i];
  72. end;
  73. for i:= to n do
  74. begin
  75. s[i]:=find(,m,s[i]);
  76. e[i]:=find(,m,e[i]);
  77. inc(g[s[i],e[i]]);
  78. end;
  79. for i:= to m do
  80. for j:=i+ to m do
  81. inc(g[i,j],g[i,j-]);
  82. for j:= to m do
  83. for i:=j- downto do
  84. inc(g[i,j],g[i+,j]);
  85. for i:= to m+ do
  86. for j:= to n do
  87. begin
  88. fl[i,j]:=-n;
  89. fr[i,j]:=-n;
  90. end;
  91. fl[,]:=; fr[m+,]:=;
  92. for i:= to m do
  93. for j:= to i- do
  94. for k:= to n do
  95. begin
  96. max(fl[i,k],fl[j,k]+g[j,i]);
  97. if k>=g[j,i] then max(fl[i,k],fl[j,k-g[j,i]]);
  98. end;
  99. for i:=m downto do
  100. for j:=i+ to m+ do
  101. for k:= to n do
  102. begin
  103. max(fr[i,k],fr[j,k]+g[i,j]);
  104. if k>=g[i,j] then max(fr[i,k],fr[j,k-g[i,j]]);
  105. end;
  106. ans:=;
  107. for i:= to n do
  108. max(ans,min(fl[m,i],i));
  109. writeln(ans);
  110. for i:= to m do
  111. for j:=i to m do
  112. begin
  113. y:=g[j,m];
  114. for x:= to g[,i] do
  115. begin
  116. while (y>) and (min(x+y-+g[i,j],fl[i,x]+fr[j,y-])>=min(x+y+g[i,j],fl[i,x]+fr[j,y])) do dec(y);
  117. max(f[i,j],min(x+y+g[i,j],fl[i,x]+fr[j,y]));
  118. end;
  119. end;
  120.  
  121. for i:= to n do
  122. begin
  123. ans:=;
  124. for x:= to s[i] do
  125. for y:=e[i] to m do
  126. max(ans,f[x,y]);
  127. writeln(ans);
  128. end;
  129. end.

bzoj2436的更多相关文章

  1. BZOJ2436 [Noi2011]Noi嘉年华 【dp】

    题目链接 BZOJ2436 题解 看这\(O(n^3)\)的数据范围,可以想到区间\(dp\) 发现同一个会场的活动可以重叠,所以暴力求出\(num[l][r]\)表示离散化后\([l,r]\)的完整 ...

  2. 【BZOJ2436】【NOI2011】NOI嘉年华(动态规划)

    [BZOJ2436]NOI嘉年华(动态规划) 题面 BZOJ 题解 考虑第一问如何求解 发现状态与选择了哪些活动无关,只与时间有关 设\(f[i][j]\)表示前\(i\)个单位时间(离散后),一个嘉 ...

  3. 【BZOJ-2436】嘉年华 DP + 优化

    2436: [Noi2011]Noi嘉年华 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 529  Solved: 382[Submit][Statu ...

  4. bzoj2436: [Noi2011]Noi嘉年华

    我震惊了,我好菜,我是不是该退役(苦逼) 可以先看看代码里的注释 首先我们先考虑一下第一问好了真做起来也就这个能想想了 那么离散化时间是肯定的,看一手范围猜出是二维DP,那对于两个会场,一个放自变量, ...

  5. OI动态规划&&优化 简单学习笔记

    持续更新!! DP的难点主要分为两类,一类以状态设计为难点,一类以转移的优化为难点. DP的类型 序列DP [例题]BZOJ2298 problem a 数位DP 常用来统计或者查找一个区间满足条件的 ...

  6. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

随机推荐

  1. crawler spec

    使用说明 0.写在前面 1.本程序完成的抓取网页并保存其文件的工作. 2.目前的版本还需将工程文件导入eclipse中运行. 3.加载主类MyCrawler生成可执行文件. 4.程序主界面: 1 准备 ...

  2. SQL Server 2008之数据库大型应用解决方案总结

    着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的互联网应用,每天百万级甚至上亿的PV无疑对数据库造成了相当高的负载.对于系统的稳定性和扩展性造成了极大的问题. 一. ...

  3. android studio 完整安装教程,已完全实践过

    直接去官方下载包含android sdk的安装包(约813M),之前就是没有包含android sdk (约214M)所以需要另外从dl-google下载android sdk,太麻烦了.下面就一步步 ...

  4. 【BZOJ】【2253】【WC 2010 BeijingWC】纸箱堆叠

    树套树 Orz zyf 我的树套树不知道为啥一直WA……只好copy了zyf的写法TAT 这题还可以用CDQ分治来做……但是蒟蒻不会…… //y坐标的树状数组是按权值建的……所以需要离散化…… /** ...

  5. POJ 3292

    Semi-prime H-numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7059   Accepted: 3 ...

  6. JsRender系列demo(2)多模板-template

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  7. Android 手机震动 设置震动时间

    开启震动,单次,5秒: Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); //震动5秒 vibrator.vibra ...

  8. 匿名用户访问sharepoint2010中的列表

    Allow anonymous users to access listitems on a publishing site in SharePoint 2010 https://knowledge. ...

  9. hdu1151 Air Raid

    http://acm.hdu.edu.cn/showproblem.php?pid=1151 增广路的变种2:DAG图的最小路径覆盖=定点数-最大匹配数 #include<iostream> ...

  10. Linux Versus Windows, Ubuntu/Mint V XP/Vista/7

    原文:http://petermoulding.com/linux_versus_windows_ubuntu_mint_v_xp_vista_7 Linux Versus Windows, Ubun ...