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. matplotlib绘图(三)

    matplotlib中2D图形的绘制 直方图 直方图的参数只有一个x,不像条形图需要传入x,y 直方图作用:是统计x在某个区间上出现的次数 直方图是条形图的一种形式 hist()的参数: #bins ...

  2. Re:从零开始的Linux之路(目录配置)

    基于 Red Hat Enterprise Linux 7.5 或者 CentOS 7.4 FHS协议(Filesystem Hierarchy Standard)——文件系统层次化标准 该标准定义了 ...

  3. win10安装pytorch——前面有坑,快跳进去鸭

    嗯!花费了不少时间才把pytorch安装成功.主要原因就是: 清华和中科大的Anaconda国内镜像源关闭了 activate.bat 不是内部或外部命令(这个真实奇怪) 1. 安装过程 可以去Ana ...

  4. python爬虫集合

    逐渐也写了有二十余篇博文,内容一多就导致有些内容不能够方便快捷定位. 虽然博客有标签进行分类,实际查找时也并不如做一个同类文章的集合来得直观. 这里就对python爬虫相关博文做个集合: 爬虫基础知识 ...

  5. Linux异常处理体系结构

    arm11处理器裸机的异常与中断处理参考: [OK6410裸机程序]异常处理 [OK6410裸机程序]按键中断 另外参考一篇:Linux中断体系结构 在ARM V4及V4T以后的大部分处理器中,中断向 ...

  6. POJ:3041-Asteroids(匈牙利算法模板)

    传送门:http://poj.org/problem?id=3041 Asteroids Time Limit: 1000MS Memory Limit: 65536K Description Bes ...

  7. Linux学习-Shell的变量功能

    什么是变量? 简单的说,就是让某一个特定字串代表不固定的内容. 变量的可变性与方便性 举例来说,我们每个帐号的邮件信箱默认是以 MAIL 这个变量来进行存取的, 当 dmtsai 这个 使用者登陆时, ...

  8. HDU 5379 树形DP Mahjong tree

    任意一棵子树上节点的编号连续,每个节点的所有二字节点连续,求编号方案的总数. 稍微分析一下可知 每个节点的非叶子节点个数不能多于两个,否则这个子树无解,从而整棵树都无解. 每棵子树将所有节点按照编号从 ...

  9. jdk生成证书,网站请求变成https

    生成证书的步骤 1.进入jdk的bin目录 keytool -genkey -alias tomcat -keyalg RSA   命名证书的名字叫tomcat 2.将证书拷贝至tomcat的bin目 ...

  10. python学习-- 数据库迁移 python manage.py makemigrations 和 python manage.py migrate

    python manage.py makemigrations 和 python manage.py migrate