這道題他們說不用分塊就用平衡樹,所以暴力拆解就用分塊。
做了兩道分塊已經漸漸明白分塊的一些模板在這裡就放一下吧(用vector比用陣列md方便多了)
1void
/*修改操作
*//*
查詢操作
*/ (int l,int r.....,int val)/*
修改的要素*/2
8if(/*
l 和 r 不在同乙個區間 就把 r 所在的角區間列舉修改(查詢)*/)
913/*最後就整塊整塊的列舉啦
*/14 }
這道題就是維護每個塊內的元素成單調的,這樣最後查詢的時候就可以用二分(lower_bound)來進行查詢會快很多,而剩下的就只有暴力、暴力再暴力。
1 #include2using
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...