數列分塊入門 2

2022-05-20 00:53:08 字數 1200 閱讀 8467

這道題他們說不用分塊就用平衡樹,所以暴力拆解就用分塊。

做了兩道分塊已經漸漸明白分塊的一些模板在這裡就放一下吧(用vector比用陣列md方便多了)

1

void

/*修改操作

*//*

查詢操作

*/ (int l,int r.....,int val)/*

修改的要素*/2

8if(/*

l 和 r 不在同乙個區間 就把 r 所在的角區間列舉修改(查詢)*/)

913/*最後就整塊整塊的列舉啦

*/14 }

這道題就是維護每個塊內的元素成單調的,這樣最後查詢的時候就可以用二分(lower_bound)來進行查詢會快很多,而剩下的就只有暴力、暴力再暴力。

1 #include2

using

namespace

std;

3intn;4

intblock;

5int id[50009];6

int num[50009];7

int tag[10009

];8 vectorv[10009

];9 inline long

long

kd()

1013

while(ch>='

0'&&ch<='9')

14return x*f;15}

16 inline void reset(int

now)

1723 inline void add(int l,int r,int

c)24

33for(int i=id[l]+1;i<=id[r]-1;i++)tag[i]+=c;/*直接用tag來修改整塊區間*/34}

35int query(int l,int r,int

c)3647}

48for(int i=id[l]+1;i<=id[r]-1;i++)

4953

return

ans;54}

55int

main()

5665

for(int i=1;i<=id[n];i++)

66sort(v[i].begin(),v[i].end());

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

6874

return0;

75 }

數列分塊入門2

題目鏈結 給出乙個長為 n 的數列,以及 n 個操作,操作涉及區間加法,詢問區間內小於某個值 的元素個數。根據數列分塊入門1的思想,把n個數分為根號n塊,不完整塊的去暴力求和和查詢,完整塊用加法標進行標記,查詢排序後進行二分查詢。include include include include inc...

數列分塊入門 2

題目描述 給出乙個長為n的數列,以及n個操作,操作涉及區間加法,詢問區間內小於某個值x的元素個數。輸入格式 第一行輸入乙個數字n。第二行輸入n個數字,第i個數字為ai,以空格隔開。接下來輸入n行詢問,每行輸入四個數字 opt l r c,以空格隔開。若opt 0 表示將位於 l,r 的之間的數字都加...

6278 數列分塊入門 2

題目描述 給出乙個長為 nn 的數列,以及 nn 個操作,操作涉及區間加法,詢問區間內小於某個值 xx 的元素個數。輸入格式 第一行輸入乙個數字 nn。第二行輸入 nn 個數字,第 ii 個數字為 a iai 以空格隔開。接下來輸入 nn 行詢問,每行輸入四個數字 mathrmopt ll rr c...