求子區間(主席樹)

2021-09-25 15:00:22 字數 1153 閱讀 3482

時間限制:c/c++ 2秒,其他語言4秒

空間限制:c/c++ 262144k,其他語言524288k

64bit io format: %lld

給乙個長度為n的陣列a,給定乙個d,q,接下來有q次詢問,每次詢問區間 [l, r]內有多少子區間,其區間和大於等於d

q行每行乙個數字表示答案
示例1

複製

5 3 2

1 2 3 4 5

1 32 4

複製

4

5

【題意】

首先,預處理nex陣列,nex[i]代表著從i點向右擴充套件,區間和恰好大於等於d時的下標。

那麼每次查詢l,r的時候,只要將l,r間的nex陣列取出來。答案就是num*r-sum+num;num代表著l,r區間內,nex陣列小於r的個數,sum代表著nex數小於r的數之和。

num*r-sum+num:(r-

【**】

#include#define rep(i,a,b) for(int i=a;i<=(b);++i)

#define mem(a,x) memset(a,x,sizeof(a))

#define pb push_back

using namespace std;

typedef long long ll;

const int n=3e5+10;

int nex[n];

ll a[n];

int ls[n*40],rs[n*40],rt[40*n],num[n*40];

ll sum[n*40];

int n,d,q,cnt;

void up(int pre,int &o,int l,int r,int pos,int val)

ll qu1(int o,int l,int r,int ql,int qr)

int qu2(int o,int l,int r,int ql,int qr)

int main()

int l=1,r=1;

ll sum=a[l];

while(l<=n)

}

合併子區間

輸入 1,3 2,6 8,10 15,18 輸出 1,6 8,10 15,18 解釋 區間 1,3 和 2,6 重疊,將它們合併為 1,6 核心思想是 1.根據所有區間的開始位置進行排序 2.如果當前區間的開始比上乙個區間的結束小,則進行合併 3.不斷重複2 4.新增最後乙個區間 python 實現...

重疊子區間問題

新的一天,新的刷題記錄。leetcode 435 無重疊區間 給定乙個區間的集合,找到需要移除區間的最小數量,使剩餘區間互不重疊。注意 可以認為區間的終點總是大於它的起點。區間 1,2 和 2,3 的邊界相互 接觸 但沒有相互重疊。示例 輸入 1,2 2,3 3,4 1,3 輸出 1解釋 移除 1,...

區間第k大(主席樹)

學了一下主席樹模板題,當初看了網上的主席樹講解都沒有看懂,後面看了嗶哩嗶哩的uestc的主席樹,終於看懂了思想。每次更新的複雜度都為logn。每次更新的話就是對要更新的點路徑上的點重新更加乙個,然後進行對沒有影響的那些進行連邊。然後用乙個root記錄每乙個線段樹的根節點下標。include incl...