題意:一條直線上有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 ...