给定两个操作:

MULTIPLY L R x  区间里都乘以一个数x

MAX L R : 计算区间内一个2,3,5,7个数最大值。

思路:维护4个最大值。蓝瘦。

 /** 有 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]的最小值
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + ;
const long long INF = 1LL << ;
int Pri[]={ , , , };
struct Segment_tree
{
struct Node
{
int l, r;
long long sum, max, min, set_lazy, add_lazy;
} tre[maxn << ];
long long arr[maxn*];//需要输入的数组
inline void push_up(int rt)
{
if(tre[rt].l == tre[rt].r)
{
return ;
}
tre[rt].sum = tre[rt<<].sum + tre[rt<<|].sum;
tre[rt].max = max(tre[rt<<].max, tre[rt<<|].max);
tre[rt].min = min(tre[rt<<].min, tre[rt<<|].min);
}
inline void push_down(int rt)
{
if(tre[rt].set_lazy) {
///if set_lazy add_lazy = 0
tre[rt<<].set_lazy = tre[rt].set_lazy;
tre[rt<<].sum = (tre[rt<<].r - tre[rt<<].l + ) * tre[rt].set_lazy;
tre[rt<<].max = tre[rt].set_lazy;
tre[rt<<].min = tre[rt].set_lazy;
tre[rt<<|].set_lazy = tre[rt].set_lazy;
tre[rt<<|].sum = (tre[rt<<|].r - tre[rt<<|].l + ) * tre[rt].set_lazy;
tre[rt<<|].max = tre[rt].set_lazy;
tre[rt<<|].min = tre[rt].set_lazy;
tre[rt].add_lazy = ;
tre[rt<<].add_lazy = tre[rt<<|].add_lazy = ;
tre[rt].set_lazy = ;
return ;
}
if(tre[rt].add_lazy)
{
tre[rt<<].add_lazy += tre[rt].add_lazy;
tre[rt<<].sum += (tre[rt<<].r - tre[rt<<].l + ) * tre[rt].add_lazy;
tre[rt<<].max += tre[rt].add_lazy;
tre[rt<<].min += tre[rt].add_lazy;
tre[rt<<|].add_lazy += tre[rt].add_lazy;
tre[rt<<|].sum += (tre[rt<<|].r - tre[rt<<|].l + ) *
tre[rt].add_lazy;
tre[rt<<|].max += tre[rt].add_lazy;
tre[rt<<|].min += tre[rt].add_lazy;
tre[rt].add_lazy = ;
}
}
void build(int rt,int l,int r)
{
tre[rt].l = l;
tre[rt].r = r;
tre[rt].set_lazy = ;
tre[rt].add_lazy = ;
if(l == r)
{
tre[rt].sum = tre[rt].max = tre[rt].min = arr[l];
return ;
}
int mid = (l + r) >> ;
build(rt<<,l,mid);
build(rt<<|,mid+,r);
push_up(rt);
}
void update1(int rt,int l,int r,long long val)///add
{
push_down(rt);
if(l == tre[rt].l && tre[rt].r == r)
{
tre[rt].add_lazy = val;
tre[rt].sum += (tre[rt].r - tre[rt].l + ) * val;
tre[rt].max += val;
tre[rt].min += val;
return ;
}
int mid = (tre[rt].l + tre[rt].r) >> ;
if(r <= mid)
{
update1(rt<<,l,r,val);
}
else if(l > mid)
{
update1(rt<<|,l,r,val);
}
else
{
update1(rt<<,l,mid,val);
update1(rt<<|,mid+,r,val);
}
push_up(rt);
}
void update2(int rt,int l,int r,long long val)///set
{
push_down(rt);
if(l == tre[rt].l && tre[rt].r == r) {
tre[rt].set_lazy = val;
tre[rt].sum = (tre[rt].r - tre[rt].l + ) * val;
tre[rt].max = val;
tre[rt].min = val;
tre[rt].add_lazy = ;
return ;
}
int mid = (tre[rt].l + tre[rt].r) >> ;
if(r <= mid) {
update2(rt<<,l,r,val);
} else if(l > mid) {
update2(rt<<|,l,r,val);
} else {
update2(rt<<,l,mid,val);
update2(rt<<|,mid+,r,val);
}
push_up(rt);
}
long long query1(int rt,int l,int r)///sum
{
push_down(rt);
if(l == tre[rt].l && tre[rt].r == r) {
return tre[rt].sum;
}
int mid = (tre[rt].l + tre[rt].r) >> ;
if(r <= mid) {
return query1(rt<<,l,r);
} else if(l > mid) {
return query1(rt<<|,l,r);
} else {
return query1(rt<<,l,mid) + query1(rt<<|,mid+,r);
}
}
long long query2(int rt,int l,int r)///max
{
push_down(rt);
if(l == tre[rt].l && tre[rt].r == r) {
return tre[rt].max;
}
int mid = (tre[rt].l + tre[rt].r) >> ;
if(r <= mid) {
return query2(rt<<,l,r);
} else if(l > mid) {
return query2(rt<<|,l,r);
} else {
return max(query2(rt<<,l,mid), query2(rt<<|,mid+,r));
}
}
long long query3(int rt,int l,int r)///min
{
push_down(rt);
if(l == tre[rt].l && tre[rt].r == r) {
return tre[rt].min;
}
int mid = (tre[rt].l + tre[rt].r) >> ;
if(r <= mid) {
return query3(rt<<,l,r);
} else if(l > mid) {
return query3(rt<<|,l,r);
} else {
return min(query3(rt<<,l,mid), query3(rt<<|,mid+,r));
}
}
}st[];
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<;i++)
st[i].build(,,n);
while(m--){
char Q[];
scanf("%s",Q);
int L,R;
if(Q[]=='U'){
int x;
scanf("%d%d%d",&L,&R,&x);
for(int i=;i<;i++){
if(x%Pri[i]==){
while(x%Pri[i]==){
st[i].update1(,L,R,);
x/=Pri[i];
}
}
}
}else{
scanf("%d%d",&L,&R);
long long int ans=;
for(int i=;i<;i++){
ans=max(ans,st[i].query2(,L,R));
}
printf("ANSWER ");
printf("%lld\n",ans);
}
}
return ;
} /*
5 6
MULTIPLY 3 5 2
MULTIPLY 2 5 3 MAX 1 5
MULTIPLY 1 4 2
MULTIPLY 2 5 5
MAX 3 5 */

银川区域赛现场赛 Pot!!【线段树】的更多相关文章

  1. 2017西安区域赛A / UVALive - 8512 线段树维护线性基合并

    题意:给定\(a[1...n]\),\(Q\)次询问求\(A[L...R]\)的异或组合再或上\(K\)的最大值 本题是2017的西安区域赛A题,了解线性基之后你会发现这根本就是套路题.. 只要用线段 ...

  2. 2017 ICPC西安区域赛 A - XOR (线段树并线性基)

    链接:https://nanti.jisuanke.com/t/A1607 题面:   Consider an array AA with n elements . Each of its eleme ...

  3. HDU 4747 Mex (2013杭州网络赛1010题,线段树)

    Mex Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  4. 2017ICPC北京赛区网络赛 Minimum(数学+线段树)

    描述 You are given a list of integers a0, a1, …, a2^k-1. You need to support two types of queries: 1. ...

  5. HDU 4267 A Simple Problem with Integers(2012年长春网络赛A 多颗线段树+单点查询)

    以前似乎做过类似的不过当时完全不会.现在看到就有点思路了,开始还有洋洋得意得觉得自己有不小的进步了,结果思路错了...改了很久后测试数据过了还果断爆空间... 给你一串数字A,然后是两种操作: &qu ...

  6. 2018-8-10 模拟赛T3(可持久化线段树)

    出题人说:正解离线按DFS序排序线段维护区间和 但是对于树上每个点都有一个区间和一个值,两个点之间求1~m的区间和,这不就是用可持久化线段树吗. 只不过这个线段树需要区间修改,不过不需要标记下传,询问 ...

  7. HDU 6444 Neko's loop ( 2018 CCPC 网络赛 && 裴蜀定理 && 线段树 )

    题目链接 题意 : 给出一个 n 个元素的环.可以任意选择起点.选完起点后.可以行走 m 步.每次前进 k 个单位.所走到的点将产生正或负贡献.问你一开始得准备多少才能使得初始资金加上在环上获取最大利 ...

  8. 2019ICPC上海网络赛A 边分治+线段树

    题目: 给定一棵树, 带边权. 现在有2种操作: 1.修改第i条边的权值. 2.询问u到其他一个任意点的最大距离是多少. 解法:边分治+线段树 首先我们将所有的点修改和边修改都存在对应的边里面. 然后 ...

  9. 7.18 NOI模拟赛 因懒无名 线段树分治 线段树维护直径

    LINK:因懒无名 20分显然有\(n\cdot q\)的暴力. 还有20分 每次只询问一种颜色的直径不过带修改. 容易想到利用线段树维护直径就可以解决了. 当然也可以进行线段树分治 每种颜色存一下直 ...

  10. 5.29 省选模拟赛 波波老师 SAM 线段树 单调队列 并查集

    LINK:波波老师 LINK:同bzoj 1396 识别子串 不过前者要求线性做法 后者可以log过.实际上前者也被我一个log给水过了. 其实不算很水 我自认跑的很快罢了. 都是求经过一个位置的最短 ...

随机推荐

  1. PHP get和post向服务器发送请求

    1 .get请求 <?php //请求url地址 $token="xxx"; $url = "请求的地址"; //初始化curl $ch = curl_i ...

  2. 虚拟环境搭建Django项目

    下载虚拟环境包 pip install virtualenv 创建虚拟环境 virtualenv   env 进入env文件夹 cd env 进入Scripts文件夹 cd Scripts 启动虚拟环 ...

  3. linux查看系统未被挂载的磁盘空间的方法

    原文URL:https://www.cnblogs.com/lemon-flm/p/7597403.html 解决AWS 挂载.解决挂载完重启就消失等问题 linux上的盘和window的有区别,磁盘 ...

  4. Python windows环境 搭建问题

    环境安装包下载地址: https://pan.baidu.com/s/1bnVhHMZ?fid=642139599707514 百度地址: http://sw.bos.baidu.com/sw-sea ...

  5. ribbon的理解

    什么是ribbon? Ribbo是一个基于HTTP和TCP的客户端负载均衡器 什么是客户端负载均衡? 客户端负载均衡和服务端负载均衡最大的区别在于服务清单所存储的位置. 在客户端负载均衡中,所有的客户 ...

  6. mongodb 备份与还原操作

    环境信息: 版本: mongodb 3.2 备份: mongodump 恢复: mongorestore 本文参考官方文档:https://docs.mongodb.com/manual/refere ...

  7. JQuery里input属性赋值,取值prop()和attr()方法?

    一.赋值的时候 如果是<input type="checkbox" checked>这样的只有属性名就能生效的属性 推荐prop,即:$('input').prop(' ...

  8. 13 个 JS 数组精简技巧

    来自 https://juejin.im/post/5db62f1bf265da4d560906ab 侵删 数组是 JS 最常见的一种数据结构,咱们在开发中也经常用到,在这篇文章中,提供一些小技巧,帮 ...

  9. setTimeout()方法和setInterval()方法

    setTimeout方法: 定义和用法: setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式. tip: 1000 毫秒= 1 秒. tip:  如果你只想重复执行可以使用setI ...

  10. nginx: [emerg] directive "upstream" has no opening "{" in /application/nginx-1.6.3/conf/nginx.conf:13 ...

    修改nginx.conf配置文件时,报以下错误: [root@bqh-lb- nginx]# vim conf/nginx.conf [root@bqh-lb- nginx]# sbin/nginx ...