LOJ 6281 數列分塊入門 5

2022-05-02 11:48:09 字數 1666 閱讀 6399

記憶體限制:256 mib時間限制:500 ms標準輸入輸出

題目型別:傳統評測方式:文字比較

上傳者: hzwer

提交提交記錄

統計討論

1測試資料

題目描述

給出乙個長為 nnn 的數列,以及 nnn 個操作,操作涉及區間開方,區間求和。

輸入格式

第一行輸入乙個數字 nnn。

第二行輸入 nnn 個數字,第 i 個數字為 aia_ia​i​​,以空格隔開。

接下來輸入 nnn 行詢問,每行輸入四個數字 opt\mathrmopt、lll、rrr、ccc,以空格隔開。

若 opt=0\mathrm = 0opt=0,表示將位於 [l,r][l, r][l,r] 的之間的數字都開方。

若 opt=1\mathrm = 1opt=1,表示詢問位於 [l,r][l, r][l,r] 的所有數字的和。

輸出格式

對於每次詢問,輸出一行乙個數字表示答案。

樣例樣例輸入

4

1 2 2 3

0 1 3 1

1 1 4 4

0 1 2 2

1 1 2 4

樣例輸出

6

2

資料範圍與提示

對於 100% 100\%100% 的資料,1≤n≤50000,−231≤others 1 \leq n \leq 50000, -2^ \leq \mathrm1≤n≤50000,−2​31​​≤others、ans≤231−1 \mathrm \leq 2^-1ans≤2​31​​−1。

這道題的難點在於如何維護開根這個神奇的操作

我自己測的是1e7的數差不多開五六次根就會變成1,所以我們直接維護整個塊內的數是否變成了1就可以了

#include#include#include#include#include#include#define int long long 

using namespace std;

const int maxn=1e5+10;

const int inf=1e8+10;

inline char nc()

inline int read()

while(c>='0'&&c<='9')

return x*f;

}int n;

int a[maxn],block,l[maxn],r[maxn],belong[maxn],sum[maxn],flag[maxn];

void sqrt(int l,int r)

if(belong[l]!=belong[r])

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

sum[belong[i]]-=a[i],a[i]=sqrt(a[i]),sum[belong[i]]+=a[i];

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

flag[i]=1;

for(int j=l[i*block];j<=r[i*block];j++)

}}int query(int l,int r)

main()

return 0;

}

LOJ 6281 數列分塊入門 5

原題位址 題意 給出乙個長為 n 的數列 a,以及 n 個操作,操作涉及區間開方,區間求和。思路 對於整塊的開方操作不像加法一樣可以疊加,開方必須要對每乙個數進行操作,這樣才能進行區間加法運算,但是這樣的話就等於暴力計算每乙個數字,複雜度是n2 n 2,這樣無疑是超時的。於是我們考慮開方的性質,可以...

Loj 6281 數列分塊入門 5

思路 因為是向下取整開方,那麼其實每個數最多被開個個幾次就會變成0或者1了,更新的時候我們可以將中間的塊標記下是否全部變成了0或者1,如果全變了就不處理 實現 includeusing namespace std define ll long long const int m 1e5 10 vect...

6281 數列分塊入門 5

題目鏈結 用check來判斷整個塊是0是1,如果是0或者是1,就不用再對這個塊裡的元素開方了。對乙個數不斷開方一定會縮小到0或者1。第一行輸入乙個數字 n。第二行輸入 n 個數字,第 i 個數字為 ai,以空格隔開。接下來輸入 n 行詢問,每行輸入四個數字 opt l r c,以空格隔開。若 opt...