codevs 4927 线段树练习5
赶在期末考试之前把这道傻逼题调了出来。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100500
using namespace std;
long long n,m,a[maxn];
long long root,tot=,ls[maxn<<],rs[maxn<<];
long long lazy[maxn<<],add[maxn<<],sum[maxn<<],mi[maxn<<],mx[maxn<<];
long long x,y,z;
bool vis[maxn<<];
void pushup(long long now)
{
sum[now]=sum[ls[now]]+sum[rs[now]];
mx[now]=max(mx[ls[now]],mx[rs[now]]);
mi[now]=min(mi[ls[now]],mi[rs[now]]);
}
void build(long long &now,long long left,long long right)
{
now=++tot;lazy[now]=;add[now]=;
if (left==right)
{
sum[now]=mx[now]=mi[now]=a[left];
return;
}
long long mid=(left+right)>>;
build(ls[now],left,mid);
build(rs[now],mid+,right);
pushup(now);
}
void pushdown(long long now,long long left,long long right)
{
long long mid=(left+right)>>;
if (vis[now]==true)
{
lazy[ls[now]]=lazy[rs[now]]=mx[ls[now]]=mx[rs[now]]=mi[ls[now]]=mi[rs[now]]=lazy[now];
sum[ls[now]]=(mid-left+)*lazy[now];
sum[rs[now]]=(right-mid)*lazy[now];
lazy[now]=;vis[now]=false;vis[ls[now]]=vis[rs[now]]=true;
add[ls[now]]=;add[rs[now]]=;
}
if (add[now]!=)
{
add[ls[now]]+=add[now];add[rs[now]]+=add[now];
sum[ls[now]]+=(mid-left+)*add[now];
sum[rs[now]]+=(right-mid)*add[now];
mx[ls[now]]+=add[now];mx[rs[now]]+=add[now];
mi[ls[now]]+=add[now];mi[rs[now]]+=add[now];
add[now]=;
}
}
void modify(long long now,long long left,long long right,long long l,long long r,long long p,long long type)
{
pushdown(now,left,right);
if ((left==l) && (right==r))
{
if (type==)
{
add[now]+=p;sum[now]+=(right-left+)*p;mx[now]+=p;mi[now]+=p;
return;
}
else
{
lazy[now]=p;add[now]=;sum[now]=p*(right-left+);
mx[now]=mi[now]=p;vis[now]=true;
return;
}
}
long long mid=(left+right)>>;
if (r<=mid) modify(ls[now],left,mid,l,r,p,type);
else if (l>=mid+) modify(rs[now],mid+,right,l,r,p,type);
else
{
modify(ls[now],left,mid,l,mid,p,type);
modify(rs[now],mid+,right,mid+,r,p,type);
}
pushup(now);
}
long long ask(long long now,long long left,long long right,long long l,long long r,long long type)
{
pushdown(now,left,right);
if ((left==l) && (right==r))
{
if (type==) return sum[now];
else if (type==) return mx[now];
else return mi[now];
}
long long mid=(left+right)>>;
if (r<=mid) return ask(ls[now],left,mid,l,r,type);
else if (l>=mid+) return ask(rs[now],mid+,right,l,r,type);
else
{
if (type==)
{
long long regis1=ask(ls[now],left,mid,l,mid,type);
long long regis2=ask(rs[now],mid+,right,mid+,r,type);
return regis1+regis2;
}
else if (type==) return max(ask(ls[now],left,mid,l,mid,type),ask(rs[now],mid+,right,mid+,r,type));
else return min(ask(ls[now],left,mid,l,mid,type),ask(rs[now],mid+,right,mid+,r,type));
}
}
int main()
{
memset(vis,false,sizeof(vis));
scanf("%lld%lld",&n,&m);
for (long long i=;i<=n;i++)
scanf("%lld",&a[i]);
build(root,,n);
for (long long i=;i<=m;i++)
{
char type[];
scanf("%s",type);
if (type[]=='a')
{
scanf("%lld%lld%lld",&x,&y,&z);
modify(root,,n,x,y,z,);
}
else if ((type[]=='s') && (type[]=='e'))
{
scanf("%lld%lld%lld",&x,&y,&z);
modify(root,,n,x,y,z,);
}
else if ((type[]=='s') && (type[]=='u'))
{
scanf("%lld%lld",&x,&y);
printf("%lld\n",ask(root,,n,x,y,));
}
else if ((type[]=='m') && (type[]=='a'))
{
scanf("%lld%lld",&x,&y);
printf("%lld\n",ask(root,,n,x,y,));
}
else
{
scanf("%lld%lld",&x,&y);
printf("%lld\n",ask(root,,n,x,y,));
}
}
return ;
}
codevs 4927 线段树练习5的更多相关文章
- Codevs 4927 线段树练习5(分块)
4927 线段树练习5 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有n个数和5种操作 add a b c:把区间[a,b]内的 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- codevs 1080 线段树练习 CDQ分治
codevs 1080 线段树练习 http://codevs.cn/problem/1080/ 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 一行N个 ...
- codevs 1080 线段树练习
链接:http://codevs.cn/problem/1080/ 先用树状数组水一发,再用线段树水一发 树状数组代码:84ms #include<cstdio> #include< ...
- 【树状数组区间修改区间求和】codevs 1082 线段树练习 3
http://codevs.cn/problem/1082/ [AC] #include<bits/stdc++.h> using namespace std; typedef long ...
- codevs 1082 线段树练习3
1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 Description 给你N个数,有两种操作: 1: ...
- codevs 1299 线段树 区间更新查询
1299 切水果 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Description 简单的说,一共N个水果排成 ...
随机推荐
- 使用Rails 4.2+ 测试异步邮件系统
[导读]异步测试总是一个很大的问题,邮件发送测试更是让很多开发同学不知道从哪里入手.在新版的Rails里,这类测试在很大程度上被简化了. 以下为译文 在编写需要发送邮件的应用时,控制器是绝不能被阻塞的 ...
- POJ 1151 Atlantis(经典的线段树扫描线,求矩阵面积并)
求矩阵的面积并 采用的是区间更新 #include <iostream> #include <stdio.h> #include <string.h> #inclu ...
- ubuntu下安装nodejs
前言 继前几天在wins环境下使用cygwin模拟器安装nodejs出现了一些问题后,今天我决定在ubuntu下安装nodejs,安装过程非常顺利,没有报错,看来还是linux环境给力啊,由于刚接触l ...
- JMeter性能测试介绍学习一
上一节中,我们了解了jmeter的一此主要元件,那么这些元件如何使用到性能测试中呢.这一节创建一个简单的测试计划来使用这些元件.该计划对应的测试需求. 1)测试目标网站是fnng.cnblogs.co ...
- C#中out的用法
out的用法 out 关键字会导致参数通过引用来传递.这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化.若要使用 out 参数,方法定义和调用方法都必须显式使用 out ...
- Project Euler 102:Triangle containment 包含原点的三角形
Triangle containment Three distinct points are plotted at random on a Cartesian plane, for which -10 ...
- Android核心分析 之九Zygote Service
Zygote Service 在本章我们会接触到这两个单词: Zygote [生物] 受精卵, 接合子, 接合体 Spawn:产卵 通过这两个单词,我们就可以大体知道Zygote是干什么的了,就是叫老 ...
- outlook圆角table
<table cellpadding="0" cellspacing="0" border="0" width="800&q ...
- 存储入门 – RAID技术(大图解释)
对于RAID,一直都知道个概念,但是对于细节没有去仔细的研究过.正好昨天Training的时候, 老师讲解了RAID的内容,所以顺便就整理一下.很多内容都是参考了ISMv2这本书. RAID中用到的技 ...
- VI操作--跳到最后一行和跳到最后一行的最后一个字符
vi操作 1.跳到文本的最后一行:按“G”,即“shift+g” 2.跳到最后一行的最后一个字符 : 先重复1的操作即按“G”,之后按“$”键,即“shift+4”. 3.跳到第一行的第一个字符:先按 ...