思路:因為是向下取整開方,那麼其實每個數最多被開個個幾次就會變成0或者1了,更新的時候我們可以將中間的塊標記下是否全部變成了0或者1,如果全變了就不處理
實現**:
#includeusingnamespace
std;
#define ll long long
const
int m = 1e5 + 10
;vector
v[m];
inta[m],block,n;
intsum[m];
inttag[m];
intbl[m];
void reset(intx)}
void update(int l,int
r)
if(bl[l] !=bl[r])
}for(int i = bl[l] + 1;i <= bl[r] - 1;i ++)
}int query(int l,int
r)
for(int i = bl[l] + 1;i <= bl[r]-1;i ++)
ans +=sum[i];
return
ans;
}int
main()
for(int i = 1;i <= n;i ++)
for(int i = 1;i <= n;i ++)
return0;
}
LOJ 6281 數列分塊入門 5
原題位址 題意 給出乙個長為 n 的數列 a,以及 n 個操作,操作涉及區間開方,區間求和。思路 對於整塊的開方操作不像加法一樣可以疊加,開方必須要對每乙個數進行操作,這樣才能進行區間加法運算,但是這樣的話就等於暴力計算每乙個數字,複雜度是n2 n 2,這樣無疑是超時的。於是我們考慮開方的性質,可以...
LOJ 6281 數列分塊入門 5
記憶體限制 256 mib時間限制 500 ms標準輸入輸出 題目型別 傳統評測方式 文字比較 上傳者 hzwer 提交提交記錄 統計討論 1測試資料 題目描述 給出乙個長為 nnn 的數列,以及 nnn 個操作,操作涉及區間開方,區間求和。輸入格式 第一行輸入乙個數字 nnn。第二行輸入 nnn ...
6281 數列分塊入門 5
題目鏈結 用check來判斷整個塊是0是1,如果是0或者是1,就不用再對這個塊裡的元素開方了。對乙個數不斷開方一定會縮小到0或者1。第一行輸入乙個數字 n。第二行輸入 n 個數字,第 i 個數字為 ai,以空格隔開。接下來輸入 n 行詢問,每行輸入四個數字 opt l r c,以空格隔開。若 opt...