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

/*
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. Linux Shell中的变量声明和一些特殊变量

    在SHELL中定义变量比较直接,无类型区别,不需要像Java那样定义好是String还是int等. 声明变量需要遵守或者注意的几点: 变量名和等号之间不能有空格. 变量名首字符必须为字母. 变量名里可 ...

  2. cmd寻找tomcat的命令和删除进程的命令

    netstat -ano | findstr 8080taskkill -f -pid 端口 idea 异常关闭,无法启动Tomcat提示Error running ‘server_web’: Una ...

  3. C++目录

    C++ lambda表达式 C++中如何设计一个类只能在堆或者栈上创建对象,面试题 C++之STL总结精华笔记 指针强制类型转换的理解 关于指针类型和指针类型转换的理解 C++继承种类 C++ 单例模 ...

  4. Thinkphp解决phpExcel导出数据量大导致内存溢出

    工作需要导出几万的数据量.操作比较频繁.之前数据在七八千是数据导出很慢.phpExcel是方便但是性能一般.现在改为使用csv导出数据:可以缓解内存压力,一次导出两三万是没问题的.当然服务器内存给力, ...

  5. 【深度森林第三弹】周志华等提出梯度提升决策树再胜DNN

    [深度森林第三弹]周志华等提出梯度提升决策树再胜DNN   技术小能手 2018-06-04 14:39:46 浏览848 分布式 性能 神经网络   还记得周志华教授等人的“深度森林”论文吗?今天, ...

  6. Spring MVC 探讨DispatcherServlet

    先上DispatcherServlet的运行流程图(request processing):

  7. java Lesson08总结

    package com.xt.java.FirstExciple.oop; public class NokiaPhone {  //成员变量 String name="np001" ...

  8. js中逻辑运算符||和&& 的返回值并不只有true和false

    以前我一直认为逻辑运算符的返回值一直是true或者false,其实根本就没考虑过它又返回值,一直是在if判断语句中作为一个条件使用,只是为了能让条件正确与否进入if语句.根本就没用到逻辑运算符的返回值 ...

  9. 使用百度echarts仿雪球分时图(三)

    这章节将完成我们的分时图,并使用真实的数据来进行展示分时图. 一天的交易时间段分为上午的09:30~11:30,下午的13:00~15:00两个时间段,因为分时间段的关系,数据是不连续的,所以会先分为 ...

  10. Python与C/C++相互调用(转)

    原文链接 作者 一.问题 Python模块和C/C++的动态库间相互调用在实际的应用中会有所涉及,在此作一总结. 二.Python调用C/C++ 1.Python调用C动态链接库 Python调用C库 ...