4927 线段树练习5

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
 
 
 
题目描述 Description

有n个数和5种操作

add a b c:把区间[a,b]内的所有数都增加c

set a b c:把区间[a,b]内的所有数都设为c

sum a b:查询区间[a,b]的区间和

max a b:查询区间[a,b]的最大值

min a b:查询区间[a,b]的最小值

输入描述 Input Description

第一行两个整数n,m,第二行n个整数表示这n个数的初始值

接下来m行操作,同题目描述

输出描述 Output Description

对于所有的sum、max、min询问,一行输出一个答案

样例输入 Sample Input

10 6

3 9 2 8 1 7 5 0 4 6

add 4 9 4

set 2 6 2

add 3 8 2

sum 2 10

max 1 7

min 3 6

样例输出 Sample Output

49

11

4

数据范围及提示 Data Size & Hint

10%:1<n,m<=10

30%:1<n,m<=10000

100%:1<n,m<=100000

保证中间结果在long long(C/C++)、int64(pascal)范围内

PS:由于数据6出错导致某些人只有90分,已于2016.5.13修正。

出题人在此对两位90分的用户表示诚挚的歉意

思路:

  裸线段树;

  轻松ac;

来,上代码:

#include <cstdio>
#include <iostream>
#include <algorithm> #define maxn 100001
#define LL long long using namespace std; struct TreeNodeType {
LL l,r,mid,dis,max_,min_,flag,flag_; bool if_;
};
struct TreeNodeType tree[maxn<<]; LL if_z,n,m; char Cget; inline void read_int(LL &now)
{
now=,if_z=,Cget=getchar();
while(Cget<''||Cget>'')
{
if(Cget=='-') if_z=-;
Cget=getchar();
}
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
now*=if_z;
} inline void tree_up(LL now)
{
tree[now].dis=tree[now<<].dis+tree[now<<|].dis;
tree[now].max_=max(tree[now<<].max_,tree[now<<|].max_);
tree[now].min_=min(tree[now<<].min_,tree[now<<|].min_);
} inline void tree_down(LL now)
{
if(tree[now].l==tree[now].r) return ;
if(tree[now].if_)
{
tree[now<<].flag=,tree[now<<].flag_=tree[now].flag_;
tree[now<<].if_=true,tree[now<<].max_=tree[now].flag_;
tree[now<<].min_=tree[now].flag_;
tree[now<<].dis=(tree[now<<].r-tree[now<<].l+)*tree[now].flag_;
tree[now<<|].flag=,tree[now<<|].flag_=tree[now].flag_;
tree[now<<|].if_=true,tree[now<<|].max_=tree[now].flag_;
tree[now<<|].min_=tree[now].flag_;
tree[now<<|].dis=(tree[now<<|].r-tree[now<<|].l+)*tree[now].flag_;
}
else
{
if(tree[now<<].if_)
{
tree[now<<].max_+=tree[now].flag;
tree[now<<].min_+=tree[now].flag;
tree[now<<].flag_+=tree[now].flag;
tree[now<<].dis+=(tree[now<<].r-tree[now<<].l+)*tree[now].flag;
}
else
{
tree[now<<].max_+=tree[now].flag;
tree[now<<].min_+=tree[now].flag;
tree[now<<].flag+=tree[now].flag;
tree[now<<].dis+=(tree[now<<].r-tree[now<<].l+)*tree[now].flag;
}
if(tree[now<<|].if_)
{
tree[now<<|].max_+=tree[now].flag;
tree[now<<|].min_+=tree[now].flag;
tree[now<<|].flag_+=tree[now].flag;
tree[now<<|].dis+=(tree[now<<|].r-tree[now<<|].l+)*tree[now].flag;
}
else
{
tree[now<<|].max_+=tree[now].flag;
tree[now<<|].min_+=tree[now].flag;
tree[now<<|].flag+=tree[now].flag;
tree[now<<|].dis+=(tree[now<<|].r-tree[now<<|].l+)*tree[now].flag;
}
}
tree[now].flag=,tree[now].flag_=,tree[now].if_=false;
} void tree_build(LL now,LL l,LL r)
{
tree[now].l=l,tree[now].r=r;
if(l==r)
{
read_int(tree[now].dis);
tree[now].max_=tree[now].dis;
tree[now].min_=tree[now].dis;
return ;
}
tree[now].mid=(l+r)>>;
tree_build(now<<,l,tree[now].mid);
tree_build(now<<|,tree[now].mid+,r);
tree_up(now);
} void tree_change(LL now,LL l,LL r,LL x)
{
if(tree[now].l==l&&tree[now].r==r)
{
if(tree[now].if_) tree[now].flag_+=x;
else tree[now].flag+=x;
tree[now].dis+=(r-l+)*x;
tree[now].max_+=x;
tree[now].min_+=x;
return ;
}
if(tree[now].flag||tree[now].if_) tree_down(now);
if(l>tree[now].mid) tree_change(now<<|,l,r,x);
else if(r<=tree[now].mid) tree_change(now<<,l,r,x);
else
{
tree_change(now<<,l,tree[now].mid,x);
tree_change(now<<|,tree[now].mid+,r,x);
}
tree_up(now);
} void tree_change_(LL now,LL l,LL r,LL x)
{
if(tree[now].l==l&&tree[now].r==r)
{
tree[now].if_=true;
tree[now].flag_=x;
tree[now].dis=(r-l+)*x;
tree[now].max_=x;
tree[now].min_=x;
return ;
}
if(tree[now].flag||tree[now].if_) tree_down(now);
if(l>tree[now].mid) tree_change_(now<<|,l,r,x);
else if(r<=tree[now].mid) tree_change_(now<<,l,r,x);
else
{
tree_change_(now<<,l,tree[now].mid,x);
tree_change_(now<<|,tree[now].mid+,r,x);
}
tree_up(now);
} LL tree_query(LL now,LL l,LL r,LL type)
{
if(tree[now].l==l&&tree[now].r==r)
{
if(type==) return tree[now].dis;
if(type==) return tree[now].max_;
if(type==) return tree[now].min_;
}
if(tree[now].flag||tree[now].if_) tree_down(now);
tree_up(now);
if(l>tree[now].mid) return tree_query(now<<|,l,r,type);
else if(r<=tree[now].mid) return tree_query(now<<,l,r,type);
else
{
if(type==) return tree_query(now<<,l,tree[now].mid,type)+tree_query(now<<|,tree[now].mid+,r,type);
if(type==) return max(tree_query(now<<,l,tree[now].mid,type),tree_query(now<<|,tree[now].mid+,r,type));
if(type==) return min(tree_query(now<<,l,tree[now].mid,type),tree_query(now<<|,tree[now].mid+,r,type));
}
} int main()
{
read_int(n),read_int(m);
tree_build(,,n);
char ch[];
for(LL i=;i<=m;i++)
{
cin>>ch;
LL x,y,z;
if(ch[]=='a')
{
read_int(x),read_int(y),read_int(z);
tree_change(,x,y,z);
}
else if(ch[]=='s')
{
if(ch[]=='e')
{
read_int(x),read_int(y),read_int(z);
tree_change_(,x,y,z);
}
else
{
read_int(x),read_int(y);
cout<<tree_query(,x,y,);
putchar('\n');
}
}
else if(ch[]=='m')
{
if(ch[]=='a')
{
read_int(x),read_int(y);
cout<<tree_query(,x,y,);
putchar('\n');
}
else
{
read_int(x),read_int(y);
cout<<tree_query(,x,y,);
putchar('\n');
}
}
}
return ;
}

AC日记——线段树练习5 codevs 4927的更多相关文章

  1. AC日记——线段树练习三 codevs 1082 (分块尝试)

    线段树练习 3 思路: 分块: 来,上代码: #include <cmath> #include <cstdio> #include <cstring> #incl ...

  2. AC日记——线段树练习4 codevs 4919

    4919 线段树练习4  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 给你N个数,有两种操作 ...

  3. hdu 4117 -- GRE Words (AC自动机+线段树)

    题目链接 problem Recently George is preparing for the Graduate Record Examinations (GRE for short). Obvi ...

  4. hdu 4117 GRE Words (ac自动机 线段树 dp)

    参考:http://blog.csdn.net/no__stop/article/details/12287843 此题利用了ac自动机fail树的性质,fail指针建立为树,表示父节点是孩子节点的后 ...

  5. HDU 5069 Harry And Biological Teacher(AC自动机+线段树)

    题意 给定 \(n\) 个字符串,\(m\) 个询问,每次询问 \(a\) 字符串的后缀和 \(b\) 字符串的前缀最多能匹配多长. \(1\leq n,m \leq 10^5\) 思路 多串匹配,考 ...

  6. BZOJ2434:[NOI2011]阿狸的打字机(AC自动机,线段树)

    Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的 ...

  7. T1081 线段树练习 2 codevs

    http://codevs.cn/problem/1081/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数, ...

  8. 背单词(AC自动机+线段树+dp+dfs序)

    G. 背单词 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较   题目描述 给定一张包含N个单词的表,每个单词有个价值W.要求从中选出一个子序列使 ...

  9. AC日记——[ZJOI2008]树的统计Count bzoj 1036

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 15007  Solved: 6092[Submit ...

随机推荐

  1. Docker DockerFile文件指令 & 构建

    1.dockerfile指令格式 # Comment注释 INSTRUCTION argument指令名 + 参数 2.普通指令 1. FROM 已存在的镜像,基础镜像,第一条非注释指令 FROM & ...

  2. 示例vue 的keep-alive缓存功能的实现

    本篇文章主要介绍了vue 的keep-alive缓存功能的实现,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. Vue 实现组件信息的缓存 当我们 ...

  3. GoF23种设计模式之行为型模式之解释器模式

    一.概述         给定一种语言和其文法的一种表示,再定义一个解释器,该解释器使用表示来解释语言中的句子. 二.适用性              当需要解释一种语言,并且可以将该语言中的句子表示 ...

  4. python能干什么?

    python能干什么? 网络爬虫 爬虫,指的是从互联网采集数据的程序脚本 . 爬天爬地爬空气 ,无聊的时候爬一爬吃鸡数据.b站评论,能得出很多有意思的结论.知乎有个很有意思的问题——"利用爬 ...

  5. leetcode-15-basic-string

    58. Length of Last Word 解题思路: 从结尾向前搜索,空格之前的就是最后一个词了.写的时候我考虑了尾部有空格的情况.需要注意的是,测试用例中有" "的情况,此 ...

  6. Kattis - doubleclique (图论)

    From : North American Invitational Programming Contest 2018 给你一个图,以及它的补图.如果部分点在原图中是团,并且其他的所有点在补图中也是团 ...

  7. P3391 【模板】文艺平衡树(Splay)新板子

    P3391 [模板]文艺平衡树(Splay) 题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转 ...

  8. BZOJ 5334: [Tjoi2018]数学计算

    线段树裸题 难度在于认识到这个没法线性做 #include<cstdio> using namespace std; int n,mod,tr[400005]; void insert(i ...

  9. UVa 11795 状压DP Mega Man's Mission

    kill[S]表示消灭机器人的集合为S,剩下的所能杀死的机器人集合. 设d(S)表示杀死机器人集合为S的方法数,答案为d((1<<n) - 1). d(S)可以由d(S')转移过来,其中S ...

  10. luogu3388 【模板】割点(割顶)

    模板题 #include <iostream> #include <cstdio> using namespace std; struct Edge{ int too, nxt ...