hihocoder1078 线段树的区间修改
思路:
线段树区间更新。注意这里是把一个区间的所有数全部赋值为一个新的值。
实现:
#include <bits/stdc++.h>
using namespace std;
const int N = ;
int tree[N << ], lazy[N << ], a[N], n, q; void build(int num, int l, int r)
{
if (l == r) { tree[num] = a[l]; return; }
int m = l + r >> ;
build(num << , l, m);
build(num << | , m + , r);
tree[num] = tree[num << ] + tree[num << | ];
} void pushdown(int num, int cl, int cr)
{
if (!lazy[num]) return;
tree[num << ] = lazy[num] * cl;
tree[num << | ] = lazy[num] * cr;
lazy[num << ] = lazy[num];
lazy[num << | ] = lazy[num];
lazy[num] = ;
} void update(int num, int l, int r, int x, int y, int p)
{
if (x <= l && y >= r) { tree[num] = (r - l + ) * p; lazy[num] = p; return; }
int m = l + r >> ;
pushdown(num, m - l + , r - m);
if (x <= m) update(num << , l, m, x, y, p);
if (y >= m + ) update(num << | , m + , r, x, y, p);
tree[num] = tree[num << ] + tree[num << | ];
} int query(int num, int l, int r, int x, int y)
{
if (x <= l && y >= r) return tree[num];
int m = l + r >> ;
pushdown(num, m - l + , r - m);
int ans = ;
if (x <= m) ans += query(num << , l, m, x, y);
if (y >= m + ) ans += query(num << | , m + , r, x, y);
return ans;
} int main()
{
ios::sync_with_stdio(false);
cin >> n;
for (int i = ; i <= n; i++) cin >> a[i];
build(, , n);
cin >> q;
int x, y, t, p;
for (int i = ; i <= q; i++)
{
cin >> t;
if (t == )
{
cin >> x >> y;
cout << query(, , n, x, y) << endl;
}
else
{
cin >> x >> y >> p;
update(, , n, x, y, p);
}
}
return ;
}
hihocoder1078 线段树的区间修改的更多相关文章
- HihoCoder1078线段树的区间修改(线段树+lazy)
每个测试点(输入文件)有且仅有一组测试数据. 每组测试数据的第1行为一个整数N,意义如前文所述. 每组测试数据的第2行为N个整数,分别描述每种商品的重量,其中第i个整数表示标号为i的商品的重量Pi. ...
- hiho一下20周 线段树的区间修改
线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了 ...
- poj 3468:A Simple Problem with Integers(线段树,区间修改求和)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 58269 ...
- hihoCode 1078 : 线段树的区间修改
#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...
- hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)
#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...
- hiho一下21周 线段树的区间修改 离散化
离散化 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho ...
- UVa 11992 Fast Matrix Operations (线段树,区间修改)
题意:给出一个row*col的全0矩阵,有三种操作 1 x1 y1 x2 y2 v:将x1 <= row <= x2, y1 <= col <= y2里面的点全部增加v: 2 ...
- 培训补坑(day7:线段树的区间修改与运用)(day6是测试,测试题解以后补坑QAQ)
补坑咯~ 今天围绕的是一个神奇的数据结构:线段树.(感觉叫做区间树也挺科学的.) 线段树,顾名思义就是用来查找一段区间内的最大值,最小值,区间和等等元素. 那么这个线段树有什么优势呢? 比如我们要多次 ...
- HDU 1698 【线段树,区间修改 + 维护区间和】
题目链接 HDU 1698 Problem Description: In the game of DotA, Pudge’s meat hook is actually the most horri ...
随机推荐
- redis02---对于key的操作命令
Redis对于key的操作命令 del key1 key2 ... Keyn 作用: 删除1个或多个键 返回值: 不存在的key忽略掉,返回真正删除的key的数量 rename key newkey ...
- WinDbg 查看静态变量
有如下Class.若想查看静态变量内容.因为静态变量和类绑定,仅需要查看类即可. namespace ConsoleApplication13 { class Program { public sta ...
- 「咕咕网校 - 基础省选」树上问题的进阶 by Drench
一定要在noip之前把自己花钱买的Luogu网课梳理完!QAQ 树上前缀和: 对于有根树,在每个点记录 val (点权) 和 sum(到根的点权之和) 当然记录的值因题而异(但是既然叫树上前缀和当然就 ...
- AtCoder Beginner Contest 057
A题 分析:24进制转换 #include<iostream> using namespace std; int main() { int a,b; while(cin>>a& ...
- JAVA Synchronized (二)
一,介绍 本文介绍JAVA多线程中的synchronized关键字作为对象锁的一些知识点. 所谓对象锁,就是就是synchronized 给某个对象 加锁.关于 对象锁 可参考:这篇文章 二,分析 s ...
- eclipse与maven配置
一.配置maven环境 电脑上需安装java环境,安装JDK1.7 + 版本 (将JAVA_HOME/bin 配置环境变量path ) 配置 MAVEN_HOME 将 %MAVEN_HOME%/bin ...
- Python学习之旅—生成器对象的send方法详解
前言 在上一篇博客中,笔者带大家一起探讨了生成器与迭代器的本质原理和使用,本次博客将重点聚焦于生成器对象的send方法. 一.send方法详解 我们知道生成器对象本质上是一个迭代器.但是它比迭代器对 ...
- Android EditText实现小数点后几位的终级方案
有时候,我们用EditText的时候,会要求输入小数点后几位,遇到过几次这样的需求,这次把它给记下来,方便以后使用 /** * 小数位数 */ public class PointLengthFilt ...
- bzoj 2648: SJY摆棋子【KD-tree】
其实理论上cdq更优 核心是依次取x值.y值的mid作为当前节点,向两边递归建立二叉树,树上维护size:子树大小:mx[0/1]:子树内最大x/y:mn[0/1]:子树内最小x/y:d[0/1]:这 ...
- CF580D Kefa and Dishes 【状压dp】By cellur925
题目传送门 友情链接:new2zydalao%%% 一篇优秀的状压文章 题目大意:$n$个菜有$k$个规则,如果kefa在吃完第$xi$个菜之后吃了第$yi$个菜(保证$xi$.$yi$不相等), ...