银川区域赛现场赛 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给水过了. 其实不算很水 我自认跑的很快罢了. 都是求经过一个位置的最短 ...
随机推荐
- 如何将本地的项目添加到github上
参考链接:http://note.youdao.com/noteshare?id=d0b7990a83b024b0172b6d5c5617a8d0&sub=659F216B9046420991 ...
- WUSTOJ 1338: The minimum square sum(Java)
题目链接:1338: The minimum square sum Description Given a prime p(p<108), you are to find min{x2+y2}, ...
- Mybatis整合(Redis、Ehcache)实现二级缓存
目的: Mybatis整合Ehcache实现二级缓存 Mybatis整合Redis实现二级缓存 Mybatis整合ehcache实现二级缓存 ssm中整合ehcache 在POM中导入相关依赖 < ...
- Liar CodeForces - 822E (dp,后缀数组)
大意: 给定串$s,t$, 给定整数$x$, 求判断$t$是否能划分为至多$x$段, 使这些段在$s$中按顺序,不交叉的出现. 设$dp_{i,j}$表示$s$匹配到$i$位, 划分了$j$段, 匹配 ...
- Sonya and Matrix Beauty CodeForces - 1080E (manacher)
大意: 给定$nm$字符串矩阵. 若一个子矩形每一行重排后可以满足每行每列都是回文, 那么它为好矩形. 求所有好矩形个数. 一个矩形合法等价于每一行出现次数为奇数的最多只有一个字符, 并且对称的两行对 ...
- Feign 客户端调用错误
1.@RequestBody 必须要写在实现接口中 2.Feign 客户端调用的时候如果有参数的话,默认是发送post请求 3.服务接口中的请求参数必须要加上@RequestParam("r ...
- Consul 注册中心介绍
在 Spring Cloud 体系中,几乎每个角色都会有两个以上的产品提供选择,比如在注册中心有:Eureka.Consul.zookeeper.etcd 等:网关的产品有 Zuul.Spring C ...
- 怎样解决Script error报错问题
如果脚本网址与网页网址不在同一个域(比如使用了 CDN), 那如果这个脚本执行报错了, 就会报:Script error. 由于同源策略, 浏览器禁止向外部脚本泄漏信息, 因此不会提供完整的报错信息, ...
- android studio 开发环境配置
android studio 开发环境配置 参考: 第一次使用Android Studio时你应该知道的一切配置 https://www.cnblogs.com/qianguyihao/p/43909 ...
- oracle 01741:非法的零长度标识
转自:https://blog.csdn.net/wanderball/article/details/7690206 出现此问题是标识符里有两个连续的“”号,去掉即可,或是里面填充内容,避免两个连续 ...