比赛的时候一直念叨链表怎么加速,比完赛吃饭路上突然想到倍增- -

/*
HDU 6107 - Typesetting [ 尺取法, 倍增 ] | 2017 Multi-University Training Contest 6
题意:
文章包含N个字符串和 1 个图片
字符串之间要求空 1 格
告诉你纸张宽度 W 固定,图片的左右留白宽度 dw, W-pw-dw 固定
每次询问给定图片的高h和首行x
问 字符串加图片总共占多少行
分析:
nxt[W][i] = j 代表 行宽为 W 时第 i 个字符串为某行行首时,下一行首个字符串 j
预处理 nxt[W], nxt[dw], nxt[W-pw-dw] 三个跳转数组
对于 x 行第一个字符串是什么,可以预处理 head[x] = j
然后用 nxt[dw] + nxt[W-pw-dw] 一直跳到第x+h行,这部分用倍增优化
对于包括第 p 个字符串的之后的总行数,可以预处理 tail[p] = tail[nxt[p]]+1
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int nxt[N], nxt2[N], nxt3[N];
int s[N];
int tail[N], head[N], Maxt;
int t, n, w, q;
int pw, dw;
void init(int nxt[], int w)
{
int i = 1, j = 1, sum = 0;
while (i <= n && j <= n)
{
while (j <= i && sum+s[i]+1 > w+1)
{
nxt[j] = i;
sum -= s[j]+1;
j++;
}
sum += s[i]+1;
i++;
}
}
int fnxt[N][15];
int two[15];
void init2()
{
tail[0] = head[0] = 0;
for (int i = n; i >= 1; i--)
{
if (nxt[i] == 0) tail[i] = 1;
else tail[i] = tail[nxt[i]]+1;
}
for (int i = 1, j = 1; i; i = nxt[i], j++)
{
head[j] = i;
Maxt = j;
}
for (int i = 1; i <= n; i++) nxt2[i] = nxt3[nxt2[i]];
for (int i = n; i >= 1; i--)
fnxt[i][0] = nxt2[i];
for (int j = 1; j <= 14; j++)
for (int i = 1; i <= n; i++)
fnxt[i][j] = fnxt[fnxt[i][j-1]][j-1];
}
int x, h;
int solve()
{
int p = head[x];
for (int i = 14; i >= 0; i--)
if (h&two[i])
p = fnxt[p][i];
return x+h-1+tail[p];
}
int main()
{
two[0] = 1;
for (int i = 1; i <= 14; i++) two[i] = two[i-1] * 2;
scanf("%d", &t);
while (t--)
{
memset(nxt, 0, sizeof(nxt));
memset(nxt2, 0, sizeof(nxt2));
memset(nxt3, 0, sizeof(nxt3));
scanf("%d%d%d%d", &n, &w, &pw, &dw);
for (int i = 1; i <= n; i++) scanf("%d", &s[i]);
init(nxt, w);
init(nxt2, dw);
init(nxt3, w-pw-dw);
init2();
scanf("%d", &q);
while (q--)
{
scanf("%d%d", &x, &h);
if (x > Maxt) printf("%d\n", Maxt + h);
else printf("%d\n", solve());
}
}
}

  

最新文章

  1. 15-static和extern关键字1-对函数的作用
  2. 总结-css编码规范
  3. Codeforces Round #292 (Div. 1) B. Drazil and Tiles (类似拓扑)
  4. div:给div加滚动栏 div的滚动栏设置
  5. PERL高效代码摘录 - 数组
  6. PHP数据过滤
  7. Android项目能运行,上传svn后再下载却不能运行
  8. poj 1141 Brackets Sequence(区间DP)
  9. HPU--1280 Divisible
  10. js中的isNaN()函数
  11. POJ - 2912 Rochambeau 种类并查集
  12. Doskey命令详解
  13. kafka常规及几个重要的操作命令
  14. 章节四、4-For循环
  15. 5. Redis持久化
  16. C# ASP.NET MVC 配置允许跨域访问
  17. Linux中 Lua 访问Sql Server的配置方法
  18. legend2---开发日志3(thinkphp的入口目录是public的体现是什么)
  19. shell中date使用总结-基于自动定期备份mysql实践
  20. Windows下VM安装MacOS

热门文章

  1. [转帖]Asp.net MVC 与 Asp.net Web API 区别
  2. 【转帖】Linux的NUMA机制
  3. 【Funny Things】002——鞋的颜色
  4. Python解Leetcode: 1. Two Sum
  5. Photon Server 实现注册与登录(四) --- 服务端响应登陆和注册
  6. 正则表达式BREs,EREs,PREs的比较
  7. C#picturebox控件图片以json格式上传java后台保存
  8. Makefile中 -I -L -l区别
  9. django 权限控制精简版
  10. 如何确定asp.net请求生命周期的当前处理事件