HDU 4027 Can you answer these queries?(线段树的单点更新+区间查询)

题目链接

题意 : 给你N个数,进行M次操作,0操作是将区间内的每一个数变成自己的平方根(整数),1操作是求区间和。

思路 :单点更新,区间查询,就是要注意在更新的时候要优化,要不然会超时,因为所有的数开几次方之后都会变成1,所以到了1不用没完没了的更新。

 1 //HDU 4027
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <iostream>
 6 #define LL __int64
 7 using namespace std ;
 8
 9 LL p[100010 * 4],lz[100010 * 4] ;
10 void pushup(int rt)
11 {
12     p[rt] = p[rt << 1] + p[rt << 1 | 1] ;
13 }
14 //void pushdown(int rt,int m)
15 //{
16 //    if(lz[rt])
17 //    {
18 //        lz[rt << 1] = lz[rt << 1 | 1] = lz[rt] ;
19 //        p[rt << 1] = (m - m/2) * lz[rt] ;
20 //        p[rt << 1|1] = m/2 * lz[rt] ;
21 //        lz[rt] = 0 ;
22 //    }
23 //}
24 void build(int l,int r,int rt)
25 {
26     lz[rt] = 0 ;
27     LL a ;
28     if(l == r)
29     {
30         scanf("%I64d",&a) ;
31         p[rt] = a ;
32         return ;
33     }
34     int mid = (l+r) >> 1 ;
35     build(l,mid,rt << 1) ;
36     build(mid+1,r,rt << 1 | 1) ;
37     pushup(rt) ;
38 }
39 void update(int L,int R ,int l,int r,int rt)
40 {
41     if(p[rt] == r-l+1)
42         return ;
43     if(l == r)
44     {
45         p[rt] = sqrt(p[rt]*1.0) ;
46         return ;
47     }
48     //pushdown(rt,r-l+1) ;
49     int mid = (l+r) >> 1 ;
50     if(mid >= L)
51         update(L,R,l,mid,rt << 1) ;
52     if(R > mid)
53         update(L,R,mid+1,r,rt << 1 | 1) ;
54     pushup(rt) ;
55 }
56 LL query(int L,int R,int l,int r,int rt)
57 {
58     LL sum = 0 ;
59     if(l >= L && R >= r)
60         return p[rt] ;
61     //pushdown(rt,r-l+1) ;
62     int mid = (l+r) >> 1 ;
63     if(mid >= L)
64         sum += query(L,R,l,mid,rt << 1) ;
65     if(mid < R)
66         sum += query(L,R,mid+1,r,rt << 1 | 1) ;
67     return sum ;
68 }
69 int main()
70 {
71     int N,M,x,y,z ,casee = 1;
72     while(cin >> N)
73     {
74         build(1,N,1) ;
75         scanf("%d",&M) ;
76         printf("Case #%d:\n",casee++) ;
77         while(M--)
78         {
79             scanf("%d %d %d",&x,&y,&z) ;
80             if(y > z)
81                 swap(y,z) ;
82             if(x == 0)
83             {
84                 update(y,z,1,N,1) ;
85             }
86             else
87             {
88                 printf("%I64d\n",query(y,z,1,N,1) ) ;
89             }
90         }
91         puts("") ;
92     }
93     return 0 ;
94 }

HDU 4027 Can you answer these queries?(线段树的单点更新+区间查询)

时间: 2024-08-01 08:15:27

HDU 4027 Can you answer these queries?(线段树的单点更新+区间查询)的相关文章

HDU 4027 Can you answer these queries?(线段树,区间更新,区间查询)

题目 线段树 简单题意: 区间(单点?)更新,区间求和 更新是区间内的数开根号并向下取整 这道题不用延迟操作 //注意: //1:查询时的区间端点可能前面的比后面的大: //2:优化:因为每次更新都是开平方,同一个数更新有限次数就一直是1了,所以可以这样优化 #include <stdio.h> #include<math.h> #define N 100010 #define LL __int64 #define lson l,m,rt<<1 #define rson

HDU 4027 Can you answer these queries?(线段树 区间不等更新)

题意  输入n个数  然后有两种操作   输入0时将给定区间所有数都变为自己的开方   输入1输出给定区间所有数的和 虽然是区间更新  但每个点更新的不一样  因此只能对单点进行更新  其实一个点最多被更新7次  2^64开平方7次后就变为1了  如果某个区间的数都变为了1  那么对这个区间的开方就不用考虑了   另外要注意给你的区间可能是反的 #include <bits/stdc++.h> #define lc p<<1,s,mid #define rc p<<1|

HDU 4027 Can you answer these queries? (线段树+区间点修改)

题意:给你 n 个数,m个询问(c,x,y) c==0 把x,y区间的值变为原来的平方根(向下取整) c==1 计算x,y区间的和. 利用1的开方永远为1剪枝.. #include<cstdio> #include<stdlib.h> #include<string.h> #include<string> //#include<map> #include<cmath> #include<iostream> #include

HDU 4027 Can you answer these queries? 线段树裸题

题意: 给定2个操作 0.把区间的每个数sqrt 2.求和 因为每个数的sqrt次数很少,所以直接更新到底,用个标记表示是否更新完全(即区间内的数字只有0,1就不用再更新了) #include<stdio.h> #include<iostream> #include<algorithm> #include<vector> #include<cmath> #include<queue> #include<set> #incl

Can you answer these queries?(线段树之单点更新)

萌萌哒的传送门 因为一个long long 范围内的数开方不会超过10次,所以题目就转化为线段树的单点更新问题. #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <set> #include <queue> #include <vector> #include <cstdlib> #includ

hdu 4027 Can you answer these queries? 线段树区间开根号,区间求和

Can you answer these queries? Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5195 Description A lot of battleships of evil are arranged in a line before the battle. Our commander decides to use our secret weapo

HDU 4027 Can you answer these queries?(线段树)

Can you answer these queries? Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)Total Submission(s): 9216    Accepted Submission(s): 2106 Problem Description A lot of battleships of evil are arranged in a line before

HDU 4027 Can you answer these queries? 线段树,区间修改

Can you answer these queries? Problem Description A lot of battleships of evil are arranged in a line before the battle. Our commander decides to use our secret weapon to eliminate the battleships. Each of the battleships can be marked a value of end

HDU - 4027 Can you answer these queries? (线段树区间更新+思维)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4027 题意:给定两种操作,查询(求出区间内的和),更新(区间内每个值都开根号,取整数) 题目给出所有数字之和小于263,所以最大的数最多7次也就变成1.所以在更新的时候加个判断条件,提前结束. 然后这道题目还有个坑,L有可能比R大,需要交换一下,(╬▔皿▔) . 1 #include <cstdio> 2 #include <algorithm> 3 #include <cmat