日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

洛谷 P3865 【模板】ST表

發布時間:2025/3/14 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷 P3865 【模板】ST表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

洛谷 P3865 【模板】ST表

題目:

  • 因為是水題,直接丟鏈接了:鏈接

題解:

  • 把這題丟上來的原因是因為以前學ST的時候是真的水=.=,幾乎就是背代碼。
  • 現在重新看書后有了較深刻的理解:
  • 遞推時,有公式f(i, j) = max(f(i, j - 1), f(i + \(2^{k+1}\), j - 1)),即長度為\(2^j\)的區間的最大值是左右兩半長度為\(2^{j - 1}\)的子區間的max
  • 當查詢時,先計算出一個k,使得\(2^k\) < r - l + 1 <= \(2^{k + 1}\),那么以l開始的\(2^k\)個數和以r結尾的\(2^k\)個數一定覆蓋了整個區間(l, r)。所以取這兩子區間的max即可
  • 證明很容易,因為兩個子區間的長度都為\(2^k\),那么兩個子區間的長度和就是\(2^k\) * 2 = \(2^{k+1}\),又\(2^{k+1}\) >= r - l + 1,所以一定覆蓋。
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #define N 100005 using namespace std;int n, q, logg; int f[N][31];int read() {int x = 0; char c = getchar();while(c < '0' || c > '9') c = getchar();while(c >= '0' && c <= '9') {x = x * 10 + c - '0'; c = getchar();}return x; }int main() {memset(f, -0x3f, sizeof(f));cin >> n >> q;for(int i = 1; i <= n; i++) f[i][0] = read();logg = (int)log2(n);for(int j = 1; j <= logg; j++)for(int i = 1; i <= n - (1 << j) + 1; i++)f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);for(int i = 1; i <= q; i++){int l = read(), r = read();logg = (int)log2(r - l + 1);printf("%d\n", max(f[l][logg], f[r - (1 << logg) + 1][logg]));}return 0; }

轉載于:https://www.cnblogs.com/BigYellowDog/p/11279681.html

總結

以上是生活随笔為你收集整理的洛谷 P3865 【模板】ST表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。