BZOJ-3211: 花神游历各国 (线段树)

Posted 可惜没如果=_=

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ-3211: 花神游历各国 (线段树)相关的知识,希望对你有一定的参考价值。

3211: 花神游历各国

Time Limit: 5 Sec  Memory Limit: 128 MB
Submit: 4017  Solved: 1465
[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

Sample Output

101

11

11

HINT

 

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


 

 

Source

妈了个鸡……一开始想了半天怎么打lazy怎么区间修改……然后猛然发现这明明是单点修改嘛……mdzz
线段树一种很神的操作,因为int范围内的数顶多开五次根号就成1了,以后再怎么开根号就都是1,所以开一个flag记录这段区间内是不是所有的数都为1了,如果都为1就不用再傻乎乎的更新一些不用更新的东西了qwq
laj浪费了一个早上了……mdzz这才是laj今天的T1
 1 #include "bits/stdc++.h"
 2 #define lson rt<<1,l,m
 3 #define rson rt<<1|1,m+1,r
 4 using namespace std;
 5 typedef long long LL;
 6 const int MAX=1e5+5;
 7 LL n,m;
 8 LL sum[MAX<<2],flag[MAX<<2];
 9 inline LL read(){
10     int an=0,x=1;char c=getchar();
11     while (c<0 || c>9) {if (c==-) x=-1;c=getchar();}
12     while (c>=0 && c<=9) {an=(an<<3)+(an<<1)+c-0;c=getchar();}
13     return an*x;
14 }
15 void PushUp(int rt){
16     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
17     flag[rt]=flag[rt<<1]&flag[rt<<1|1];
18 }
19 void build(int rt,int l,int r){
20     if (l==r){
21         sum[rt]=read();
22         if (sum[rt]<=1) flag[rt]=1;
23         else flag[rt]=0;
24         return;
25     }
26     int m=(l+r)>>1;
27     build(lson);
28     build(rson);
29     PushUp(rt);
30 }
31 void update(int rt,int l,int r,int x,int y){
32     if (flag[rt]) return;
33     if (l==r){
34         sum[rt]=(LL)sqrt(sum[rt]*1.0);
35         if (sum[rt]<=1) flag[rt]=1;
36         return;
37     }
38     int m=(l+r)>>1;
39     if (x<=m) update(lson,x,y);
40     if (y>m) update(rson,x,y);
41     PushUp(rt);
42 }
43 LL query(int rt,int l,int r,int x,int y){
44     if (x<=l && r<=y) return sum[rt];
45     LL tmp=0;
46     int m=(l+r)>>1;
47     if (x<=m) tmp+=query(lson,x,y);
48     if (y>m) tmp+=query(rson,x,y);
49     return tmp;
50 }
51 int main(){
52     freopen ("flower.in","r",stdin);freopen ("flower.out","w",stdout);
53     int i,j,x,y,z;
54     n=read();build(1,1,n);
55     m=read();
56     for (i=1;i<=m;i++){
57         z=read(),x=read(),y=read();
58         if (z==1) printf("%lld\n",query(1,1,n,x,y));
59         else update(1,1,n,x,y);
60     }
61     return 0;
62 }

 

以上是关于BZOJ-3211: 花神游历各国 (线段树)的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ-3211: 花神游历各国 (线段树)

bzoj3211 花神游历各国 线段树,势能分析

bzoj3211: 花神游历各国(线段树)

bzoj 3211 花神游历各国

BZOJ 3211: 花神游历各国

Bzoj3211: 花神游历各国