當前位置:
首頁 >
BZOJ 3211: 花神游历各国
發(fā)布時間:2025/3/15
28
豆豆
生活随笔
收集整理的這篇文章主要介紹了
BZOJ 3211: 花神游历各国
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Description
Input
Output
每次x=1時,每行一個整數(shù),表示這次旅行的開心度
Sample Input
4
1 100 5 5
5
1 1 2
2 1 2
1 1 2
2 2 3
1 1 4
Sample Output
101
11
11
HINT
對于100%的數(shù)據(jù), n ≤ 100000,m≤200000 ,data[i]非負且小于10^9
Solution
直接線段樹維護。
因為一個數(shù)不會被開方幾次,我們可以直接暴力修改。
如果一個區(qū)間中的數(shù)都為 0/1 (開方后為自己),就打上一個標記(修改時可直接退出)。
時間復雜度 O(N?log?N) 。
Code
#include<cstdio> #include<cctype> #include<cmath> using namespace std; const int N=1e5+5; int ql,qr; int a[N]; long long f[N<<2]; bool g[N<<2]; inline int read() {int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X; } inline void update(int v) {f[v]=f[v<<1]+f[v<<1|1];g[v]=g[v<<1]&&g[v<<1|1]; } void make(int v,int l,int r) {if(l==r){f[v]=a[l];if(f[v]<=1) g[v]=true;return;}int mid=(l+r)>>1;make(v<<1,l,mid);make(v<<1|1,mid+1,r);update(v); } void change(int v,int l,int r) {if(g[v]) return;if(l==r){f[v]=sqrt(f[v]);if(f[v]<=1) g[v]=true;return;}int mid=(l+r)>>1;if(ql<=mid) change(v<<1,l,mid);if(qr>mid) change(v<<1|1,mid+1,r);update(v); } long long find(int v,int l,int r) {if(ql<=l && r<=qr) return f[v];int mid=(l+r)>>1;long long sum=0;if(ql<=mid) sum+=find(v<<1,l,mid);if(qr>mid) sum+=find(v<<1|1,mid+1,r);return sum; } int main() {int n=read();for(int i=1;i<=n;i++) a[i]=read();make(1,1,n);int m=read();while(m--){int x=read();ql=read(),qr=read();if(x==2) change(1,1,n); else printf("%lld\n",find(1,1,n));}return 0; }總結(jié)
以上是生活随笔為你收集整理的BZOJ 3211: 花神游历各国的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JZOJ 3947 . 【省常中JSOI
- 下一篇: BZOJ 2957: 楼房重建