题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4027

RT,该题要求每次更新是更新所有节点,分别求平方根,查询是求和。昨晚思前想后找有没有一个数学上的开平方的和等于和的开平方之类的规律。但是想了想发现这不就是小的时候,如果你这么想那老师就会骂死你的那个- -!

所以显然这个题是无法按套路成段更新了,懒惰标记也是没有用了,我们应该去按照区间更新每一个节点。结果TLE了一发,这说明这题不是这么搞,一定还有规律的。注意到题目给数据规模是2^63以及题目红字所述:开根号全都取下整,除了考虑用longlong以外,我们其实还可以想一下对一个longlong的数据开平方,最终都会变成1。那么在更新这个节点至1的那次update里,更新结束后一定会从叶子rt向上更新父亲,如果rt的兄弟节点也是1,那么说明rt的父亲已经不再需要更新了(因为1开平方还是1),这时候rt的父亲存的结果是1+1=2。也就是(rt+1-rt+1)。推广到更高的节点,换成区间来表示就是(r-l+1)。我们遇到这种节点就不需要更新了。

特别需要注意的是题目中x和y的大小…会出现x>y的情况……以及,每个case最后都要有一个额外的\n…………(PE到死WA到死)

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <iomanip>
 4 #include <cstring>
 5 #include <climits>
 6 #include <complex>
 7 #include <fstream>
 8 #include <cassert>
 9 #include <cstdio>
10 #include <bitset>
11 #include <vector>
12 #include <deque>
13 #include <queue>
14 #include <stack>
15 #include <ctime>
16 #include <set>
17 #include <map>
18 #include <cmath>
19
20 using namespace std;
21
22 #define fr first
23 #define sc second
24 #define pb(a) push_back(a)
25 #define Rint(a) scanf("%d", &a)
26 #define Rll(a) scanf("%I64d", &a)
27 #define Rs(a) scanf("%s", a)
28 #define FRead() freopen("in", "r", stdin)
29 #define FWrite() freopen("out", "w", stdout)
30 #define Rep(i, len) for(LL i = 0; i < (len); i++)
31 #define For(i, a, len) for(LL i = (a); i < (len); i++)
32 #define Cls(a) memset((a), 0, sizeof(a))
33 #define Full(a) memset((a), 0x7f7f, sizeof(a))
34
35 typedef long long LL;
36 #define lrt rt << 1
37 #define rrt rt << 1 | 1
38 const LL maxn = 100100;
39 LL sum[maxn<<2];
40 LL n, q;
41
42 void pushUP(LL rt) {
43     sum[rt] = sum[lrt] + sum[rrt];
44 }
45
46 void build(LL l, LL r, LL rt) {
47     if(l == r) {
48         Rll(sum[rt]);
49         return;
50     }
51     LL m = (l + r) >> 1;
52     build(l, m, lrt);
53     build(m+1, r, rrt);
54     pushUP(rt);
55 }
56
57 void update(LL L, LL R, LL l, LL r, LL rt) {
58     if(sum[rt] == r - l + 1) return;
59     if(l == r) {
60         sum[rt] = LL(double(sqrt(sum[rt])));
61         return;
62     }
63     LL m = (l + r) >> 1;
64     if(m >= L) update(L, R, l, m, lrt);
65     if(m < R) update(L,R, m+1, r, rrt);
66     pushUP(rt);
67 }
68
69 LL query(LL L, LL R, LL l, LL r, LL rt) {
70     if(l >= L && R >= r) return sum[rt];
71     LL m = (l + r) >> 1;
72     LL ret = 0;
73     if(m >= L) ret += query(L, R, l, m, lrt);
74     if(m < R) ret += query(L, R, m+1, r, rrt);
75     return ret;
76 }
77
78 int main() {
79     // FRead();
80     LL orz = 1;
81     LL a, b, c;
82     while(~Rll(n)) {
83         Cls(sum);
84         printf("Case #%I64d:\n", orz++);
85         build(1, n, 1);
86         Rll(q);
87         while(q--) {
88             Rll(a); Rll(b); Rll(c);
89             if(b > c) swap(b, c);
90             if(a == 0) update(b, c, 1, n, 1);
91             if(a == 1) cout << query(b, c, 1, n, 1) << endl;
92         }
93         printf("\n");
94     }
95     return 0;
96 }

转载于:https://www.cnblogs.com/kirai/p/5497216.html

[HDOJ4027]Can you answer these queries?(线段树,特殊成段更新,成段查询)相关推荐

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

    题目链接:点击查看 题目大意:给定n艘敌军的舰队,每艘舰队都有一定的耐力值,随后进行m次操作,共包括两种操作,分别是输出区间[l,r]中的耐力 值之和,以及将区间[l,r]中的每个的耐力值都开平方 题 ...

  2. HDU-4027 Can you answer these queries? --线段树

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4027 题意及思路: 有一排战舰,给出每个战舰的能力值,存在两种操作:第一种是把一定范围内所有战舰能力 ...

  3. 【HDU - 1754】I Hate It (线段树模板 单点覆盖更新+区间最大值查询)

    题干: 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.  这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当 ...

  4. 20.CF817F MEX Queries 线段树(Lazy标记练习)

    20.CF817F MEX Queries 离散化+区间覆盖+区间反转线段树 个人Limitの线段树题单题解主目录:Limitの线段树题单 题解目录_HeartFireY的博客-CSDN博客 要求维护 ...

  5. CodeForces - 817F MEX Queries(线段树lazy序)

    题目链接:点击查看 题目大意:初始时有一个空的集合,需要执行 n 次操作: 1 l r:将区间 [ l , r ] 内未出现的数加入到集合中 2 l r:将区间 [ l , r ] 内出现的数字全部删 ...

  6. hdu.3308 LCIS(线段树,区间合并+单点更新)

    按照傻崽大神的线段树修炼路线,自己做的第二道区间合并的题. 问题比较简单明了,区间求最长连续上升子序列,但是是需要单点更新的 n个数, m组操作 Q A B 询问[A,B]区间的最长连续上升子序列: ...

  7. POJ2886线段树 Joseph游戏(单点更新)

    题目:Who Gets the Most Candies? 题意: 1.n个人进行Joseph游戏,游戏共p轮(p为 思路:用相对坐标来处理,例如这一轮出局的是p,下一个要+m,则p出局时p+1就变成 ...

  8. 数据结构之线段树进阶(区间更新lazy标记)

    之前说了线段树的点更新和区间求和.其实点更新是区间更新的一种最基础的做法.我们把一个点想像成一个区间的话,不就是最简单的区间更新了嘛. 为什么要把区间更新和点更新分开来看呢?假如我们对区间[l,r]进 ...

  9. 数据结构之线段树入门(单点更新区间查询)

    线段树是学习数据结构必须学习的一种数据结构,在ACM,蓝桥等比赛中是经常出现的.利用线段树解题,会使得题目简单易理解.而且线段树是数据结构中比较基础而且用的很多的一种. 线段树定义 线段树是一种二叉搜 ...

  10. 【HDU - 1698】 Just a Hook(线段树模板 区间覆盖更新(laz标记) + 区间和查询 )

    题干: In the game of DotA, Pudge's meat hook is actually the most horrible thing for most of the heroe ...

最新文章

  1. 服务器架设笔记——编译Apache及其插件
  2. 十分钟了解算法面经:百度,寒武纪,作业帮,科大讯飞等常面问题
  3. dlib android
  4. C语言实现线索二叉树Threaded Binary Tree (附完整源码)
  5. 【SpringBoot零基础案例09】【IEDA 2021.1】SpringBoot将核心配置文件中的自定义配置映射到一个对象
  6. java垂直拆分,MyCat分片:垂直拆分实例解析和代码实现
  7. 分类算法——决策树(1)
  8. MySql优化 (2009-08-28 系统架构师大会) 演讲ppt
  9. QML的import目录爬坑记录
  10. 中的图片文字识别_文字识别 图片转文字【小程序】
  11. Flex 国际化使用
  12. 添加用户到sudoers
  13. DAS Tool 介绍
  14. 单板计算机中VPX,VME,cPCI,AdvanceMC,PMC
  15. Appium原理总结
  16. 人大金仓数据库登录、查看数据库
  17. LoRa开发|LoRa无线传输技术介绍
  18. 量子计算机优点概括,量子计算机简介
  19. 6.插入脚注后,正文空一行
  20. STC12C5A60S2 下载失败问题

热门文章

  1. 十九、MySQL常用命令总结
  2. LeetCode 1981. 最小化目标值与所选元素的差(DP)
  3. LeetCode 1910. 删除一个字符串中所有出现的给定子字符串
  4. LeetCode 926. 将字符串翻转到单调递增(动态规划)
  5. 02.改善深层神经网络:超参数调试、正则化以及优化 W3. 超参数调试、Batch Norm和程序框架
  6. LeetCode MySQL 1158. 市场分析 I
  7. 京东抢购助手_[Windows] 京东极速抢购助手V2.0,支持京东健康+扫货抢购
  8. python中字符串注意事项
  9. 合并数据 - 方法总结(concat、append、merge、join、combine_first)- Python代码
  10. embedding亦福亦祸?XGBoost与LightGBM的新机遇