HDU - 1698 Just a Hook(线段树)
2015-10-20 23:13
316 查看
题目大意:给你一个区间,N个操作,操作如下:
l r c,将区间[l,r]的所有数变成c,问最后区间的和
解题思路:线段树的区间修改,维护和
l r c,将区间[l,r]的所有数变成c,问最后区间的和
解题思路:线段树的区间修改,维护和
#include <cstdio> #include <cstring> const int N = 100010 << 2; int val , sum , setv ; int n; void build(int u, int l, int r) { setv[u] = -1; if (l == r) { setv[u] = -1; return ; } int mid = (l + r) >> 1; build(u << 1, l, mid); build((u << 1) + 1, mid + 1, r); } void PushDown(int u) { if (setv[u] == -1) return ; setv[u << 1] = setv[(u << 1) + 1] = setv[u]; setv[u] = -1; } void modify(int u, int l, int r, int L, int R, int c) { if (L <= l && r <= R) { setv[u] = c; return ; } PushDown(u); int mid = (l + r) >> 1; if (L <= mid) modify(u << 1, l, mid, L, R, c); if (R > mid) modify((u << 1) + 1, mid + 1, r, L, R, c); } void PushUp(int u, int l, int r) { if (setv[u] != -1) { sum[u] = (r - l + 1) * setv[u]; return ; } if (l == r) { sum[u] = 1; return ; } int mid = (l + r) >> 1; PushUp(u << 1, l, mid); PushUp((u << 1) + 1, mid + 1, r); sum[u] = sum[u << 1] + sum[(u << 1) + 1]; } int cas = 1; void solve() { int p; scanf("%d", &p); while (p--) { int x, y, z; scanf("%d%d%d", &x, &y, &z); modify(1, 1, n, x, y, z); } PushUp(1, 1, n); printf("Case %d: The total value of the hook is %d.\n", cas++, sum[1]); } int main() { int test; scanf("%d", &test); while (test--) { scanf("%d", &n); build(1, 1, n); solve(); } return 0; }
相关文章推荐
- Unity协程(Coroutine)原理深入剖析
- [Java] Hibernate在不联网时不能解析配置文件解决方案
- wampserver2.5安装时提示丢失MSVCR110.dll
- [C++] CONST 2
- LeetCode----Binary Tree Level Order Traversal
- 【数据结构与算法】——交换排序
- Android引入库文件出错 Jar mismatch! Fix your dependencies
- iOS 9 适配系列教程 --https
- HDU2084 数塔 poj1163The Triangle
- 计算QPS
- java_数据库事务
- POJ - 2528 Mayor's posters(线段树+离散化)
- C++ rand,srand用法
- Linux启动过程详解
- Larry Wall 专访——语言学、Perl 6 的设计和发布
- Android学习笔记-XML文件解析(三)
- SwitchButton 开关按钮 的多种实现方式 (附源码DEMO)
- 面了某android开发职位2015
- LeetCode-Excel Sheet Column Number
- JDBC(一)--BaseDao使用