LOJ 6278 數列分塊入門 2

2022-04-29 02:54:10 字數 1343 閱讀 4823

hzwer tql!

漸漸找到了分塊的套路。

給出乙個長為 n 的數列,以及 n個操作,操作涉及區間加法,詢問區間內小於某個值 c*c的元素個數。

殘塊先在原陣列上暴力,然後拿原陣列更新塊陣列(效率高於結構體存id!),整塊就標記。

code:

1 #include2 #include3 #include4 #include5 #include6

#define pb push_back

7#define lb lower_bound

8using

namespace

std;910

const

int maxn = 50005

; 11

12 vectorv[maxn];

13int

bl[maxn],v[maxn],atag[maxn];

14int

n,blo,l,r,opt,c;

1516

void reset(int

x) 21

22void add(int l,int r,int

c)27

for(int i = l;i <= min(n,bl[l]*blo);i++)v[i] +=c;reset(bl[l]);

28for(int i = (bl[r]-1)*blo+1;i <= r;i++)v[i] +=c;reset(bl[r]);

29for(int i = bl[l]+1;i < bl[r];i++)atag[i] +=c;30}

3132

int ask(int l,int r,int

c2)39

for(int i = l;i <= min(bl[l]*blo,n);i++)

40if(v[i]+atag[bl[i]] < c2)cnt++;

41for(int i = (bl[r]-1)*blo+1;i <= min(r,n);i++)

42if(v[i]+atag[bl[i]] < c2)cnt++;

43for(int i = bl[l]+1;i < bl[r];i++)

44 cnt += lb(v[i].begin(),v[i].end(),c2-atag[i])-v[i].begin();

45return

cnt;46}

4748

intmain()

55for(int i = 1;i <= bl[n];i++)sort(v[i].begin(),v[i].end());

56for(int i = 1;i <= n;i++)

61return0;

62 }

LOJ 6278 數列分塊入門 2

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

loj 6278 數列分塊入門 2

題目 區間修改,詢問區間小於c的個數。分塊排序,用vector。至於那個塊的大小,好像要用到均值不等式 我不太會。就開始乙個個試,發現siz sqrt n 4時最快!明天去學一下算分塊複雜度的方法。include include include include include using names...

LOJ 6278 數列分塊入門 2

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