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:

  1. 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.
  2. The photo and words can't overlap, but can exist in same line.
  3. The relative order of words cannot be changed.
  4. Individual words need to be placed in a line.
  5. If two words are placed in a continuous position on the same line, then there is a space between them.
  6. 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的更多相关文章

  1. HDU 6107 - Typesetting | 2017 Multi-University Training Contest 6

    比赛的时候一直念叨链表怎么加速,比完赛吃饭路上突然想到倍增- - /* HDU 6107 - Typesetting [ 尺取法, 倍增 ] | 2017 Multi-University Train ...

  2. HDU 6107 Typesetting (倍增)

    Typesetting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  3. Typesetting HDU - 6107

    Yellowstar is writing an article that contains N words and 1 picture, and the i-th word contains aia ...

  4. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  5. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  6. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  7. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  8. HDU 4006The kth great number(K大数 +小顶堆)

    The kth great number Time Limit:1000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64 ...

  9. HDU 1796How many integers can you find(容斥原理)

    How many integers can you find Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d ...

随机推荐

  1. MySQL 自关联查询

    定义表areas,结构如下 id atitle pid 因为省没有所属的省份,所以可以填写为null 城市所属的省份pid,填写省所对应的编号id 这就是自关联,表中的某一列,关联了这个表中的另外一列 ...

  2. vim配置强悍来袭

    vim   这个关键字,我不想再过多的解释,相信看到这里的同仁,对vim都有十七八分的理解,如果你还不知道vim是什么,自己找个黑屋子... 废话不多说,今天在这里主要说vim的,不带插件的配置,也就 ...

  3. Digilent Xilinx USB Jtag cable

    Digilent Xilinx USB Jtag cable 安装环境 操作系统:fedora 20 64bit 源链接:https://wiki.gentoo.org/wiki/Xilinx_USB ...

  4. ubuntu1604使用源码方式安装ruby2.5.0

    本文介绍ubutntu1604环境下源代码方式安装ruby 版本2.5.0 如果内存小于2G可以开启虚拟内存,下面的命令开启4G虚拟内存 sudo dd if=/dev/zero of=/swap b ...

  5. WebAPI 跨域解决方案.

    先下载支持跨域的.dll,然后using System.Web.Http.Cors. 我把webapi解决方案部署到IIS上了.测试过后可以解决跨域. 方案一(用了*号,这样有安全隐患.): 直接在w ...

  6. python3+beautifulSoup4.6抓取某网站小说(四)多线程抓取

    上一篇多文章,是二级目录,根目录"小说",二级目录"作品名称",之后就是小说文件. 本篇改造了部分代码,将目录设置为根目录->作者目录->作品目录- ...

  7. ssl双向认证

    ssl双向认证 一.背景知识 1.名词解释 ca.key: 根证书的私钥 , ca.crt: 根证书的签名证书 server.key, server.crt client.key, client.cr ...

  8. 阿里云API网关(13)请求身份识别:客户端请求签名和服务网关请求签名

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

  9. Angular UI框架 Ng-alain @delon的脚手架的生成开发模板

    前言 首先感谢下 cipchk基于 Ng-Zorror 框架上制作的ng-alain . 之前很早就关注了 ng-alain,今天得空折腾了下. 折腾的时候发现官方文档有些坑,没有写清楚,所以我作为一 ...

  10. 深入理解JavaScript的this指向问题

    Javascript的this用法 this是Javascript语言的一个关键字.它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如: function test(){ this.x ...