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 <cmath>
 4 using namespace std;
 5
 6 typedef long long LL;
 7 const int MAX=100011;
 8
 9 LL ans;
10 struct Tree
11 {
12     LL l,r;
13     LL sum;
14 };
15 Tree tree[MAX*4];
16
17 void pushup(LL x)
18 {
19     LL tmp=2*x;
20     tree[x].sum=tree[tmp].sum+tree[tmp+1].sum;
21 }
22
23 void build(int l,int r,int x)
24 {
25     tree[x].l=l;
26     tree[x].r=r;
27     if(l==r)
28     {
29         scanf("%lld",&tree[x].sum);
30         return ;
31     }
32     LL tmp=x<<1;
33     LL mid=(l+r)>>1;
34     build(l,mid,tmp);
35     build(mid+1,r,tmp+1);
36     pushup(x);
37 }
38
39
40 void update(LL l,LL r,LL x)
41 {
42     if(r<tree[x].l||l>tree[x].r) return ;
43     if(tree[x].l==tree[x].r)
44     {
45         tree[x].sum=sqrt(tree[x].sum);
46         return ;
47     }
48     if(l<=tree[x].l&&r>=tree[x].r&&tree[x].sum==tree[x].r-tree[x].l+1) return;
49     LL tmp=x<<1;
50     update(l,r,tmp);
51     update(l,r,tmp+1);
52     pushup(x);
53 }
54
55
56 void query(LL l,LL r,LL x)
57 {
58     if(r<tree[x].l||l>tree[x].r) return ;
59     if(l<=tree[x].l&&r>=tree[x].r)
60     {
61         ans+=tree[x].sum;
62         return ;
63     }
64     LL tmp=x<<1;
65     LL mid=(tree[x].l+tree[x].r)>>1;
66     if(r<=mid) query(l,r,tmp);
67     else if(l>mid) query(l,r,tmp+1);
68     else
69     {
70         query(l,mid,tmp);
71         query(mid+1,r,tmp+1);
72     }
73 }
74
75 int main(){
76     LL n,m,cas=1;
77     while(scanf("%lld",&n)!=EOF){
78         LL T,X,Y;
79         build(1,n,1);
80         scanf("%lld",&m);
81         printf("Case #%lld:\n",cas++);
82         for(int i=1;i<=m;i++){
83             scanf("%lld %lld %lld",&T,&X,&Y);
84             if(X>Y) swap(X,Y);
85             if(T==1){
86                 ans=0;
87                 query(X,Y,1);
88                 printf("%lld\n",ans);
89             }
90             else if(T==0){
91                 update(X,Y,1);
92             }
93         }
94         printf("\n");
95     }
96     return 0;
97 }
时间: 2024-10-21 01:04:01

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

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? 线段树区间开根号,区间求和

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?(线段树 区间不等更新)

题意  输入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?(线段树,区间更新,区间查询)

题目 线段树 简单题意: 区间(单点?)更新,区间求和 更新是区间内的数开根号并向下取整 这道题不用延迟操作 //注意: //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? 线段树裸题

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

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

HDU4027 Can you answer these queries 线段树区间求和+剪枝

给了你n,然后n个数字在一个数组中,接下来m个询问,每个询问三个数字 t,x,y,若t==0,那么修改区间[x,y]的每一个值,变为原来每个位置上的数 开根号取整,若t==1,那么对区间[x,y]求和 由于n,m,很大,所以树状数组铁定超时,若直接用线段树来做区间修改,那么也是超时,这类题目没别的方法了,静心剪枝,发现题目给的数据范围为2^63,有没有发现,2^63开根号 绝对不需要开10次,就能到1,到1以后就不需要再开了,意思就是若有某个区间[x,y]每一个点的值都为1时,这一段区间事实上是

HDU-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 endurance. For every attack of ou