银川区域赛现场赛 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给水过了. 其实不算很水 我自认跑的很快罢了. 都是求经过一个位置的最短 ...
随机推荐
- MySQL索引工作原理
为什么需要索引(Why is it needed)?当数据保存在磁盘类存储介质上时,它是作为数据块存放.这些数据块是被当作一个整体来访问的,这样可以保证操作的原子性.硬盘数据块存储结构类似于链表,都包 ...
- 安装python的pip库setup.py出现报错的解决过程
错误起因: 第一次安python3.72的时候,直接去官网下了压缩包,解压后也没有exe文件.环境也是手动配置,在之后安装Pycharm的时候,系统找不到解释器,手动加上. 错误经过: 等写程序用到i ...
- PAT甲级题分类汇编——杂项
本文为PAT甲级分类汇编系列文章. 集合.散列.数学.算法,这几类的题目都比较少,放到一起讲. 题号 标题 分数 大意 类型 1063 Set Similarity 25 集合相似度 集合 1067 ...
- 根据IP获取国家,市区,经纬度等的免费库
https://dev.maxmind.com/geoip/geoip2/geolite2/ 此网站上有提供SDK版,访问在线服务,也有离线版,下载库到本地,使用相应语言解析库
- 『Python基础练习题』day04
# 1.写代码,有如下列表,按照要求实现每一个功能 # li = ['Conan', 'Kidd', 'blame', 'jimmy', 'RachelMoore'] # 计算列表的长度并输出 # 列 ...
- ArcGIS SOE开发异常之 ClassFactory cannot supply requested class
最近SOE开发一个功能,辛辛苦苦写完, 异常: ClassFactory cannot supply requested class 辛苦解决: 百度一下,描述这个问题的帖子很多,不过内容基本一致.大 ...
- 括号匹配问题 —— Deque双端队列解法
题目: 给定一个只包括 '(',')','{','}','[',']'?的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合.左括号必须以正确的顺序闭合.注意空字符串可 ...
- CentOS 6.9安装配置nmon
nmon是一款开源的性能监控工具,用于监控CentOS系统的资源消耗信息,并能把结果输出到文件中,然后通过nmon_analyser性能报告分析器生成数据分析报表. 一.安装nmon: 1. 配置ep ...
- 在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串)
原文:在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 删除静态页面的html
function dellist(obj) { $(obj).parent().parent().remove(); }