【NOIP2013模拟联考5】军训
题目
HYSBZ 开学了!今年HYSBZ 有n 个男生来上学,学号为1…n,每个学生都必须参加军训。在这种比较堕落的学校里,每个男生都会有Gi 个女朋友,而且每个人都会有一个欠扁值Hi。学校为了保证军训时教官不会因为学生们都是人生赢家或者是太欠扁而发生打架事故,所以要把学生们分班,并做出了如下要求:
1.分班必须按照学号顺序来,即不能在一个班上出现学号不连续的情况。
2.每个学生必须要被分到某个班上。
3.每个班的欠扁值定义为该班中欠扁值最高的那名同学的欠扁值。所有班的欠扁值之和不得超过Limit。
4.每个班的女友指数定义为该班中所有同学的女友数量之和。在满足条件1、2、3 的情况下,分班应使得女友指数最高的那个班的女友指数最小。
请你帮HYSBZ 的教务处完成分班工作,并输出女友指数最高的班级的女友指数。
输入数据保证题目有解。
分析
要求最小的最大值,
很容易让我们想到想到二分。
那么二分ans,
定义\(f_{i}\)表示,前\(i\)个人都分好班了,最小的欠扁值H为多少。
显然,如果\(f_{n}<=limit\),那么二分出来的ans是满足分班条件的。
那么怎么转移呢?,\(f_{i}=min(f_{j}+max(H_{j+1},H_{j+1},H_{j+3}......H_{i}))\)
但这样是\(O(N^{2})\)的,会超时,
那么我们就要像如何优化dp。
用个线段树来记录这个区间的
最大的h值mxh
最小的h值mnh
最小的f值mnf
还有答案mn,显然mn=mnf+mxh(方便而已)
接着随便搞搞就可以了。
#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const int maxlongint=2147483647;
using namespace std;
int f[25000],sum[27000],g[27000],h[27000],limit,n,m,ans;
int mxh[100000],mnh[100000],mnf[100000],mn[100000],lazy[100000];
int spread(int x,int y)
{
if(!lazy[x])
return 0;
lazy[y]=max(lazy[y],lazy[x]);
mxh[y]=max(lazy[x],mxh[y]);
mnh[y]=mxh[y];
mn[y]=mnf[y]+mxh[y];
}
int deeply(int v,int l,int r,int z)
{
if(mxh[v]<z)
{
mxh[v]=mnh[v]=z;
mn[v]=mnf[v]+z;
lazy[v]=z;
return 0;
}
if(l==r)
return 0;
spread(v,v*2);
spread(v,v*2+1);
lazy[v]=0;
int mid=(l+r)/2;
if(mnh[v*2]<z)
deeply(v*2,l,mid,z);
if(mnh[v*2+1]<z)
deeply(v*2+1,mid+1,r,z);
mn[v]=min(mn[v*2],mn[v*2+1]);
mnf[v]=min(mnf[v*2],mnf[v*2+1]);
mnh[v]=min(mnh[v*2],mnh[v*2+1]);
mxh[v]=max(mxh[v*2],mxh[v*2+1]);
}
int change(int v,int l,int r,int x,int y,int z)
{
if(l==x && y==r)
{
deeply(v,l,r,z);
return 0;
}
spread(v,v*2);
spread(v,v*2+1);
lazy[v]=0;
int mid=(l+r)/2;
if(y<=mid)
change(v*2,l,mid,x,y,z);
else
if(x>mid)
change(v*2+1,mid+1,r,x,y,z);
else
change(v*2,l,mid,x,mid,z),change(v*2+1,mid+1,r,mid+1,y,z);
mn[v]=min(mn[v*2],mn[v*2+1]);
mnf[v]=min(mnf[v*2],mnf[v*2+1]);
mnh[v]=min(mnh[v*2],mnh[v*2+1]);
mxh[v]=max(mxh[v*2],mxh[v*2+1]);
}
int put(int v,int l,int r,int x,int z)
{
if(l==r)
{
mxh[v]=mnh[v]=h[l];
mnf[v]=z;
mn[v]=mnf[v]+mxh[v];
return 0;
}
spread(v,v*2);
spread(v,v*2+1);
lazy[v]=0;
int mid=(l+r)/2;
if(x<=mid)
put(v*2,l,mid,x,z);
else
put(v*2+1,mid+1,r,x,z);
mn[v]=min(mn[v*2],mn[v*2+1]);
mnf[v]=min(mnf[v*2],mnf[v*2+1]);
mnh[v]=min(mnh[v*2],mnh[v*2+1]);
mxh[v]=max(mxh[v*2],mxh[v*2+1]);
}
int find(int v,int l,int r,int x,int y,int p)
{
if(l==x && y==r)
{
f[p]=min(f[p],mn[v]);
return 0;
}
spread(v,v*2);
spread(v,v*2+1);
lazy[v]=0;
int mid=(l+r)/2;
if(y<=mid)
find(v*2,l,mid,x,y,p);
else
if(x>mid)
find(v*2+1,mid+1,r,x,y,p);
else
find(v*2,l,mid,x,mid,p),find(v*2+1,mid+1,r,mid+1,y,p);
}
bool ok(int gg)
{
memset(mxh,0,sizeof(mxh));
memset(mnh,0,sizeof(mnh));
memset(mnf,0,sizeof(mnf));
memset(mn,0,sizeof(mn));
memset(lazy,0,sizeof(lazy));
f[0]=0;
int j=1,ans;
for(int i=1;i<=n;i++)
{
while(sum[i]-sum[j-1]>gg)
j++;
put(1,1,n,i,f[i-1]);
change(1,1,n,j,i,h[i]);
f[i]=maxlongint;
find(1,1,n,j,i,i);
}
if(f[n]<=limit)
return true;
return false;
}
int rf()
{
int l=1,r=sum[n];
while(l<r)
{
int mid=(l+r)/2;
if(ok(mid))
r=mid;
else
l=mid+1;
}
printf("%d",l);
}
int main()
{
scanf("%d%d",&n,&limit);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&h[i],&g[i]);
sum[i]=sum[i-1]+g[i];
}
rf();
}
【NOIP2013模拟联考5】军训的更多相关文章
- JZOJ 3463. 【NOIP2013模拟联考5】军训
3463. [NOIP2013模拟联考5]军训(training) (Standard IO) Time Limits: 2000 ms Memory Limits: 262144 KB Deta ...
- JZOJ 3493. 【NOIP2013模拟联考13】三角形
3493. [NOIP2013模拟联考13]三角形(triangle) (File IO): input:triangle.in output:triangle.out Time Limits: 10 ...
- JZOJ 3487. 【NOIP2013模拟联考11】剑与魔法(dragons)
3487. [NOIP2013模拟联考11]剑与魔法(dragons) (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB De ...
- JZOJ 3470. 【NOIP2013模拟联考8】最短路(path)
470. [NOIP2013模拟联考8]最短路(path) (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Detailed ...
- JZOJ 3462. 【NOIP2013模拟联考5】休息(rest)
3462. [NOIP2013模拟联考5]休息(rest) (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Detailed ...
- JZOJ 3461. 【NOIP2013模拟联考5】小麦亩产一千八(kela)
3461. [NOIP2013模拟联考5]小麦亩产一千八(kela) (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Det ...
- 【NOIP2013模拟联考7】OSU
[NOIP2013模拟联考7]OSU 描述 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: 一共有n次操作,每次操作只有成功与失败之分, ...
- JZOJ【NOIP2013模拟联考14】隐藏指令
JZOJ[NOIP2013模拟联考14]隐藏指令 题目 Description 在d维欧几里得空间中,指令是一个长度为2N的串.串的每一个元素为d个正交基的方向及反方向之一.例如,d = 1时(数轴) ...
- [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)
Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...
随机推荐
- ES6 class 语法糖不能直接定义原型上的属性
今天注意到两个东西: 1.为了模拟面向对象,JavaScript的class语法糖屏蔽了原型的概念 class A{ a = 1 // 注意!!这里定义的不是在prototype上的属性,而是给实 ...
- robotframework之常用系统关键字
常用系统关键字此处做些记录,后续根据实际应用陆续补充 1.变量声明 ${a} Set Variable hello 2.表单嵌套 Select Frame Xpath=//* [@] Unselect ...
- Delphi DbgridEh实现鼠标拖动选中列,并使复选框选中
1.先设置表格列的属性 procedure TForm_TaskToDW.InitGrid;var MyCol: TColumnEh;begin with DBGridEh_Task do be ...
- 使用 go protoc --go_out 输出的 *.pb.go文件时报 undefined: proto.ProtoPackageIsVersion3
事情是这样的:我参考go的 grpc 实现 https://grpc.io/docs/quickstart/go/ Download the example The grpc code that wa ...
- ARTS-1
ARTS的初衷 Algorithm:主要是为了编程训练和学习.每周至少做一个 leetcode 的算法题(先从Easy开始,然后再Medium,最后才Hard).进行编程训练,如果不训练你看再多的算法 ...
- es笔记---新建es索引
es对索引的一堆操作都是用restful api去进行的,参数时一堆json,一年前边查边写搞过一次,这回搞迁移,发现es都到6.0版本了,也变化了很多,写个小笔记记录一下. 创建一个es索引很简单, ...
- 【读书笔记】Git使用
初始设置本地Git 首先来设置使用 Git 时的姓名和邮箱地址.名字请用英文输入. $ git config --global user.name "Firstname Lastname&q ...
- 所遇Oracle错误代码
ORA-00905: 缺失关键字 少了空格或关键字写错 ORA-00922: 选项缺失或无效 错误原因:一般是语句的语法有问题.比如命名不对,关键字写错等等.对于非标准的命名,一般采用双引号来创建 ...
- docker--docker 网络管理
9 docker 网络管理 9.1 默认网络 1.查看docker网络: docker network ls Docker中默认的三种网络分别为bridge.host和none,其中名为bridge的 ...
- Hive-java.lang.ClassNotFoundException: org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe
Task with the most failures(): ----- Task ID: task_1555476136794_8201_m_000000 URL: http://hadoop1:8 ...