12:Challenge 5(线段树区间直接修改)
- 总时间限制:
- 10000ms
- 单个测试点时间限制:
- 1000ms
- 内存限制:
- 262144kB
- 描述
-
给一个长为N的数列,有M次操作,每次操作是以下两种之一:
(1)将某连续一段同时改成一个数
(2)求数列中某连续一段的和
- 输入
- 第一行两个正整数N和M。
第二行N的整数表示这个数列。
接下来M行,每行开头是一个字符,若该字符为'M',则表示一个修改操作,接下来三个整数x、y和z,表示在[x,y]这段区间的数改为z;若该字符为'Q',则表示一个询问操作,接下来两个整数x和y,表示求[x,y]这段区间的和。 - 输出
- 对每一个询问操作单独输出一行,表示答案。
- 样例输入
-
5 3
1 2 3 4 5
Q 1 5
M 2 3 2
Q 3 5 - 样例输出
-
15
11 - 提示
- 1<=N<=10^5,1<=M<=10^5,输入保证合法,且所有整数及答案可用带符号32位整型存储。
- 对于线段树的直接修改,
- 我们首先考虑要维护一个修改标记,
- 注意这个标记是可以每次被覆盖的!
- 然后值直接区间修改就好
-
#include<iostream>
#include<cstdio>
#include<cstring>
#define ls k<<1
#define rs k<<1|1
using namespace std;
const int MAXN=;
const int maxn=0x7ffff;
void read(int &n)
{
char c='+';int x=;bool flag=;
while(c<''||c>''){c=getchar();if(c=='-')flag=;}
while(c>=''&&c<='')
x=(x<<)+(x<<)+c-,c=getchar();
flag==?n=-x:n=x;
}
int n,m;
int ans=;
struct node
{
int l,r,w,f;
node()
{
l=r=w=;
f=-maxn;
}
}tree[MAXN<<];
void update(int k)
{
tree[k].w=tree[ls].w+tree[rs].w;
}
void build(int ll,int rr,int k)
{
tree[k].l=ll;tree[k].r=rr;
if(ll==rr)
{
read(tree[k].w);
return ;
}
int mid=(ll+rr)>>;
build(ll,mid,ls);
build(mid+,rr,rs);
update(k);
}
void push(int k)
{
tree[ls].w=(tree[ls].r-tree[ls].l+)*tree[k].f;
tree[rs].w=(tree[rs].r-tree[rs].l+)*tree[k].f;
tree[ls].f=tree[k].f;
tree[rs].f=tree[k].f;
tree[k].f=-maxn; }
void change(int k,int wl,int wr,int v)
{
if(wr<tree[k].l||wl>tree[k].r)
return ;
if(wl<=tree[k].l&&tree[k].r<=wr)
{
tree[k].w=(tree[k].r-tree[k].l+)*v;
tree[k].f=v;
return ;
}
int mid=(tree[k].l+tree[k].r)>>;
if(tree[k].f!=-maxn)
push(k);
change(ls,wl,wr,v);
change(rs,wl,wr,v);
update(k);
}
void ask(int k,int wl,int wr)
{
if(wr<tree[k].l||wl>tree[k].r)
return ;
if(wl<=tree[k].l&&tree[k].r<=wr)
{
ans+=tree[k].w;
return ;
}
int mid=(tree[k].l+tree[k].r)>>;
if(tree[k].f!=-maxn)
push(k);
ask(ls,wl,wr);
ask(rs,wl,wr);
update(k);
}
int main()
{
read(n);read(m);
build(,n,);
for(int i=;i<=m;i++)
{
char c;int x,y;
cin>>c;
read(x);read(y);
if(c=='M')
{
int v;
read(v);
change(,x,y,v);
}
else
{
ans=;
ask(,x,y);
printf("%d\n",ans);
}
}
return ;
}
: Challenge 5最近的提交
12:Challenge 5(线段树区间直接修改)的更多相关文章
- hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)
#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...
- Codeforces Round #442 (Div. 2) E Danil and a Part-time Job (dfs序加上一个线段树区间修改查询)
题意: 给出一个具有N个点的树,现在给出两种操作: 1.get x,表示询问以x作为根的子树中,1的个数. 2.pow x,表示将以x作为根的子树全部翻转(0变1,1变0). 思路:dfs序加上一个线 ...
- 题解报告:hdu 1698 Just a Hook(线段树区间修改+lazy懒标记的运用)
Problem Description In the game of DotA, Pudge’s meat hook is actually the most horrible thing for m ...
- poj 2528 线段树区间修改+离散化
Mayor's posters POJ 2528 传送门 线段树区间修改加离散化 #include <cstdio> #include <iostream> #include ...
- E - Just a Hook HDU - 1698 线段树区间修改区间和模版题
题意 给出一段初始化全为1的区间 后面可以一段一段更改成 1 或 2 或3 问最后整段区间的和是多少 思路:标准线段树区间和模版题 #include<cstdio> #include& ...
- HDU 4027 Can you answer these queries? (线段树区间修改查询)
描述 A lot of battleships of evil are arranged in a line before the battle. Our commander decides to u ...
- poj2528 Mayor's posters(线段树区间修改+特殊离散化)
Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral electio ...
- CF444C. DZY Loves Colors[线段树 区间]
C. DZY Loves Colors time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- HDU 4509 湫湫系列故事——减肥记II(线段树-区间覆盖 或者 暴力技巧)
http://acm.hdu.edu.cn/showproblem.php?pid=4509 题目大意: 中文意义,应该能懂. 解题思路: 因为题目给的时间是一天24小时,而且还有分钟.为了解题方便, ...
随机推荐
- NSURLSession简介
NSURLSession是iOS7中新的网络接口,它与咱们熟悉的NSURLConnection是并列的.在程序在前台时,NSURLSession与NSURLConnection可以互为替代工作.注意, ...
- vc6中关于“新建”
1.windows api 编程:新建→工程→Win32 Application→一个空工程→新建→文件→C++ Source File2.windows mfc 编程:新建→工程→MFC AppWi ...
- win10下CorelDRAW菜单栏字体变成白色了怎么办?
相信很多同学安装了win10系统之后,你的 CDR 菜单栏就变了,变得没有任何内容,以白色显示,win10系统与CorelDRAW早期的版本兼容方面存在问题,(CorelDRAW x7/X8无此问题出 ...
- APICloud 上滑加载更多
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- Vue-给对象新增属性(使用Vue.$set())
在开发过程中,我们时常会遇到这样一种情况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的. 根据官方文档定义 ...
- poj 3311 Hie with the Pie (状压dp) (Tsp问题)
这道题就是Tsp问题,稍微加了些改变 注意以下问题 (1)每个点可以经过多次,这里就可以用弗洛伊德初始化最短距离 (2)在循环中集合可以用S表示更清晰一些 (3)第一维为状态,第二维为在哪个点,不要写 ...
- 安装NexT主题
Hexo 安装主题的方式非常简单,只需要将主题文件拷贝至站点目录的 themes 目录下, 然后修改下配置文件即可. 下载主题包 在终端窗口下,定位到 Hexo 站点目录下.使用 Git checko ...
- sql删除注意的问题
老大骂你都是有原因的,基础要打好!!!! SQL关于删除的三个语句:DROP.TRUNCATE. DELETE 的区别. DROP test; 删除表test,并释放空间,将test表删除的一干二净 ...
- 工具-VS使用GIT工具
由于VS中集成了GIT插件,本机安装了GIT工具和TortoiseGit工具,造成在VS中GIT无法同步,于是将TortoiseGit卸载,再次启用VS中的GIT插件,重新初始化GIT文件夹,问题解决 ...
- 洛谷 P1556 幸福的路
P1556 幸福的路 题目描述 每天,John都要为了农场里N(1≤N≤10)头牛的健康和幸福四处奔波. 每头牛的位置可以描述为一个二维坐标,John从坐标原点(0,0)出发.为了使路径更有趣,Joh ...