【BZOJ】【3211】花神游历各国

时间:2022-12-17 09:18:53

线段树/暴力


  线段树区间开方

  唉,我傻逼了一下,TLE了一发,因为没考虑到0的情况……

  好吧简单来说一下,线段树动态查询区间和大家都会做……比较麻烦的是这次的修改变成开方了,然而这并没有什么好虚的,注意到权值的范围是$10^9$,我们随手打个表可以发现,对$10^9$不断开根的结果是:1000000000,31622,177,13,3,1。也就是说,每个数,它开根的次数并没有多少(联想一下CF 250的那道区间取模的题!)所以我们维护一个区间最大值,每次暴力对每个数开根就可以了(如果区间最大值为0或1就可以跳过咯)

【BZOJ】【3211】花神游历各国【BZOJ】【3211】花神游历各国
 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 }
View Code

3211: 花神游历各国

Time Limit: 5 Sec  Memory Limit: 128 MB
Submit: 1327  Solved: 511
[ Submit][ Status][ Discuss]

Description

【BZOJ】【3211】花神游历各国 

Input

 

【BZOJ】【3211】花神游历各国

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

Sample Output

101
11
11

HINT

对于100%的数据, n ≤ 100000,m≤200000 ,data[i]非负且小于10^9


Source

[ Submit][ Status][ Discuss]