hdu 5875(ST 二分區間)

2021-08-06 02:49:41 字數 467 閱讀 4219

題意:給乙個序列,有n個數字和m次詢問。每次詢問給乙個區間,問這個區間從l開始一直對l後面的陣列取模,一直到r。

分析:乙個較小的數字對乙個較大的數字取模,值不發生改變。所以每次只要找最近的比自己小的數字取模更新答案即可。用rmq維護區間最小值。每次查詢乙個區間就在這個區間內進行二分。如果左區間有比l小的數字則再次縮小區間,知道某個小區間的值全部大於當前的l或者區間長度變為1,則對這個數字取模。然後更新l。如果左區間最小值比當前的l的值大,就對右區間進行相同的操作。這樣一直不斷更新l 直到l==r.或者 整個區間內的最小值小於當前的l,則退出,輸出答案。

#include#include#includeusing namespace std;

const int maxn = 100006;

int n,m;

int d[maxn][30];

void rmq_init()

{ for(int i=0;i

HDU 4768 (二分區間 漲姿勢)

題意 告訴n組a,b,c,按照a k c生成等差數列,問這n組數列中哪個數字出現了奇數次以及出現了幾次,題目保證最多隻會出現乙個這種數字。分析 讀完題並沒有思路,後來知道是二分區間,列舉是哪個數字出現了奇數次,算該數字之前一共有幾個數字,如果是奇數個,說明答案就在 l mid 中。ps 之前用二分只...

HDU 4417 (二分 區間第k大)

查詢區間 l,r 中有多少數 比給定的 h 小。我們可以這麼想,h 一定會比 區間的第 x 大 第 x 1 小。怎麼確定 x。這是乙個單調的問題,所以二分 區間第 k 大就可以確定了。include include include include using namespace std const ...

二分查詢 二分區間 快速冪(二分冪)

include include using namespace std 二分查詢 初始區間 0,n 1 intbinarysearch int a,int left,int right,int x else return 1 二分 找出元素的區間左閉右開 初始區間 0,n intlower boun...