银川区域赛现场赛 Pot!!【线段树】

给定两个操作:
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!!【线段树】的更多相关文章
- 2017西安区域赛A / UVALive - 8512 线段树维护线性基合并
题意:给定\(a[1...n]\),\(Q\)次询问求\(A[L...R]\)的异或组合再或上\(K\)的最大值 本题是2017的西安区域赛A题,了解线性基之后你会发现这根本就是套路题.. 只要用线段 ...
- 2017 ICPC西安区域赛 A - XOR (线段树并线性基)
链接:https://nanti.jisuanke.com/t/A1607 题面: Consider an array AA with n elements . Each of its eleme ...
- HDU 4747 Mex (2013杭州网络赛1010题,线段树)
Mex Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
- 2017ICPC北京赛区网络赛 Minimum(数学+线段树)
描述 You are given a list of integers a0, a1, …, a2^k-1. You need to support two types of queries: 1. ...
- HDU 4267 A Simple Problem with Integers(2012年长春网络赛A 多颗线段树+单点查询)
以前似乎做过类似的不过当时完全不会.现在看到就有点思路了,开始还有洋洋得意得觉得自己有不小的进步了,结果思路错了...改了很久后测试数据过了还果断爆空间... 给你一串数字A,然后是两种操作: &qu ...
- 2018-8-10 模拟赛T3(可持久化线段树)
出题人说:正解离线按DFS序排序线段维护区间和 但是对于树上每个点都有一个区间和一个值,两个点之间求1~m的区间和,这不就是用可持久化线段树吗. 只不过这个线段树需要区间修改,不过不需要标记下传,询问 ...
- HDU 6444 Neko's loop ( 2018 CCPC 网络赛 && 裴蜀定理 && 线段树 )
题目链接 题意 : 给出一个 n 个元素的环.可以任意选择起点.选完起点后.可以行走 m 步.每次前进 k 个单位.所走到的点将产生正或负贡献.问你一开始得准备多少才能使得初始资金加上在环上获取最大利 ...
- 2019ICPC上海网络赛A 边分治+线段树
题目: 给定一棵树, 带边权. 现在有2种操作: 1.修改第i条边的权值. 2.询问u到其他一个任意点的最大距离是多少. 解法:边分治+线段树 首先我们将所有的点修改和边修改都存在对应的边里面. 然后 ...
- 7.18 NOI模拟赛 因懒无名 线段树分治 线段树维护直径
LINK:因懒无名 20分显然有\(n\cdot q\)的暴力. 还有20分 每次只询问一种颜色的直径不过带修改. 容易想到利用线段树维护直径就可以解决了. 当然也可以进行线段树分治 每种颜色存一下直 ...
- 5.29 省选模拟赛 波波老师 SAM 线段树 单调队列 并查集
LINK:波波老师 LINK:同bzoj 1396 识别子串 不过前者要求线性做法 后者可以log过.实际上前者也被我一个log给水过了. 其实不算很水 我自认跑的很快罢了. 都是求经过一个位置的最短 ...
随机推荐
- C++ 字符串处理类 ProcessString (包含常用字符串处理函数)
ProcessString.h //Linux & C++11 #pragma once //包含系统头文件 #include <string> #include <sstr ...
- Python30之文件2(文件系统)
一.在python中对于文件系统的访问一般使用的是os模块.python是跨平台的,因此在使用os模块时,不需要关心是在什么系统下使用的 import os >>> os.listd ...
- go select 的default
当 select 中的其他条件分支都没有准备好的时候,`default` 分支会被执行. 为了非阻塞的发送或者接收,可使用 default 分支: select { case i := <-c: ...
- Arraylist的遍历方式、java反射机制
先定义ArrayList再添加几条数据: ArrayList arr=new ArrayList(); //往arrList中增加几条数据 arr.add(1); arr.add(2) ...
- BZOJ4400 TJOI2012桥(最短路+线段树)
首先找出任意一条1-n的最短路径.显然删除的边只有在该最短路上才会对最短路长度产生影响. 不会证明地给出一个找不到反例的结论:删除一条边后,新图中一定有一条1-n的最短路径上存在一条边x->y, ...
- 在论坛中出现的比较难的sql问题:32(row_number函数+子查询 sql循环取差值)
原文:在论坛中出现的比较难的sql问题:32(row_number函数+子查询 sql循环取差值) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. sql循环取差值,该怎 ...
- windowsAPI创建句柄失败的返回值
创建句柄的api返回值 INVALID_HANDLE_VALUE CreateFile CreateNamedPipe CreateToolhelp32Snapshot FilterConnectCo ...
- 字符串replace的理解和练习和配合正则表达式的使用
下面代码展示了(demo地址 https://codepen.io/peach_/pen/jONJjRY): 1.字符串replace的理解和练习和配合正则表达式的使用, 2.正则表达式学习 3.通过 ...
- Psychedelic therapy
Psychedelic therapy Psychedelic therapy早期在美国应该取得了相当大的成功,方法是在给予受试者充分的心理准备后,一次性运用极高剂量的LSD(0.3−0.6毫克),试 ...
- vue 分组左右选择
<el-col :span="12"> <div style="text-align: left" class="transferd ...