HDU 6107 Typesetting
Problem Description
Yellowstar is writing an article that contains N words and 1 picture, and the i-th word contains ai characters.
The page width is fixed to W characters. In order to make the article look more beautiful, Yellowstar has made some rules:
- The fixed width of the picture is pw. The distance from the left side of the page to the left side of the photo fixed to dw, in other words, the left margin is dw, and the right margin is W - pw - dw.
- The photo and words can't overlap, but can exist in same line.
- The relative order of words cannot be changed.
- Individual words need to be placed in a line.
- If two words are placed in a continuous position on the same line, then there is a space between them.
- Minimize the number of rows occupied by the article according to the location and height of the image.
However, Yellowstar has not yet determined the location of the picture and the height of the picture, he would like to try Q different locations and different heights to get the best look. Yellowstar tries too many times, he wants to quickly know the number of rows each time, so he asked for your help. It should be noted that when a row contains characters or pictures, the line was considered to be occupied.
题目大意:
有N个单词,每一个单词长度为\(a_i\),现在存在一页纸,宽度为W,和一张需要放进纸中的照片,照片的宽度为pw,距离纸的左边x,距离右边W-pw-x,有Q组询问,(x,y)表示照片从第x行开始,长度为y,求把单词和照片都放进纸中,需要占用多少行
解题报告:
用时:1h,1WA
比较简单,直接预处理出:
\(f[i][j]\)表示在没有照片的行中,从第\(i\)个单词开始,占用\(2^j\)行可以放下的单词数
\(g[i][j]\)表示在有照片的行中,从第\(i\)个单词开始,占用\(2^j\)行可以放下的单词数
我们可以先用二分处理出\(f[i][0]\)和\(g[i][0]\)
显然:
\(f[i][j]=f[i][j-1]+f[i+f[i][j-1]][j-1]\)
\(g[i][j]=g[i][j-1]+g[i+g[i][j-1]][j-1]\)
最后再分照片前的部分,照片的部分,和照片后的三个部分处理即可
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=1e5+5;
int n,m,W,pw,lw,rw,a[N],sum[N],f[N][20];
int g[N][20],maxlen;
int midit(int sta,int lim){
if(sta>n || !lim)return 0;
int l=sta,r=n,mid,ret=l-1;
while(l<=r){
mid=(l+r)>>1;
if(sum[mid]-sum[sta-1]+mid-sta<=lim)
ret=mid,l=mid+1;
else r=mid-1;
}
return ret-sta+1;
}
void prework(){
int x,y;
for(int i=1;i<=n;i++){
f[i][0]=midit(i,W);
x=midit(i,lw);y=midit(i+x,rw);
g[i][0]=x+y;
}
for(int j=1;j<=maxlen;j++){
for(int i=1;i<=n;i++){
if(i+f[i][j-1]<=n)
f[i][j]=f[i][j-1]+f[i+f[i][j-1]][j-1];
else f[i][j]=N;
if(i+g[i][j-1]<=n)
g[i][j]=g[i][j-1]+g[i+g[i][j-1]][j-1];
else g[i][j]=N;
if(i+f[i][j]-1>n)f[i][j]=N;
if(i+g[i][j]-1>n)g[i][j]=N;
}
}
}
int solve(int s,int d){
int res=n,x=1,ans=0,tot=s-1;
for(int i=maxlen;i>=0;i--){
if(tot>=(1<<i) && res>=f[x][i] && x<=n)
tot-=(1<<i),res-=f[x][i],x+=f[x][i],ans+=(1<<i);
}
int pre=ans+d;
if(!res)return pre;
tot=d;
for(int i=maxlen;i>=0;i--){
if(tot>=(1<<i) && res>=g[x][i] && x<=n)
tot-=(1<<i),res-=g[x][i],x+=g[x][i],ans+=(1<<i);
}
ans=Max(pre,ans);
if(!res)return ans;
for(int i=maxlen;i>=0;i--){
if(res>=f[x][i] && x<=n)
res-=f[x][i],x+=f[x][i],ans+=(1<<i);
}
return ans;
}
void work()
{
scanf("%d%d%d%d",&n,&W,&pw,&lw);
maxlen=log(n)/log(2)+1;rw=W-pw-lw;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),sum[i]=sum[i-1]+a[i];
prework();
int Q,x,y;cin>>Q;
while(Q--){
scanf("%d%d",&x,&y);
printf("%d\n",solve(x,y));
}
}
int main()
{
int T;cin>>T;
while(T--)work();
return 0;
}
HDU 6107 Typesetting的更多相关文章
- HDU 6107 - Typesetting | 2017 Multi-University Training Contest 6
比赛的时候一直念叨链表怎么加速,比完赛吃饭路上突然想到倍增- - /* HDU 6107 - Typesetting [ 尺取法, 倍增 ] | 2017 Multi-University Train ...
- HDU 6107 Typesetting (倍增)
Typesetting Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- Typesetting HDU - 6107
Yellowstar is writing an article that contains N words and 1 picture, and the i-th word contains aia ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
- HDU 4569 Special equations(取模)
Special equations Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- HDU 4006The kth great number(K大数 +小顶堆)
The kth great number Time Limit:1000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64 ...
- HDU 1796How many integers can you find(容斥原理)
How many integers can you find Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d ...
随机推荐
- 2017北京国庆刷题Day1 afternoon
期望得分:100+100+100=300 实际得分:100+100+100=300 T1 一道图论好题(graph) Time Limit:1000ms Memory Limit:128MB 题目 ...
- C# 一个初学者对 依赖注入 IOC 的理解( 含 Unity 的使用)
通过 人打电话 来谈谈自己对IOC的理解 版本1.0 public class Person { public AndroidPhone Phone { get; set; } public void ...
- maven构建spring报错org.springframework.core.NestedRuntimeException cannot be resolved.
Error:The type org.springframework.core.NestedRuntimeException cannot be resolved. It is indirectly ...
- SQL Server 2012 管理新特性:AlwaysOn 可用性组
SQL Server 2012 新特性(一)管理新特性:AlwaysOn 一.准备环境 1.准备4台计算机 域控制器DC1,IP地址192.168.1.1 主节点SQL1:IP地址192.168.1. ...
- JavaScript的sleep实现--Javascript异步编程学习
一.原始需求 最近在做百度前端技术学院的练习题,有一个练习是要求遍历一个二叉树,并且做遍历可视化即正在遍历的节点最好颜色不同 二叉树大概长这个样子: 以前序遍历为例啊, 每次访问二叉树的节点加个sle ...
- 愿奴胁下生双翼——— 详解cookie和session
cookie和session都是基于web服务器的,不同的是cookie存储在客户端而session存储在服务器. 当用户浏览网站时,web服务器会在浏览器上存储一些当前用户的相关信息,在本地Web客 ...
- Java-NIO(四):通道(Channel)的原理与获取
通道(Channel): 由java.nio.channels包定义的,Channel表示IO源与目标打开的连接,Channel类似于传统的“流”,只不过Channel本身不能直接访问数据,Chann ...
- 解决VS2017编译后的EXE文件不能在其他电脑上运行的问题
笔者昨天写了个超简单画图程序,很是激动啊,立马给同学分享了自己写的程序,结果发现无法运行 错误是这样的 解决方法如下: 1.将Debug改为Release 2.进入[项目]-[**属性] 3.[C/C ...
- Convert.ToInt32、(int)和int.Parse三者的区别
前者适合将object类类型转换成int类型 (int)适合简单数据类型之间的转换: int.Parse适合将string类类型转换成int类型.
- MyBatis(1)——快速入门
MyBatis 简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...