hdu6107 倍增法st表
发现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表的更多相关文章
- CF1039E Summer Oenothera Exhibition 贪心、根号分治、倍增、ST表
传送门 感谢这一篇博客的指导(Orzwxh) $PS$:默认数组下标为$1$到$N$ 首先很明显的贪心:每一次都选择尽可能长的区间 不妨设$d_i$表示在取当前$K$的情况下,左端点为$i$的所有满足 ...
- CF1190E Tokitsukaze and Explosion 二分、贪心、倍增、ST表
传送门 最小值最大考虑二分答案,不难发现当最小值\(mid\)确定之后,原点到所有直线的距离一定都是\(mid\)时才是最优的,也就是说这些直线一定都是\(x^2+y^2=mid^2\)的切线. 接下 ...
- 倍增笔记ST表
https://noip-1253948194.cos.ap-beijing.myqcloud.com/%E5%80%8D%E5%A2%9E-ST%E7%AE%97%E6%B3%95.mp4 1123 ...
- ST表学习笔记
ST表是一种利用DP思想求解最值的倍增算法 ST表常用于解决RMQ问题,即求解区间最值问题 接下来以求最大值为例分步讲解一下ST表的建立过程: 1.定义 f[i][j]表示[i,i+2j-1]这个长度 ...
- BZOJ4556 [Tjoi2016&Heoi2016]字符串 【后缀数组 + 主席树 + 二分 + ST表】
题目 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了 一个长为n的字符串s,和m个问题.佳媛姐姐必须正确回答这m个问题,才能打开箱子拿到礼物,升职 ...
- poj3264 倍增法(ST表)裸题
打出st表的步骤:1:建立初始状态,2:区间按2的幂从小到大求出值 3:查询时按块查找即可 #include<iostream> #include<cstring> #incl ...
- P7599-[APIO2021]雨林跳跃【二分,倍增,ST表】
正题 题目链接:https://www.luogu.com.cn/problem/P7599 题目大意 \(n\)棵树,在某棵树上时可以选择向左右两边第一棵比它高的树跳,现在\(q\)次询问从\([A ...
- POJ - 1330 Nearest Common Ancestors(dfs+ST在线算法|LCA倍增法)
1.输入树中的节点数N,输入树中的N-1条边.最后输入2个点,输出它们的最近公共祖先. 2.裸的最近公共祖先. 3. dfs+ST在线算法: /* LCA(POJ 1330) 在线算法 DFS+ST ...
- RMQ(倍增法求ST)
解决什么问题:区间查询最值 倍增思想:每次得出结果的范围呈2的幂次增长,有人说相当于二分,目前我觉得相当于线段树的查找. 具体理解看代码: /*倍增法求ST*/ #include<math.h& ...
随机推荐
- 2018acm-icpc西安邀请赛后记
第一次参加icpc的邀请赛,有一点小激动,深知大一弱队实力弱,赛前给队友的目标就是拿块铜,不打铁. 热身赛因为没有用过pc^2,codeblocks又用不习惯的原因,开始调工程调了很久,差一点拿到A题 ...
- python---ORM之SQLAlchemy(5)联合唯一的使用
# coding:utf8 # __author: Administrator # date: // # /usr/bin/env python import sqlalchemy from sqla ...
- layui(一)——layDate组件常见用法
和 layer 一样,我们可以在 layui 中使用 layDate,也可直接使用 layDate 独立版,可按照实际需求来选择.options整理如下: layui.use('laydate', f ...
- SqlServer中的临时表
一.什么是临时表 临时表属于会话级的,会话结束的时候,临时表被释放,其创建.使用.删除都和普通表一样,临时表空间一般利用虚拟内存,不必进行磁盘I/O,因此效率较高..临时表有两种:普通临时表 (#Tb ...
- 注解 和 xml 配置的优缺点【转】
java annotation(注解) 的优点缺点 Annotation和xml各自作为配置项的优点与缺点. Annotation 一.Annotation 的优点 1.保存在 class 文件中,降 ...
- POJ - 2828 Buy Tickets(线段树单点更新)
http://poj.org/problem?id=2828 题意 排队买票,依次给出当前人要插队的位置,每个人有个编号,然后问你最后整个的序列是什么? 分析 最后一个人的要插入的位置是确定的,所以逆 ...
- PHP7 学习笔记(六)403 Forbidden - WAMP Server 2.5
今天在wamp目录下有一个项目:comment 我在我的Windows 7机器上安装了WAMP版本2.5. 当浏览器浏览到本地主机时,WAMP服务器页面是可见的. 但是当我浏览到我的本地主机在我的移动 ...
- 微信接口开发之高级篇系列【微信权限封装类WechatAuth】
ThinkPHP框架目录结构: <?php /** * Created by PhpStorm. * User: Tinywan * Date: 2016/9/11 * Time: 9:55 * ...
- C# 对图片加水印
using System; using System.Collections; using System.Data; using System.Linq; using System.Web; usin ...
- stm32中字节对齐问题(__align(n),__packed用法)
ARM下的对齐处理 from DUI0067D_ADS1_2_CompLib 3.13 type qulifiers 有部分摘自ARM编译器文档对齐部分 对齐的使用: 1.__align(n ...