\(\\\)

\(Description\)


有\(N\)个人的环,每个人需要至少\(x_i\)种不同的物品,并且要求任意相邻的两人都没有相同的物品,求最少需要多少种物品。

  • \(N\in [0,2\times 10^4]\),\(x_i\in [0,10^5]\)

\(\\\)

\(Solution\ \text O(NlogN)\)


  • 考虑二分答案,首先注意到相邻两人所有物品种类一定不同,所以下界是相邻两人限制之和取\(max\)。

  • 注意到限制只是两两之间的,如果是奇环的话只有头尾会出问题,所以上界最多只需要下界的二倍。

  • 验证的部分就很神仙了,思想是\(min-max\)转化:

    • 设\(mx[i]\)表示在二分总个数为\(x\)的情况下,第\(i\)个位置的人所得物品中,与第一个人相同的个最多有多少个,同理设\(mn[i]\)表示此情况下第\(i\)个位置的人与第一个人最少有多少个相同的物品。

    • 最大部分的转移:考虑要求与前一个不同,所以从第一个人得到的所有物品里去掉前一个最少得到的即可\(\begin{align}mx[i]=min(x[i],x[1]-mn[i-1])\end{align}\)

    • 最小部分的转移:所求即为第一个人得到的所有物品里,去掉当前人最多能够不与第一个人重合的部分,但是还要考虑两人不能重合,所以有\(\begin{align}mn[i]=max(0,a[i]-(x-(a[i-1]-mx[i-1])-a[1]))\end{align}\)具体可以理解成自由部分即为全集去掉第一个人的所有和前一个人的所有,再减掉两个人可行的最大交集。

    • 若最后一个人的最小值可以为\(0\)则证明不会与第一个人冲突,合法。

\(\\\)

\(Code\)


#include<cmath>
#include<cctype>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 20010
#define R register
#define gc getchar
using namespace std;inline int rd(){int x=0; bool f=0; char c=gc();while(!isdigit(c)){if(c=='-')f=1;c=gc();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}return f?-x:x;
}int n,l,r,a[N],mx[N],mn[N];inline bool valid(int x){mn[1]=mx[1]=a[1];for(R int i=2;i<=n;++i){mx[i]=min(a[i],a[1]-mn[i-1]);mn[i]=max(0,a[i]-(x-(a[i-1]-mx[i-1])-a[1]));}return  (mn[n]==0);
}int main(){n=rd();for(R int i=1;i<=n;++i) a[i]=rd();l=a[n]+a[1];for(R int i=1;i<n;++i) l=max(l,a[i]+a[i+1]);r=l*2;while(l<r){int mid=(l+r)>>1;valid(mid)?r=mid:l=mid+1;}printf("%d\n",l);return 0;
}

\(\\\)

\(Solution\ \text O(N)\)


这题还有更神仙的做法

  • 首先必须考虑的限制不变,还是两两相邻求和最大值。

  • 考虑另外的限制,即出现奇环时问题的解决方案,此时神仙们怎么就能想到另外一个切入点,每个相同的物品至多只能分给\(\lfloor\frac{N}{2}\rfloor\)个人,因为再多一个人必然会出现相邻的冲突。那么假设\(sum=\sum x_i\),那么\(sum\)这么多的物品中每一类最多只能有\(\lfloor\frac{N}{2}\rfloor\)个有贡献,所以只考虑总和的情况下,至少需要\(\Big\lceil\frac{sum}{\big\lfloor\frac{N}{2}\big\rfloor}\Big\rceil\)种。

  • 对两个角度的答案取最大即可。

\(\\\)

\(Code\)


#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 20010
#define R register
#define gc getchar
using namespace std;inline int rd(){int x=0; bool f=0; char c=gc();while(!isdigit(c)){if(c=='-')f=1;c=gc();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}return f?-x:x;
}int n,ans,sum,a[N];int main(){n=rd();for(R int i=1;i<=n;++i) sum+=(a[i]=rd());ans=max(a[n]+a[1],(int)ceil((double)sum/(n/2)));for(R int i=1;i<n;++i) ans=max(ans,a[i]+a[i+1]);printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/SGCollin/p/9638930.html

[ ZJOI 2006 ] Trouble相关推荐

  1. [ZJOI 2006]书架

    Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下 ...

  2. 解题:ZJOI 2006 书架

    题面 学习了如何在维护序列的平衡树上查找某个数:按初始的顺序定个权值,然后每次找那个权值的DFS序即可.具体实现就是不停往上跳,然后是父亲的右儿子就加上父亲的左儿子,剩下的就是继续熟悉无旋树堆 1 # ...

  3. Scott Hanselman的2006 Windows最终开发者和高级用户工具列表

    enjoyed this post, or this blog, please 喜欢这篇文章或博客,请make a secure tax-deductable donation to the Amer ...

  4. Jiangsheng的CSDN Digest(May 15, 2006)

    为了便于搜索(http://search.csdn.net),这里尽可能保留了论坛上讨论的原文,但是这并不表示本人赞同帖子中的表述方式和观点. CSDN 讨论总结系列: Jiangsheng的CSDN ...

  5. [转贴]2006十大经典语句

    1. 骑白马的不一定是王子,他可能是唐僧: 2. 带翅膀的也不一定是天使,他可能是鸟人. 3. 站的更高,尿的更远. 4. 穿别人的鞋,走自己的路,让他们找去吧, 5. 我不是随便的人.我随便起来不是 ...

  6. 金山发布《2006年度信息安全报告》

    2006年度,国内的互联网环境因接踵而至的信息安全事件一再掀起了波澜.作为国内领先的信息安全厂商,金山毒霸同数千万国内用户一起见证了对病毒.对流氓软件发出的各种绝技杀手锏. 2007年2月8日,金山软 ...

  7. Infragistics NetAdvantage 2006 Volume 2 CLR 2.0曲折安装

    上个月看到Infragistics NetAdvantage 2006 Volume 2 CLR 2.0(新特性)新鲜出炉,就一直想安装试用.昨天qq上得知已经有人在使用了,赶紧google一个dow ...

  8. 2006年下半年 网络工程师 上下午试卷【附带答案】

    2004-2017年真题+答案[0.23RMB]自取 2006年下半年 网络工程师 上午试卷 ● 若内存按字节编址,用存储容量为32K X 8 比特的存储器芯片构成地址编号A0000H至DFFFFH的 ...

  9. 2006年上半年 网络工程师 上下午试卷【附带答案】

    2004-2017年真题+答案[0.23RMB]自取 2006年上半年 网络工程师 上午试卷 ● 高速缓存Cache与主存间采用全相联的地址影像方式,高速缓存的容量为4MB,分为4块,每块1MB,主存 ...

  10. Windows域环境下部署ISA Server 2006防火墙(四)

    构建基于ISA Server 2006的远程接入×××服务器<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:off ...

最新文章

  1. 2019微生物组—宏基因组分析技术研讨会第五期
  2. 你管这破玩意叫哨兵?
  3. python下载地址-python下载网址
  4. 如何在solaris下安装memcached
  5. Linux下的Keyboard子系统
  6. php网站标签加小图标,在htmltitle/title标签添加图标,网页title左边显示网页的logo图标...
  7. textarea内容有换行时存入数据库丢失问题的解决 (转载)
  8. ODOO v10.0 自动生成财务凭证的科目设置
  9. Windows 下Temp帐号处理
  10. 适合Java零基础学习的视频教程资源合集(小白入门到项目实战)
  11. 微软创投加速器最新成果展示:人工智能技术杀入时尚界
  12. 亚稳态与同步器及其Verilog实现
  13. Mathematica 命令大全
  14. java小组口号,小组口号大全
  15. MSP430系列单片机的DMA使用全面认识
  16. 一文搞懂Nginx如何配置Http、Https、WS、WSS!
  17. 正则表达式中反斜杠的另一用法
  18. java mcu 视频会议_详解视频会议终端和MCU的区别
  19. 一张图读懂PBN飞越转弯衔接TF/CF航段计算
  20. medoo支持的php版本,Medoo入门:安装和配置-Medoo使用指南

热门文章

  1. jQuery操作DOM元素
  2. GoDaddy Linux主机支持机房的更换
  3. 【IT历史】SP和CP
  4. 如何用C#+WinRAR 实现压缩 分类:
  5. (转载)每位开发人员都应铭记的10句编程谚语
  6. 数据分析之处理丢失数据
  7. [UWP开发]NavigationView基础使用方法
  8. jmeter-01 JMeter HTTP测试的各元件功能演示示例
  9. Android结束进程方法
  10. android之获取手机号码、获取手机操作系统版本号