日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LOJ#6281. 数列分块入门 5

發(fā)布時(shí)間:2025/4/16 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LOJ#6281. 数列分块入门 5 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
內(nèi)存限制:256 MiB時(shí)間限制:500 ms標(biāo)準(zhǔn)輸入輸出 題目類型:傳統(tǒng)評(píng)測方式:文本比較 上傳者:?hzwer 提交提交記錄統(tǒng)計(jì)討論 1 測試數(shù)據(jù)

題目描述

給出一個(gè)長為?nnn?的數(shù)列,以及?nnn?個(gè)操作,操作涉及區(qū)間開方,區(qū)間求和。

輸入格式

第一行輸入一個(gè)數(shù)字?nnn。

第二行輸入?nnn?個(gè)數(shù)字,第 i 個(gè)數(shù)字為?aia_ia?i??,以空格隔開。

接下來輸入?nnn?行詢問,每行輸入四個(gè)數(shù)字?opt\mathrm{opt}opt、lll、rrr、ccc,以空格隔開。

若?opt=0\mathrm{opt} = 0opt=0,表示將位于?[l,r][l, r][l,r]?的之間的數(shù)字都開方。

若?opt=1\mathrm{opt} = 1opt=1,表示詢問位于?[l,r][l, r][l,r]?的所有數(shù)字的和。

輸出格式

對(duì)于每次詢問,輸出一行一個(gè)數(shù)字表示答案。

樣例

樣例輸入

4 1 2 2 3 0 1 3 1 1 1 4 4 0 1 2 2 1 1 2 4

樣例輸出

6 2

數(shù)據(jù)范圍與提示

對(duì)于?100% 100\%100%?的數(shù)據(jù),1≤n≤50000,?231≤others 1 \leq n \leq 50000, -2^{31} \leq \mathrm{others}1n50000,?2?31??others、ans≤231?1 \mathrm{ans} \leq 2^{31}-1ans2?31???1。

?

?

這道題的難點(diǎn)在于如何維護(hù)開根這個(gè)神奇的操作

我自己測的是1e7的數(shù)差不多開五六次根就會(huì)變成1,所以我們直接維護(hù)整個(gè)塊內(nèi)的數(shù)是否變成了1就可以了

?

#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #define int long long using namespace std; const int MAXN=1e5+10; const int INF=1e8+10; inline char nc() {static char buf[MAXN],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,MAXN,stdin),p1==p2)?EOF:*p1++; } inline int read() {char c=nc();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=nc();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=nc();}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) {for(int i=l;i<=min(r,R[l]);i++){sum[belong[i]]-=a[i];a[i]=sqrt(a[i]);sum[belong[i]]+=a[i];}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++){if(flag[i]) {continue;}flag[i]=1;for(int j=L[i*block];j<=R[i*block];j++){sum[i]-=a[j];a[j]=sqrt(a[j]);sum[i]+=a[j];if(a[j]>1) flag[i]=0;}} } int Query(int l,int r) {int ans=0;for(int i=l;i<=min(r,R[l]);i++)ans+=a[i];if(belong[l]!=belong[r])for(int i=L[r];i<=r;i++)ans+=a[i];for(int i=belong[l]+1;i<=belong[r]-1;i++)ans+=sum[i];return ans; } main() {#ifdef WIN32freopen("a.in","r",stdin);// freopen("b.out","w",stdout);#else#endifN=read();block=sqrt(N);for(int i=1;i<=N;i++) a[i]=read();for(int i=1;i<=N;i++) belong[i]=(i-1)/block+1,L[i]=(belong[i]-1)*block+1,R[i]=belong[i]*block;for(int i=1;i<=N;i++) sum[belong[i]]+=a[i];for(int i=1;i<=N;i++){int opt=read(),l=read(),r=read(),c=read();if(opt==0) Sqrt(l,r); else printf("%d\n",Query(l,r));}return 0; }

  

轉(zhuǎn)載于:https://www.cnblogs.com/zwfymqz/p/8445967.html

總結(jié)

以上是生活随笔為你收集整理的LOJ#6281. 数列分块入门 5的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。