博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Luogu P2880 [USACO07JAN]平衡的阵容Balanced Lineup (ST表模板)
阅读量:5105 次
发布时间:2019-06-13

本文共 1124 字,大约阅读时间需要 3 分钟。

(ST表裸题)

ST表是一种很优雅的算法,用于求静态RMQ

数组l[i][j]表示从i开始,长度为2^j的序列中的最大值

注意事项:

1.核心部分:

for(int j = 1; (1<
<= n; j++) for(int i = 1; i+(1<
<= n; i++) { l[i][j] = max(l[i][j-1],l[i+(1<<(j-1))][j-1]); s[i][j] = min(s[i][j-1],s[i+(1<<(j-1))][j-1]); }

因为i~j的位数是j-i+1位,所以循环的边界需要-1,而所求的两段区间是不相交的,所以循环内不用-1(或者说,-1又+1了)

2.位运算需要频繁地打括号

 

代码如下

#include
#include
using namespace std;const int maxn = 50005;int n,q;int a[maxn],l[maxn][50],s[maxn][50];int al,as,x,y;int main() { scanf("%d%d",&n,&q); for(int i = 1; i <= n; i++){ scanf("%d",&a[i]); l[i][0] = a[i]; s[i][0] = a[i]; } for(int j = 1; (1<
<= n; j++) for(int i = 1; i+(1<
<= n; i++) { l[i][j] = max(l[i][j-1],l[i+(1<<(j-1))][j-1]); s[i][j] = min(s[i][j-1],s[i+(1<<(j-1))][j-1]); } while(q) { q--; scanf("%d%d",&x,&y); int k = 0; while(x+(1<<(k+1))<= y)k++; al = max(l[x][k],l[y-(1<

 

 

转载于:https://www.cnblogs.com/mogeko/p/10066346.html

你可能感兴趣的文章
[双硬盘GPT分区安装linux] ----安装
查看>>
Funny Car Racing CSU - 1333 (spfa)
查看>>
c++ 类的默认八种函数
查看>>
[ kvm ] 学习笔记 1:Linux 操作系统及虚拟化
查看>>
zfs mount
查看>>
easyui之combobox(不定时补充)
查看>>
hdu 3487 Play with Chain (Splay Tree easy)
查看>>
Oracle unable to extend temp segment by 128 in tablespace TEMP
查看>>
android.graphics.Bitmap.Config<ALPHA_8, ARGB_4444,ARGB_8888,RGB_565>
查看>>
使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务
查看>>
第 17 章 Native SQL查询
查看>>
js与jquery异同
查看>>
jquery笔记(效果)
查看>>
windows.h
查看>>
视频笔记
查看>>
微信小程序从零开始开发步骤(三)底部导航栏
查看>>
Java重试机制
查看>>
二维数组与稀疏数组的相互转化
查看>>
一步一步写自表达代码——消小球(3)
查看>>
已成功与服务器建立连接,但是在登录前的握手期间发生错误。 (provider: SSL Provider, error: 0 - 等待的操作过时。)...
查看>>