九度oj 1407 快速找出最小数
原题链接:http://ac.jobdu.com/problem.php?pid=1407
线段树,区间更新,查询区间最小值。
注意区间更新,查询的时候,区间$\begin{align*}[L,R] \end{align*}$$\begin{align*}L \end{align*}$都可能大于$\begin{align*}R\end{align*}$。。
有个地方写sb了害的我wa了好几次%>_<%。
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#define lc root<<1
#define rc root<<1|1
#define mid ((l+r)>>1)
using std::min;
const int Max_N = ;
const int INF = ~0u >> ;
struct Node {
int val, add;
};
struct SegTree {
Node seg[Max_N << ];
inline void push_up(int root) {
seg[root].val = min(seg[lc].val, seg[rc].val);
}
inline void built(int root, int l, int r) {
seg[root].add = ;
if (l == r) {
scanf("%d", &seg[root].val);
return;
}
built(lc, l, mid);
built(rc, mid + , r);
push_up(root);
}
inline void push_down(int root) {
if (seg[root].add != ) {
int &_add = seg[root].add;
seg[lc].add += _add;
seg[lc].val += _add;
seg[rc].add += _add;
seg[rc].val += _add;
_add = ;
}
}
inline void update(int root, int l, int r, int x, int y, int v) {
if (x > r || y < l) return;
if (x <= l && y >= r) {
seg[root].add += v;
seg[root].val += v;
return;
}
push_down(root);
update(lc, l, mid, x, y, v);
update(rc, mid + , r, x, y, v);
push_up(root);
}
inline int query(int root, int l, int r, int x, int y) {
if (x > r || y < l) return INF;
if (x <= l && y >= r) return seg[root].val;
push_down(root);
int v1 = query(lc, l, mid, x, y);
int v2 = query(rc, mid + , r, x, y);
return min(v1, v2);
}
}seg;
int main() {
#ifdef LOCAL
freopen("in.txt", "r", stdin);
freopen("out.txt", "w+", stdout);
#endif
char buf[];
int n, m, a, b, c;
while (~scanf("%d", &n)) {
seg.built(, , n);
scanf("%d\n", &m);
while (m--) {
gets(buf);
char *p = strchr(buf, ' ');
if (strchr(++p, ' ')) {
sscanf(buf, "%d %d %d", &a, &b, &c);
if (a <= b) {
seg.update(, , n, ++a, ++b, c);
} else {
seg.update(, , n, ++a, n, c);
seg.update(, , n, , ++b, c);
}
} else {
sscanf(buf, "%d %d", &a, &b);
if (a <= b) {
printf("%d\n", seg.query(, , n, ++a, ++b));
} else {
int v1 = seg.query(, , n, ++a, n);
int v2 = seg.query(, , n, , ++b);
printf("%d\n", min(v1, v2));
}
}
}
}
return ;
}
九度oj 1407 快速找出最小数的更多相关文章
- 九度OJ 1256:找出两个只出现了一次的数字 (位运算)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:568 解决:186 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 输入的 ...
- 九度OJ 1035:找出直系亲属 (二叉树、递归)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2380 解决:934 题目描述: 如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外) ...
- 九度OJ 1199:找位置 (计数)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2083 解决:1010 题目描述: 对给定的一个字符串,找出有重复的字符,并给出其位置,如:abcaaAB12ab12 输出:a,1:a,4 ...
- 九度OJ 1170:找最小数 (最值)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6451 解决:2843 题目描述: 第一行输入一个数n,1 <= n <= 1000,下面输入n行数据,每一行有两个数,分别是x ...
- 九度OJ 1053:互换最大最小数 (基础题)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6613 解决:2676 题目描述: 输入一个数n,然后输入n个数值各不相同,调换数组中最大和最小的两个数,然后输出. 输入: 测试数据有多组 ...
- 九度OJ 1052:找x (基础题)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7335 解决:3801 题目描述: 输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数 ...
- 【九度OJ】题目1170:找最小数 解题报告
[九度OJ]题目1170:找最小数 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1170 题目描述: 第一行输入一个数n,1 < ...
- 【九度OJ】题目1199:找位置 解题报告
[九度OJ]题目1199:找位置 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1199 题目描述: 对给定的一个字符串,找出有重复的 ...
- 【九度OJ】题目1052:找x 解题报告
[九度OJ]题目1052:找x 解题报告 标签(空格分隔): 九度OJ [LeetCode] http://ac.jobdu.com/problem.php?pid=1052 题目描述: 输入一个数n ...
随机推荐
- NOIP2003 加分二叉树
http://www.luogu.org/problem/show?pid=1040 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号. ...
- Can't locate Switch.pm in @INC
the perl version (5.14) shipped with 12.10 does not include the Switch.pm module needed while buildi ...
- oracle学习系列之三 (约束)
主键约束:外键约束:唯一性约束:检查约束:默认值约束 -——————五大约束 一. 主键约束: --创建表的主键约束 create table student (student_id number ...
- Windows10系统如何安装Microsoft Visual Studio 2015及最小子数组和求解
一.Windows10系统如何安装Microsoft Visual Studio 2015. 1.首先到Visual Studio官方网站(https://www.visualstudio.com/v ...
- 使用.NET MVC框架项目开发流程(项目开发流程)
MVC项目开发流程 整理需求,进行需求分析.项目设计. 整理数据项,建数据库做前期准备,并整理字典. 建立所需数据库表和视图和模型. 页面实现其初步功能(跳过逻辑后台代码),只是实现页面之间的跳转以及 ...
- 八、Linux下的网络服务器模型
服务器设计技术有很多,按使用的协议来分有TCP服务器和UDP服务器,按处理方式来分有循环服务器和并发服务器. 在网络程序里面,一般来说都是许多客户对应一个服务器,为了处理客户的请求,对服务端的程序就提 ...
- storm启动分析
一个topology的启动包括了三个步骤 1)创建TopologyBuilder,设置输入源,输出源 2)获取config 3)提交topology(这里不考虑LocalCluster本地模式) 以s ...
- swift皮筋弹动发射飞机
今天在那个ios教程网上看到了一个不错的ios游戏源码,这是一个款采用swift实现的皮筋弹动发射飞机游戏源码,游戏源码比较详细,大家可以研究学习一下吧. <ignore_js_op> & ...
- IntelliJ IDEA 快捷键和设置
IntelliJ IDEA 使用总结 http://my.oschina.net/xianggao/blog/97539 IntelliJ IDEA 问题解决:1.乱码,主要是快捷键的字样显示乱码 中 ...
- android中关闭软键盘
/**隐藏软键盘**/ View view = getWindow().peekDecorView(); if (view != null) { InputMethodManager inputman ...