问题描述:

给定一个数列,要求对指定区间内所有数开方,输出查询区间和

输入:

有很多个测试用例,每个用例第一行输出一个整数N,表示数列有N个数,1<=N<=100000;第二行输入N个整数E,E<2e63;第三行输入整数M,表示M种操作,1<=M<=100000;之后的M行,每行输入3个整数T X Y。T=0,表示修改,将区间[L,R]内所有数开方(开方结果向下取整);T=1表示查询,查询区间[L,R]的区间和。

输出:

对于每个查询操作输出结果,并打印编号,每个操作打印一行(注意这里有坑)。

这属于线段树的简单应用,我们直接看代码

#include<iostream>
using namespace std; #define ll long long
const int MAX = 1e5 + 5;
int n, m, ind=0; int ls(int i) { return i << 1; }
int rs(int i) { return i << 1 | 1; }
int ship[MAX]; //线段树
struct Tree {
int l;
int r;
ll sum;
}tree[MAX*4]; void pushup(int i) {
tree[i].sum = tree[ls(i)].sum+ tree[rs(i)].sum;
} //建立线段树
void build(int i, int l, int r) {
tree[i].l = l;
tree[i].r = r;
if (l == r) { //到达叶子节点
tree[i].sum = ship[l];
return;
}
int mid = (l + r) >> 1;
build(ls(i), l, mid);
build(rs(i), mid + 1, r);
//到达叶子节点后递归回根节点的路上,更新沿路节点
pushup(i);
} //节点更新函数
void update(int i, int l, int r, int x, int y) {
if (tree[i].sum == (r - l + 1)) return; //剪枝1,这种情况说明区间中的数字已经被开方七次以上,区间中所有数字都为1,没必要继续开方
if (l == r) {
tree[i].sum = sqrt(ship[l]);
return;
}
if (tree[i].l<x || tree[i].r>y) return; //剪枝2,要保证更新范围在区间内
int mid = (l + r) >> 1;
if (x <= mid) update(ls(i), l, mid, x, y);
if (y > mid) update(rs(i), mid + 1, r, x, y);
//更新完之后,到达叶子节点递归回根节点的路上还需要更新沿路节点
pushup(i);
} //查询函数,注意该函数返回类型,如果不放心建议将i,x,y都改为long long类型
//由于开方操作没办法做到一步完成多步所以并没有使用lazy_tag标记
ll query(int i, int x, int y) {
if (tree[i].l >= x && tree[i].r <= y) return tree[i].sum;
if (tree[i].l > y || tree[i].r < x) return 0;
ll ans=0;
/*
也可以写成:
int mid=(l+r)>>1;
if(x<=mid) ans+=query(ls(i),x,y);
if(y>mid) ans+=query(rs(i),x,y);
感觉格式更加工整,效果是一样的
*/
if (tree[ls(i)].r >= x) ans += query(ls(i), x, y);
if (tree[rs(i)].l <= y) ans += query(rs(i), x, y);
return ans;
} //线段树:build函数 uodate函数 pushdown函数 addtag函数 pushup函数
int main() {
while (~scanf(" % d", &n)) {
ll ans;
int t, x1, y1, x, y;
for (int i = 1; i <= n; i++) {
cin >> ship[i];
}
build(1, 1, n);
cin >> m;
cout << ++ind;
for (int i = 1; i <= m; i++) {
cin >> t >> x1 >> y1;
x = min(x1, y1);
y = max(x1, y1);
if (t == 0) {
update(1, 1, n, x, y);
}
if (t == 1) {
ans = query(1, x, y);
cout << ans << endl;;
}
}
//这是个坑,
cout << endl;
}
return 0;
}

线段树can you answer these queries-------hdu4027的更多相关文章

  1. (线段树 区间查询更新) Can you answer these queries? -- hdu--4027

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4027 分析:因为这个操作是把一个数变成平方根,所以显得略棘手,不过如果仔细演算的话会发现一个2^64数的 ...

  2. Can you answer these queries?---hdu4027

    题目链接 有n个数:当操作为1时求L到R的和: 当操作为0时更新L到R为原来的平方根: 不过如果仔细演算的话会发现一个2^64数的平方根开8次也就变成了 1,所以也更新不了多少次,所以可以每次更新到底 ...

  3. Can you answer these queries?-HDU4027 区间开方

    题意: 给你n个数,两个操作,0为区间开方,1为区间求和 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4027 思路: 如果当该区间的数都为1,我们没必要 ...

  4. HDU4027 Can you answer these queries? —— 线段树 区间修改

    题目链接:https://vjudge.net/problem/HDU-4027 A lot of battleships of evil are arranged in a line before ...

  5. HDU4027 Can you answer these queries? 线段树

    思路:http://www.cnblogs.com/gufeiyang/p/4182565.html 写写线段树 #include <stdio.h> #include <strin ...

  6. HDU4027 Can you answer these queries?(线段树 单点修改)

    A lot of battleships of evil are arranged in a line before the battle. Our commander decides to use ...

  7. Can you answer these queries?(HDU4027+势能线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4027 题目: 题意:n个数,每次区间更新将其数值变成它的根号倍(向下取整),区间查询数值和. 思路:易 ...

  8. kuangbin专题七 HDU4027 Can you answer these queries? (线段树)

    A lot of battleships of evil are arranged in a line before the battle. Our commander decides to use ...

  9. GSS4 2713. Can you answer these queries IV 线段树

    GSS7 Can you answer these queries IV 题目:给出一个数列,原数列和值不超过1e18,有两种操作: 0 x y:修改区间[x,y]所有数开方后向下调整至最近的整数 1 ...

  10. SPOJ 1557. Can you answer these queries II 线段树

    Can you answer these queries II Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://www.spoj.com/pr ...

随机推荐

  1. [oeasy]python0018_ ASCII_字符分布_数字_大小写字母_符号_黑暗森林

    ​ 打包和解包 回忆上次内容 decode 就是解码 解码和编码可以转化 encode 编码 decode 解码 互为逆过程 大小写字母之间序号全都相差(​​32​​)​​10进制​​ ​ 编辑 这是 ...

  2. lvs的nat和dr模式混合用

    机器部署信息 lvs : 10.0.0.200  vip 10.0.0.19 外网IP , 172.168.1.19 内网IP dr rs: 10.0.0.200 vip 10.0.0.18 rip ...

  3. 华为matebook 14s笔记本,Chrome浏览器开启硬件加速,屏幕闪屏,黑框,页面屏幕卡死,解决办法

    解决办法使用了 https://zhuanlan.zhihu.com/p/644296061 这个连接下的最后一个折中办法解决! 一.现象 Chrome开启"硬件加速模式"后,在观 ...

  4. springsecurity使用:登录与校验

    首先是引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  5. 14、SpringMVC之注解配置

    14.1.概述 在实际工作中,一般使用配置类和注解代替web.xml和SpringMVC配置文件的功能: 在 Servlet3.0 环境中,容器会在类路径中查找实现了 javax.servlet.Se ...

  6. 【Java】PDF模板生成PDF文档

    一.需求背景 客户要求一份文书,文书内容有一些表单项,例如: 1.基本的是和否 (单选框或复选框) 2.备注内容(纯文本信息) 3.单位,机构组织,人员,字典项(下拉选择) 4.用户数字签名(图片信息 ...

  7. 【SpringBoot】06 探索配置方式 Part2 占位符的使用

    配置占位符? 随机数配置生成 RandomValuePropertySource 在配置文件中使用随机数 uid = ${random.value} uid = ${random.int} uid = ...

  8. JavaWeb入门到实战学习笔记

    了解,讲得并不是很好,很展开. 概念 动态web Web服务器 web服务器这节也是蜻蜓点水,引出tomcat而已 ASP(C#语言,微软) JSP PHP Java bootstrapclasslo ...

  9. tcprewrite-man

    官网手册:https://tcpreplay.appneta.com/wiki/tcprewrite-man.html https://linux.die.net/man/1/tcpprep 中文:h ...

  10. Asp.Net Core之Identity源码学习

    什么是Identity ASP.NET Identity是构建核心 Web 应用程序(ASP.NET.登录和用户数据)的成员系统.ASP.NET核心标识允许您向应用程序添加登录功能,并可以轻松自定义有 ...