将球员按限制从大到小排序,那么最优解中每支球队都是一个连续的区间。

设$f[i]$表示前$i$大的球员成功组队时,最多能组的队伍数,$g[i]$表示此时最大人数的最小值。

那么$f[i]=\max(f[j]+1),a[j]\geq i-j$,即$a[j]+j\geq i$。

注意到$a[j]+j>j$恒成立,所以可以使用链表来维护,当计算$f[a[j]+j]$时,才将$j$加入决策范围中。

此时需要维护决策中$f$的最大值,对于多个最大值,则要让$\max(g[j],i-j)$最小。

$1.$若$g[j]\leq i-j$,即$g[j]+j\leq i$,那么同样可以使用链表来维护,$j$最大的是最优决策。

$2.$若$g[j]>i-j$,那么这些$j$还在后面的链表里,使用堆来维护$g[j]$最小的$j$即可。

时间复杂度$O(n\log n)$。

#include<cstdio>
const int N=1000010,BUF=10000000,OUT=10000000;
char Buf[BUF],*buf=Buf,Out[OUT],*ou=Out;int Outn[30],Outcnt;
int n,i,j,x=-1,a[N],b[N],c[N],f[N],g[N],w[N],g0[N],nxt0[N],g1[N],nxt1[N],h[N],l;
inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
inline void write(int x){
for(Outcnt=0;x;x/=10)Outn[++Outcnt]=x%10+48;
while(Outcnt)*ou++=Outn[Outcnt--];
}
inline void swap(int&a,int&b){int c=a;a=b;b=c;}
inline bool cmp(int x,int y){
if(f[x]!=f[y])return f[x]>f[y];
return g[x]<g[y];
}
inline void pop(){
h[1]=h[l--];
for(int i=1;;){
int t=h[i],j=0;
if((i<<1)<=l&&cmp(h[i<<1],t))t=h[j=i<<1];
if((i<<1|1)<=l&&cmp(h[i<<1|1],t))j=i<<1|1;
if(j)swap(h[i],h[j]),i=j;else return;
}
}
inline void add0(int x){
int y=x+b[x+1];
if(y>n)return;
nxt0[x]=g0[y];g0[y]=x;
}
inline void add1(int x){
h[++l]=x;
for(int i=l;i>1&&cmp(h[i],h[i>>1]);i>>=1)swap(h[i],h[i>>1]);
int y=x+g[x];
if(y>n)return;
nxt1[x]=g1[y];g1[y]=x;
}
inline void up(int y){
if(x<0){x=y;return;}
if(f[y]>f[x]||f[y]==f[x]&&y>x)x=y;
}
inline void use(int y){
int z=g[y]>i-y?g[y]:i-y;
if(f[y]+1>f[i])f[i]=f[y]+1,g[i]=z,w[i]=y;
else if(f[y]+1==f[i]&&z<g[i])g[i]=z,w[i]=y;
}
int main(){
fread(Buf,1,BUF,stdin);read(n);
for(i=1;i<=n;i++)read(a[i]),b[a[i]]++;
for(i=n;i;i--)b[i]+=b[i+1];
for(i=1;i<=n;i++)c[b[a[i]]--]=i;
for(i=1;i<=n;i++)b[i]=a[c[i]],f[i]=g0[i]=g1[i]=-1;
for(add0(f[0]=0),i=1;i<=n;i++){
for(j=g0[i];~j;j=nxt0[j])if(g[j]+j<=i)up(j);else add1(j);
for(j=g1[i];~j;j=nxt1[j])up(j);
if(~x)use(x);
while(l){
j=h[1];
if(g[j]+j>i){use(j);break;}
pop();
}
if(f[i]>0)add0(i);
}
write(f[n]);*ou++='\n';
while(n){
j=w[n];
write(n-j);
for(i=j+1;i<=n;i++)*ou++=' ',write(c[i]);
*ou++='\n';
n=j;
}
fwrite(Out,1,ou-Out,stdout);
return 0;
}

BZOJ2587 : [Ceoi2011]Team的更多相关文章

  1. bzoj2386 [CEOI2011] Team

    题意 给你n个数,每个数的大小在1到n之间,要求把它们分成几组,每个数字的大小要小于等于它所在组中的数字总个数,问最多能分出多少组. 分析 首先把所有数字排序,比较显然的是最后一定存在一个最优解是按这 ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. Configure a VLAN on top of a team with NetworkManager (nmcli) in RHEL7

    SOLUTION VERIFIED September 13 2016 KB1248793 Environment Red Hat Enterprise Linux 7 NetworkManager ...

  4. Create a Team in RHEL7

    SOLUTION VERIFIED September 13 2016 KB2620131 Environment Red Hat Enterprise Linux 7 NetworkManager ...

  5. Team Leader 你不再只是编码, 来炖一锅石头汤吧

    h3{ color: #000; padding: 5px; margin-bottom: 10px; font-weight: bolder; background-color: #ccc; } h ...

  6. Configure bridge on a team interface using NetworkManager in RHEL 7

    SOLUTION IN PROGRESS February 29 2016 KB2181361 environment Red Hat Enterprise Linux 7 Teaming,Bridg ...

  7. BZOJ 4742: [Usaco2016 Dec]Team Building

    4742: [Usaco2016 Dec]Team Building Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 21  Solved: 16[Su ...

  8. 关于 feature team 的一些内容

    矩阵式管理,是常见的经典管理架构.其最早起源于美国的航空航天部门,然后被美国人带到了日本,然后被日本人带到了台湾,然后台湾人带到大陆...矩阵管理最典型的特征是,组织架构按职能与专业划分,项目由跨越部 ...

  9. 病毒四度升级:安天AVL Team揭露一例跨期两年的电信诈骗进化史

    自2014年9月起,安天AVL移动安全团队持续检测到一类基于Android移动平台的间谍类病毒,病毒样本大多伪装成名为"最高人民检察院"的应用.经过反编译逆向分析以及长期的跟踪调查 ...

随机推荐

  1. 如果拷贝项目出现各种找不到文件的时候,基本就是没有标记,或者文件名的问题,Could not find resource mybatis.xml,解决方法

    Could not find resource mybatis.xml

  2. k-近邻算法-手写识别系统

    手写数字是32x32的黑白图像.为了能使用KNN分类器,我们需要把32x32的二进制图像转换为1x1024 1. 将图像转化为向量 from numpy import * # 导入科学计算包numpy ...

  3. IPMI无法执行命令

    IPMI无法执行命令 https://www.cnblogs.com/EricDing/p/8995263.html http://www.cnblogs.com/heidsoft/p/4014301 ...

  4. webpack学习笔记--配置module

    Module module 配置如何处理模块. 配置 Loader rules  配置模块的读取和解析规则,通常用来配置 Loader.其类型是一个数组,数组里每一项都描述了如何去处理部分文件. 配置 ...

  5. Unicode字符编码表

    十进制 十六进制  字符数 编码分类(中文) 编码分类(英文) 起始 终止 起始 终止 (个)     0 127 0000 007F 128 C0控制符及基本拉丁文 C0 Control and B ...

  6. JSP基础知识➣Cookie和Session(五)

    JSP Cookie 处理 Cookie是存储在客户机的文本文件,它们保存了大量轨迹信息.在servlet技术基础上,JSP显然能够提供对HTTP cookie的支持.JSP脚本通过request对象 ...

  7. IIS7部署报错 500.22错误 检查到这集成托管模式下不使用的ASP.NET配置

    公司的一个项目,环境为: .Net 4.0 + MVC3,部署在Windows Server 2003R2 IIS6.0上面运行正常, 迁移到新服务器Windows Server 2008R2,部署在 ...

  8. linux系统虚拟机下安装nginx基础

    虽然安装nginx什么的 .以及如何配置等等一系列的资料案例已经很多了 但是作为菜鸟的我还是搞了半天哈 官网上面也有.但是一些细节方面的并没有说明.导致踩了半天坑才搞好 本案例的系统环境     wi ...

  9. redis在Windows10下的安装

    以前在linux学习了redis,考虑到电脑负荷,这次学习一下如何在本地Windows下安装redis,进行学习. 下面的一些安装的步骤: 1.下载 网址:https://github.com/Mic ...

  10. 011 pandas的常见操作

    一:对索引进行操作 1.reindex重新索引 pandas提供了一个方法来创建一个适应新索引的新对象. Series通过调用reindex方法会根据新的索引顺序重新排序,如果新的索引中存在原索引不存 ...