【BZOJ】【3211】花神游历各国
线段树/暴力
线段树区间开方
唉,我傻逼了一下,TLE了一发,因为没考虑到0的情况……
好吧简单来说一下,线段树动态查询区间和大家都会做……比较麻烦的是这次的修改变成开方了,然而这并没有什么好虚的,注意到权值的范围是$10^9$,我们随手打个表可以发现,对$10^9$不断开根的结果是:1000000000,31622,177,13,3,1。也就是说,每个数,它开根的次数并没有多少(联想一下CF 250的那道区间取模的题!)所以我们维护一个区间最大值,每次暴力对每个数开根就可以了(如果区间最大值为0或1就可以跳过咯)
1 /************************************************************** 2 Problem: 3211 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:1276 ms 7 Memory:6364 kb 8 ****************************************************************/ 9 10 //BZOJ 3211 11 #include<vector> 12 #include<cmath> 13 #include<cstdio> 14 #include<cstring> 15 #include<cstdlib> 16 #include<iostream> 17 #include<algorithm> 18 #define rep(i,n) for(int i=0;i<n;++i) 19 #define F(i,j,n) for(int i=j;i<=n;++i) 20 #define D(i,j,n) for(int i=j;i>=n;--i) 21 #define pb push_back 22 using namespace std; 23 inline int getint(){ 24 int v=0,sign=1; char ch=getchar(); 25 while(ch<'0'||ch>'9'){ if (ch=='-') sign=-1; ch=getchar();} 26 while(ch>='0'&&ch<='9'){ v=v*10+ch-'0'; ch=getchar();} 27 return v*sign; 28 } 29 const int N=1e5+10,INF=~0u>>2; 30 typedef long long LL; 31 /******************tamplate*********************/ 32 33 int n,m,a[N],mx[N<<2]; 34 LL sm[N<<2]; 35 #define L (o<<1) 36 #define R (o<<1|1) 37 #define mid (l+r>>1) 38 void maintain(int o){ 39 mx[o]=max(mx[L],mx[R]); 40 sm[o]=sm[L]+sm[R]; 41 } 42 void build(int o,int l,int r){ 43 if (l==r){mx[o]=sm[o]=a[l];} 44 else{ 45 build(L,l,mid); 46 build(R,mid+1,r); 47 maintain(o); 48 } 49 } 50 void update(int o,int l,int r,int ql,int qr){ 51 if (mx[o]==1 || mx[o]==0) return; 52 if (l==r){mx[o]=sm[o]=sqrt(mx[o]);} 53 else{ 54 if (ql<=mid) update(L,l,mid,ql,qr); 55 if (qr>mid) update(R,mid+1,r,ql,qr); 56 maintain(o); 57 } 58 } 59 LL ans; 60 void query(int o,int l,int r,int ql,int qr){ 61 if (ql<=l && qr>=r) ans+=sm[o]; 62 else{ 63 if (ql<=mid) query(L,l,mid,ql,qr); 64 if (qr>mid) query(R,mid+1,r,ql,qr); 65 } 66 } 67 int main(){ 68 #ifndef ONLINE_JUDGE 69 freopen("3211.in","r",stdin); 70 freopen("3211.out","w",stdout); 71 #endif 72 n=getint(); 73 F(i,1,n) a[i]=getint(); 74 build(1,1,n); 75 m=getint(); 76 F(i,1,m){ 77 int cmd=getint(),l=getint(),r=getint(); 78 if (cmd==1){ 79 ans=0; 80 query(1,1,n,l,r); 81 printf("%lld\n",ans); 82 }else update(1,1,n,l,r); 83 } 84 return 0; 85 }
3211: 花神游历各国
Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1327 Solved: 511
[Submit][Status][Discuss]
Description
Input
Output
每次x=1时,每行一个整数,表示这次旅行的开心度
Sample Input
4
1 100 5 5
5
1 1 2
2 1 2
1 1 2
2 2 3
1 1 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
11
11
HINT
对于100%的数据, n ≤ 100000,m≤200000 ,data[i]非负且小于10^9