loj 6278 數列分塊入門 2

2021-08-20 18:32:05 字數 1371 閱讀 1163

題目

區間修改,詢問區間小於c的個數。分塊排序,用vector。至於那個塊的大小,好像要用到均值不等式

我不太會。。。就開始乙個個試,發現siz=sqrt(n)/4時最快!!!明天去學一下算分塊複雜度的方法。

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 50005;

const

int n = 1005;

inline

int rd()

while(ch>='0' && ch<='9')

return x*f;

}vector

b[n];

int n,siz;

int a[maxn],l[n],r[n];

int num,bl[maxn],inc[maxn];

inline

void reset(int id)

inline

void build()

r[num]=n;

for(register

int i=1;i<=num;i++) reset(i);

}inline

void update(int ql,int qr,int w)

for(register

int i=ql;i<=r[bl[ql]];i++)

a[i]+=w;

reset(bl[ql]);

for(register

int i=bl[ql]+1;ifor(register

int i=l[bl[qr]];i<=qr;i++)

a[i]+=w;

reset(bl[qr]);

}inline

int query(int ql,int qr,int c)

for(register

int i=ql;i<=r[bl[ql]];i++)

ret+=(a[i]+inc[bl[i]]for(register

int i=l[bl[qr]];i<=qr;i++)

ret+=(a[i]+inc[bl[i]]for(register

int i=bl[ql]+1;iint tar=c-inc[i];

ret+=lower_bound(b[i].begin(),b[i].end(),tar)-b[i].begin();

}return ret;

}int main()

return

0;}

LOJ 6278 數列分塊入門 2

題意 給出乙個長為 n 的數列,以及 n個操作,操作涉及區間加法,詢問區間內小於某個值 x的元素個數。思路 這裡有兩種操作,一種是區間加法,這在上一部落格已經介紹過了,不會的戳這裡,還有一種是區間查詢,因為每次查詢的數字都是不一樣的,所以要想時間最優化,必須要排序,因為排序後的查詢操作可以達到log...

LOJ 6278 數列分塊入門 2

記憶體限制 256 mib時間限制 500 ms標準輸入輸出 題目型別 傳統評測方式 文字比較 上傳者 hzwer 提交提交記錄 統計討論 測試資料 題目描述 給出乙個長為 nnn 的數列,以及 nnn 個操作,操作涉及區間加法,詢問區間內小於某個值 的元素個數。輸入格式 第一行輸入乙個數字 nnn...

LOJ 6278 數列分塊入門 2

解題思路 分塊維護區間遞增序列。對於修改,邊界暴力後修改兩個邊界的遞增串行使其正確,完整塊打標記 對於詢問,邊界暴力 塊內二分 修改的複雜度 o sqrt n 2 sqrt n log sqrtn 詢問複雜度 o sqrt n 2 sqrt n 所以整體大概是 o q sqrt n log sqrt...