這題我得著重給一給資料範圍,嗯嗯
哈哈,我們發現a[i]最大是231-1。
好,我們開開方先:
2147483647
46340(取整的)
2151431
1…我們再試幾個數,發現最終會變成0或1,然後就不會在變了。
所以,它最多會開方5次,然後便相當於不變了。
這樣子,我們一開始全部暴力改。
每當乙個塊的全部a都變成了0或1的話,就標記一下,表示下次不用再搞了。
對於每個塊,我們用個d來存它的和。
求答案的話便和以前那些差不多,
分成三塊。
左邊凸出來的,右邊凸出來的,以及中間的完整的塊。
嘻嘻,兩邊暴力,中間就用到d即可。
上標:
#include
#include
#include
using namespace std;
int a[
50010
],d[
321]
,n,b[
321]
;int opt,l,r,c,st;
int bl[
50010
],le[
321]
,ri[
321]
;bool check[
321]
;inline
intread()
void
solve
(int x)
}void
open_square
(int l,
int r)
for(
int i=bl[l]+1
;i<=bl[r]-1
;i++
)solve
(i);
}int
query
(int l,
int r)
intmain()
for(
int i=
1;i<=n;i++
)return0;
}
6281 數列分塊入門 5
題目鏈結 用check來判斷整個塊是0是1,如果是0或者是1,就不用再對這個塊裡的元素開方了。對乙個數不斷開方一定會縮小到0或者1。第一行輸入乙個數字 n。第二行輸入 n 個數字,第 i 個數字為 ai,以空格隔開。接下來輸入 n 行詢問,每行輸入四個數字 opt l r c,以空格隔開。若 opt...
數列分塊入門 8 總結
這題我們只需設個check i 表示第i塊是否都為乙個數,b i 表示第i塊變成的數。然後暴力搞就可以了。至於為什麼,我們看看hzwer大佬 黃學長 的解釋吧 d a l a o 上標 include include include define n 100010 using namespace s...
LOJ 6281 數列分塊入門 5
原題位址 題意 給出乙個長為 n 的數列 a,以及 n 個操作,操作涉及區間開方,區間求和。思路 對於整塊的開方操作不像加法一樣可以疊加,開方必須要對每乙個數進行操作,這樣才能進行區間加法運算,但是這樣的話就等於暴力計算每乙個數字,複雜度是n2 n 2,這樣無疑是超時的。於是我們考慮開方的性質,可以...