线段树系列-hdu-1698-Just a Hook-区间修改求总和
2015-12-19 20:33
399 查看
简单的区间修改求总和
#include<bits/stdc++.h> using namespace std; struct seg{ int l, r, v; // v的值如果是-1则说明这条线段不是单色 }tree[410000]; void build(int l, int r, int k) { tree[k].l = l; tree[k].r = r; tree[k].v = 1; if(l == r) return; int mid = (l + r) >> 1; build(l, mid, 2*k); build(mid+1 , r, 2*k+1); } void update(int l, int r, int v, int k) { if(tree[k].v == v) return; // 如果颜色相同就直接返回 if(tree[k].l == l && tree[k].r == r) { // 如果就是目标区域就直接修改线段的值 tree[k].v = v; return; } if(tree[k].v != -1) { //如果是纯色,因为修改后不是纯色,所以要继续修改子区间, tree[2*k].v = tree[k].v; //所以子区间的值先赋值为原区间的值,原区间设置为杂色 tree[2*k+1].v = tree[k].v; //为后面的修改做准备 tree[k].v = -1; } int mid = (tree[k].l + tree[k].r) >> 1; if(r <= mid) update(l, r, v, 2*k); else if(l > mid) update(l, r, v, 2*k+1); else { update(l, mid, v, 2*k); update(mid+1, r, v, 2*k+1); } } int query(int k) { if(tree[k].v != -1) { return tree[k].v * (tree[k].r - tree[k].l + 1); } else { return query(k*2) + query(k*2+1); } } int main() { int t; int n, q; int x, y, v; int kase = 0; scanf("%d", &t); while(t--) { scanf("%d", &n); build(1, n, 1); scanf("%d", &q); for(int i = 1; i <= q; i++) { scanf("%d%d%d", &x, &y, &v); update(x, y, v, 1); } printf("Case %d: The total value of the hook is %d.\n", ++kase, query(1)); } return 0; }
相关文章推荐
- 转stack around the variable “XX” was corrupted
- tomcat7w.exe ,提示 指定的服务未安装 unable to open the service 'tomcat6'
- arm-linux-ld: ERROR: Source object init.o has EABI version 0, but target lcd_elf has EABI version 5
- mongodb2.6安装
- position与display
- 机器学习基石笔记 Lecture 2: Learning to Answer Yes/No
- 第十六周项目一----归并排序
- hdu1257最少拦截系统
- 延迟加载页面的例子
- Centos7 JDK8安装配置
- 第十六周--数据结构--项目一-- 插入排序之直接插入排序
- 经验之谈—如何快速熟悉公司的旧项目
- eclipse下mysql编程
- thinkphp 用jquery ajax前后台交互
- 使用cmake和visual studio编译freeglut和glew源代码并配置的流程
- 第十六周项目一----堆排序
- Shape的相关属性详解
- mysql-proxy实现mysql主从库读写分离
- pms项目系统安全性设计
- ios workspace使用依赖工程 —笔记