LOJ 6278 數列分塊入門 2

2021-09-24 21:03:59 字數 1364 閱讀 2972

解題思路:

分塊維護區間遞增序列。

對於修改,邊界暴力後修改兩個邊界的遞增串行使其正確,完整塊打標記

對於詢問,邊界暴力+塊內二分

修改的複雜度 o(sqrt(n) + 2*sqrt(n)*log(sqrtn))

詢問複雜度    o (sqrt(n) + 2*sqrt(n))

所以整體大概是 o (q*sqrt(n)*log(sqrtn))//玄學計算複雜度,不太準

所以分塊大概是用來處理幾萬的資料量的。(5e4的資料什麼的)

話不多說,直接看板子就得啦。(要交c++17才能過,不過**本身應該是沒問題的,自己測試過上面的資料了)

#include#include#include#include#include#define pb push_back

#define ll long long

using namespace std;

const int n = 5e4+5;

const int m = 500;

int blo,n;

int bl[n];

ll a[n];

ll atag[m];

vectorve[m];

void reset(int x)

sort(ve[x].begin(),ve[x].end());

}void modify(int l,int r,ll c)

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

atag[i] += c;

}int query(int l,int r,ll c)

//printf("ans=%d\n",ans);

for (int i=bl[l]+1;i<=bl[r]-1;i++)//printf("ans=%d\n",ans);

return ans;

}int main()

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

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

int op,l,r;

ll c;

int q = n;

while (q--)

printf("\n");

*/ }

else printf("%d\n",query(l,r,c*c));

}return 0;

}

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...