银川区域赛现场赛 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给水过了. 其实不算很水 我自认跑的很快罢了. 都是求经过一个位置的最短 ...
随机推荐
- 接口中的方法都自动的被设置为public,接口中的域被自动设置为public static final
接口中的方法都自动的被设置为public,接口中的域被自动设置为public static final
- 游记-NOI2019
Day -18 被各路julao们轮番吊打-- Day -12 鸽子F发布了笔试题库,然而并没有 "MLE全场记零分" 的操作 Day -8 广二体育馆机器装配完毕,误闯开幕式表演 ...
- Angular Material 学习笔记 Chips
依据 material guidelines, chips 可以用来做 filter https://material.io/design/components/chips.html#filter-c ...
- 【转载】使用Jedis操作redis
Redis是一个开源的Key-Value数据缓存,和Memcached类似. Redis多种类型的value,包括string(字符串).list(链表).set(集合).zset(sorted se ...
- 将netcore网站部署到docker容器中
一.背景 最近一直在看docker的教程,基础知识看的差不多了.理论总要运用于实践,所以下面我们就来把最简单的一个netcore网站托管到docker容器中. 环境:1.docker for wind ...
- GRPC代替webapi Demo。
gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架. gRPC 的主要优点是: 现代高性能轻量级 RPC 框架. 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现. 可用 ...
- springboot整合redis缓存一些知识点
前言 最近在做智能家居平台,考虑到家居的控制需要快速的响应于是打算使用redis缓存.一方面减少数据库压力另一方面又能提高响应速度.项目中使用的技术栈基本上都是大家熟悉的springboot全家桶,在 ...
- Go 编译 && 工具
编译和工具链 Go 的工具链非常丰富,从获取源码.编译.文档.测试.性能分析,到源码格式化.源码提示.重构工具等应有尽有 在 Go 中可以使用测试框架编写单元测试,使用统一的命令行即可测试及输出测试报 ...
- vue的mescroll搜索运用以及各种填坑处理
父组件处理: <template> <div class="wrap"> <!-- 搜索框 --> <div class="se ...
- 【数字图像处理】gamma变换
论文:gamma校正的快速算法及其c语言实现 gamma变换实现过程 假设图像中有一个像素,值是 200 ,那么对这个像素进行校正必须执行如下步骤: 1. 归一化 :将像素值转换为 0 - 1 之 ...