ARC 060E 高橋君 倍增 二分

2021-08-03 16:41:06 字數 845 閱讀 8645

題意:一條直線上有n個點x[i],x[i+1]-x[i]<=l,操作:每次可以從乙個點跳到距離不超過其l的另乙個點上.

q次詢問,問從a[j]點跳到b[j]點的最少操作次數?

n<=1e5,x[i],l<=1e9

對每個詢問:初始為i 令l=i+1,r=b[j] 二分最遠能到達的點 最壞情況下o(qnlogn) tle..

其實每次操作就是把a[i]變到最右邊乙個滿足,r[a[i]]-a[i]<=l.

每次查詢就是求最少的r...r(r(a[i]))>=b[i]

設r[k][i] a[i]經過2^k次操作能達到最右邊的位置

二分初始化r[0][i],r[k][i]=r[k-1][r[k-1][i]]

查詢時,找到最後乙個i,r[i][u]

#include using namespace std;

typedef long long ll;

typedef pairii;

const int n=2e5+20;

const int m=5e2+20;

const ll inf=2e15;

ll n,x[n],l,q;

ll d[30][n];

void init() }}

int main()

d[0][i]=l-1;

} init();

ll u,v;

while(q--)

{ scanf("%i64d%i64d",&u,&v);

if(u>v)

swap(u,v);

ll ans=0;

for(ll i=20;i>=0;i--)

{if(d[i][u]

ARC075 E 離散化 樹狀陣列 水

題目大意 給你乙個長度為n的序列。問你有多少個子段滿足其算數平均和 k geq k k.n 1 e5,k 1e9 n leq 1e5,k leq 1e9 n 1e5,k 1e 9 題目思路 題目條件可以轉化為 sum r sum l 1 r l 1 k frac leq k r l 1s um r ...