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