发现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. 【maven】依赖、继承、聚合

    依赖: <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId&g ...

  2. Python/spss-多元回归建模-共线性诊断1(推荐A)

    欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction ...

  3. JS基础:求一组数中的最大最小值,以及所在位置

    var arr = [0, 5, -3, 6, 2, -6, 10]; //定义一个最大值和一个最小值,把他们的索引值赋值给固定的两个变量 var maxValue = arr[0]; var min ...

  4. CodeForces - 348D Turtles(LGV)

    https://vjudge.net/problem/CodeForces-348D 题意 给一个m*n有障碍的图,求从左上角到右下角两条不相交路径的方案数. 分析 用LGV算法.从(1,1)-(n, ...

  5. CSS魔法(四)常用属性

    元素的显示与隐藏 display.visibility.overflow 在CSS中有三个显示和隐藏的单词比较常见,我们要区分开,他们分别是 display.visibility 和 overflow ...

  6. 大量界面刷新时手动Dispose也是有必要的

    在winform窗体上拖一个flowLayoutPane,一个Button,项目中再创建一个用户控件UcControl,用户控件上放几十个子控件 private void button1_Click( ...

  7. __weak 修饰符

    在 HAL 库中,很多回调函数前面使用__weak 修饰符,这里我们有必要给大家讲解__weak 修饰符的作用. weak 顾名思义是“弱”的意思,所以如果函数名称前面加上__weak 修饰符,我们一 ...

  8. JavaScript之函数调用与被调用的上下文对象this

    不同的调用机制决定了函数上下文对象的不同: 1.  作为普通函数进行调用时,其上下文是全局对象window; 2.  作为(对象)方法进行调用时,其上下文对象时拥有该方法的对象; 3.  作为构造器( ...

  9. 【摘】SVN提交与版本冲突

    一般性解决办法 1.要提交的内容备份到项目之外[为还原版本做准备] 2.还原[回到之前版本] 3.更新[更新版本号和版本] 4.填充内容[即 将自己之前备份的内容填充项目对应处] 5.提交 6.OK ...

  10. TIdHTTP get参数带中文解决方法--请求报文

    Post 看起来稍微复杂先,暂不讨论.post 目前按照一般方法有中文名也可以. 拼接时:pointname=九记餐厅&begintime=2017-03-01 00:00:00& 有 ...