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& ...
随机推荐
- 搭建Spring4+Spring MVC web工程的最佳实践
Spring是个非常非常非常优秀的java框架,主要是用它的IOC容器帮我们依赖注入和管理一些程序中的Bean组件,实现低耦合关联,最终提高系统可扩展性和可维护性,用它来辅助我们构建web工程将会感觉 ...
- collectd使用
1.什么是collectd collectd是一款基于C语言研发的插件式架构的监控软件,它可以收集各种来源的指标,如操作系统,应用程序,日志文件和外部设备,并存储此信息或通过网络提供.这些统计数据可用 ...
- Java中的回车换行符/n /r /t
'\r'是回车,'\n'是换行,前者使光标到行首,后者使光标下移一格.通常用的Enter是两个加起来.下面转一篇文章. 回车和换行 今天,我总算搞清楚“回车”(carriage return)和“换行 ...
- HDU - 4901 The Romantic Hero(dp)
https://vjudge.net/problem/HDU-4901 题意 给n个数,构造两个集合,使第一个集合的异或和等于第二个集合的相与和,且要求第一个集合的元素下标都小于第二个集合的元素下标. ...
- 使用 CSS3 的 box-sizing 属性设置元素大小包含 border 与 padding
Ø 默认情况下,内部元素(如:input)的宽度或高度,是不会包含元素的边框和内边距的,这时就需要使用 box-sizing 属性设置该元素. Ø box-sizing 是 CSS3 的属性,可以 ...
- android contentprovider内容提供者
contentprovider内容提供者:让其他app可以访问私有数据库(文件) 1.AndroidManifest.xml 配置provider <?xml version="1.0 ...
- [Offer收割]编程练习赛9,10
题目1 : 闰秒 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 计算机系统中使用的UTC时间基于原子钟,这种计时方式同“地球自转一周是24小时”的计时方式有微小的偏差. ...
- JavaScript之form表单的序列化和json化[form.js]
一.应用场景 form提交时,使用ajax提交. 二.效果 通过本工具,实现表单所有form的快速序列化和json化,使前端人员在ajax提交form表单的时,脱离重复性的,大劳动量的手动抽取form ...
- Java SE 之 数据库操作工具类(DBUtil)设计
JDBC创建数据库基本连接 //1.加载驱动程序 Class.forName(driveName); //2.获得数据库连接 Connection connection = DriverManager ...
- redis实现消息队列&发布/订阅模式使用
在项目中用到了redis作为缓存,再学习了ActiveMq之后想着用redis实现简单的消息队列,下面做记录. Redis的列表类型键可以用来实现队列,并且支持阻塞式读取,可以很容易的实现一个高性 ...