記憶體限制:256 mib時間限制:500 ms標準輸入輸出
題目型別:傳統評測方式:文字比較
上傳者: hzwer
提交提交記錄
統計討論
1測試資料
題目描述
給出乙個長為 nnn 的數列,以及 nnn 個操作,操作涉及區間開方,區間求和。
輸入格式
第一行輸入乙個數字 nnn。
第二行輸入 nnn 個數字,第 i 個數字為 aia_iai,以空格隔開。
接下來輸入 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,−231≤others、ans≤231−1 \mathrm \leq 2^-1ans≤231−1。
這道題的難點在於如何維護開根這個神奇的操作
我自己測的是1e7的數差不多開五六次根就會變成1,所以我們直接維護整個塊內的數是否變成了1就可以了
#include#include#include#include#include#include#define int long longusing 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...