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

/*
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());
}
}
}

  

HDU 6107 - Typesetting | 2017 Multi-University Training Contest 6的更多相关文章

  1. hdu 4930 Fighting the Landlords--2014 Multi-University Training Contest 6

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4930 Fighting the Landlords Time Limit: 2000/1000 MS ...

  2. HDU 6168 - Numbers | 2017 ZJUT Multi-University Training 9

    /* HDU 6168 - Numbers [ 思维 ] | 2017 ZJUT Multi-University Training 9 题意: .... 分析: 全放入multiset 从小到大,慢 ...

  3. HDU 5726 GCD (2016 Multi-University Training Contest 1)

      Time Limit: 5000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Description Give y ...

  4. HDU 5360 Hiking(优先队列)2015 Multi-University Training Contest 6

    Hiking Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total S ...

  5. hdu 6394 Tree (2018 Multi-University Training Contest 7 1009) (树分块+倍增)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=6394 思路:用dfs序处理下树,在用分块,我们只需要维护当前这个点要跳出这个块需要的步数和他跳出这个块去 ...

  6. HDU 6107 Typesetting (倍增)

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

  7. HDU 4951 Multiplication table(2014 Multi-University Training Contest 8)

    思路   如果进制为p    那么当x<p时 (p-1)*(p-x)=(p-(x+1))  *p +x     因为x<p  所以没有进位  所以高位上的数字为    p-(x+1). 根 ...

  8. HDU 4938 Seeing People(2014 Multi-University Training Contest 7)

    思路:根据出发时间把点往速度反方向移动 t*v的 的距离这样就可以当成 全部点一起出发,再把y轴上的点固定不动相当于x轴的点向(-v2,v1)方向移动 .可以把所有点映射到x轴上进行统计即可(要记住同 ...

  9. HDU 4937 Lucky Number(2014 Multi-University Training Contest 7)

    思路:先枚举  a*bas +b = n  求出 bas 在sqrt(n)到n的  (bas>a&&bas>b) 再枚举  a*bas*bas+b*bas+c =n  求出 ...

随机推荐

  1. [转帖]2019-03-26 发布 深入理解 MySQL ——锁、事务与并发控制

    深入理解 MySQL ——锁.事务与并发控制 https://segmentfault.com/a/1190000018658828 太长了 没看完.. 数据库 并发  mysql 639 次阅读   ...

  2. [转]Mybatis之TypeHandler使用教程

    Mybatis之TypeHandler使用教程 https://blog.csdn.net/jokemqc/article/details/81326109 深入浅出Mybatis系列(五)---Ty ...

  3. MongoDB使用过程中的报错处理(持续更新)

    1.连接池问题 com.mongodb.DBPortPool$SemaphoresOut Concurrent requests for database connection have exceed ...

  4. (十五)mybatis 逆向工程

    目录 为什么需要逆向工程 使用方法 如何读懂生成的代码 总结 为什么需要逆向工程 对于数据库中的那么多的表 ,基本的 CRUD 操作 ,以及 mybatis 需要使用的 接口.mapper ,这些工作 ...

  5. (二十二)自定义简化版JDBC(Dbutils框架的设计思想)

    目录 元数据概念 DataBaseMetaData ParameterMetaData ResultSetMetaData 编写简化版的JDBC O-R Mapping 概念 自定义简化版JDBC 元 ...

  6. Django rest-framework框架-序列化

    序列化: 第一版: class RolesView(APIView): def get(self,request,*args,**kwargs): roles = models.Role.object ...

  7. js之数据类型(对象类型——构造器对象——日期)

    Date对象是js语言中内置的数据类型,用于提供日期与时间的相关操作.学习它之前我们先了解一下什么是GMT,什么时UTC等相关的知识. GMT: 格林尼治标准时间(Greenwich Mean Tim ...

  8. 使用Leangoo玩转故事地图

    转自:https://www.leangoo.com/9944.html 用户故事是在敏捷开发中表达需求的主要方式,我们在做敏捷开发的时候都有需求池的概念,在Scrum中这个需求池就是产品backlo ...

  9. ESP8266 UDP通信

    #include "driver/uart.h" #include "espconn.h" void ICACHE_FLASH_ATTR user_rf_pre ...

  10. ORACLE_笔记_练习题目

    一.plsql用法网址及时复习 extract()函数----用于截取年.月.日.时.分.秒 https://www.cnblogs.com/xqzt/p/4477239.html case when ...