发现lca的倍增解法和st表差不多。。原理都是一样的

/*
整篇文章分成两部分,中间没有图片的部分,中间有图片的部分
分别用ST表求f1,f2表示以第i个单词开始,连续1<<j行能写多少单词
*/
#include<bits/stdc++.h>
#define FIN freopen("in.txt","r",stdin);
using namespace std;
#define ll long long
#define MX 100005
#define inf 0x3f3f3f3f
int mx,n,w,dw,pw,a[MX];
int f1[MX][],f2[MX][];
void ST(){
for(int i=;i<=n;i++){//只填一行的状态
int cnt=a[i],j=i+;
while(cnt+a[j]+<=w && j<=n) cnt+=a[j++]+;
f1[i][]=j-i;
}
for(int j=;(<<j)<=mx;j++)
for(int i=;i<=n;i++)
f1[i][j]=f1[i][j-]+f1[i+f1[i][j-]][j-]; for(int i=;i<=n;i++){
int cnt=,j=i,flag=;
while(cnt+a[j]+flag<=dw)//图片的左端能填入的单词
cnt+=a[j++]+flag,flag=;//填入第一个单词后下一个单词就要空一格了
int k=j;
cnt=flag=;
while(cnt+a[k]+flag<=w-pw-dw)//图片右端能填入的单词
cnt+=a[k++]+flag,flag=;
f2[i][]=k-i;
}
for(int j=;(<<j)<=mx;j++)
for(int i=;i<=n;i++)
if(f2[i][j-]==) f2[i][j]=;//第i个单词无法填入有图片的行
else f2[i][j]=f2[i][j-]+f2[i+f2[i][j-]][j-];
}
int RMQ1(int i,int x){//i是当前填的单词下标,x是可以填的行数,返回当前填到了第几个单词
if(x==) return i;
while(x && i<=n){
int j=;
while((<<(j+))<=x)j++;//先求出最大的j
i+=f1[i][j]; x-=(<<j);
}
return i;
}
int RMQ2(int i,int x){
if(x==) return i;
while(x && i<=n){
int j=;
while((<<(j+))<=x) j++;
i+=f2[i][j];x-=(<<j);
}
return i;
}
int RMQ3(int i){//返回填i-n个单词需要的行数
int ret=;
while(i<=n){
int j=;
while(i+f1[i][j+]<=n) j++;//找到最大的j
i+=f1[i][j];
ret+=(<<j);
}
return ret;
}
struct Query{
int x,h;
}q[MX];
int main(){
int T,m;
cin >> T;
while(T--){
scanf("%d%d%d%d",&n,&w,&pw,&dw);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
scanf("%d",&m);
mx=n;
for(int i=;i<=m;i++) {
scanf("%d%d",&q[i].x,&q[i].h);
mx=max(mx,n+q[i].x+q[i].h);
}
ST();
for(int i=;i<=m;i++){
int x=q[i].x,h=q[i].h;
int tmp=RMQ3();//只用f1
if(tmp<=x-){
printf("%d\n",tmp+h);
continue;
}
int ans=x+h-;
int p=RMQ1(,x-);//从第一个单词开始连续x-1行能填的单词书
p=RMQ2(p,h);//从第p个单词开始连续h行能填的单词数
if (p<=n) ans+=RMQ3(p);//把剩下的单词填进去
printf("%d\n",ans);
}
}
return ;
}

hdu6107 倍增法st表的更多相关文章

  1. CF1039E Summer Oenothera Exhibition 贪心、根号分治、倍增、ST表

    传送门 感谢这一篇博客的指导(Orzwxh) $PS$:默认数组下标为$1$到$N$ 首先很明显的贪心:每一次都选择尽可能长的区间 不妨设$d_i$表示在取当前$K$的情况下,左端点为$i$的所有满足 ...

  2. CF1190E Tokitsukaze and Explosion 二分、贪心、倍增、ST表

    传送门 最小值最大考虑二分答案,不难发现当最小值\(mid\)确定之后,原点到所有直线的距离一定都是\(mid\)时才是最优的,也就是说这些直线一定都是\(x^2+y^2=mid^2\)的切线. 接下 ...

  3. 倍增笔记ST表

    https://noip-1253948194.cos.ap-beijing.myqcloud.com/%E5%80%8D%E5%A2%9E-ST%E7%AE%97%E6%B3%95.mp4 1123 ...

  4. ST表学习笔记

    ST表是一种利用DP思想求解最值的倍增算法 ST表常用于解决RMQ问题,即求解区间最值问题 接下来以求最大值为例分步讲解一下ST表的建立过程: 1.定义 f[i][j]表示[i,i+2j-1]这个长度 ...

  5. BZOJ4556 [Tjoi2016&Heoi2016]字符串 【后缀数组 + 主席树 + 二分 + ST表】

    题目 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了 一个长为n的字符串s,和m个问题.佳媛姐姐必须正确回答这m个问题,才能打开箱子拿到礼物,升职 ...

  6. poj3264 倍增法(ST表)裸题

    打出st表的步骤:1:建立初始状态,2:区间按2的幂从小到大求出值 3:查询时按块查找即可 #include<iostream> #include<cstring> #incl ...

  7. P7599-[APIO2021]雨林跳跃【二分,倍增,ST表】

    正题 题目链接:https://www.luogu.com.cn/problem/P7599 题目大意 \(n\)棵树,在某棵树上时可以选择向左右两边第一棵比它高的树跳,现在\(q\)次询问从\([A ...

  8. POJ - 1330 Nearest Common Ancestors(dfs+ST在线算法|LCA倍增法)

    1.输入树中的节点数N,输入树中的N-1条边.最后输入2个点,输出它们的最近公共祖先. 2.裸的最近公共祖先. 3. dfs+ST在线算法: /* LCA(POJ 1330) 在线算法 DFS+ST ...

  9. RMQ(倍增法求ST)

    解决什么问题:区间查询最值 倍增思想:每次得出结果的范围呈2的幂次增长,有人说相当于二分,目前我觉得相当于线段树的查找. 具体理解看代码: /*倍增法求ST*/ #include<math.h& ...

随机推荐

  1. svg标签

    在页面上画图无非有两种方法,一种是canvas,另外一种就是svg了,canvas之前已经介绍过了,现在来介绍一下svg吧. 其实早在svg出现以前几年,微软已经推出了类似的东西,叫做vml,早期是为 ...

  2. 通过Cloudera Manager部署CDH5.15.1的webUI界面详解

    通过Cloudera Manager部署CDH5.15.1的webUI界面详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客CDH的部署完全通过Cloudera Mana ...

  3. Vagrant工具的安装

    Vagrant工具的安装 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 这篇博客源于我的北京一位好友:崔佳.在此,为了感激崔佳的帮助,特意写下这篇博客.希望对一些开发的小伙伴有些帮 ...

  4. nginx的负载均衡配置,常用策略

    场景:nginx是一款非常优秀的负载均衡服务器,小巧而且性能强悍,中小型企业的首选. 下面介绍nginx的负载均衡的几种常见的配置以及优缺点 第一种:轮询(默认) 优点:实现简单 缺点:不考虑每台服务 ...

  5. 内联函数 —— C 中关键字 inline 用法解析

    一.什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗. 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数. 栈空间就是指放 ...

  6. numpy笔记—ravel和c_命令(区别flatten)

    np.c_给numpy数组添加列 np.r_给numpy数组添加行 ravel(): 将多维数组降成一维, 返回的是视图

  7. Mongodb 备份 数据导出导入

    MongoDB 客户端工具 mongochef 可以进行一系类操作 MongoDB 非客户端操作 : mongod 备份导出 mongoexport -h IP --port 端口 -u 用户名 -p ...

  8. PyCharm的调试

    1.设置断点 2.debug模式运行    F8      下一行代码 查看当前位置所有局部变量:print(locals()) 查看全局变量:                      print( ...

  9. Linux 之【辨析UPDATE/UPGRADE】和安装/卸载软件(apt-get)

    一.[辨析UPDATE/UPGRADE] UPDATE: update is used to download package information from all configured sour ...

  10. POJ1679 The Unique MST【次小生成树】

    题意: 判断最小生成树是否唯一. 思路: 首先求出最小生成树,记录现在这个最小生成树上所有的边,然后通过取消其中一条边,找到这两点上其他的边形成一棵新的生成树,求其权值,通过枚举所有可能,通过这些权值 ...