codevs 4927 线段树练习5
赶在期末考试之前把这道傻逼题调了出来。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #define maxn 100500
- using namespace std;
- long long n,m,a[maxn];
- long long root,tot=,ls[maxn<<],rs[maxn<<];
- long long lazy[maxn<<],add[maxn<<],sum[maxn<<],mi[maxn<<],mx[maxn<<];
- long long x,y,z;
- bool vis[maxn<<];
- void pushup(long long now)
- {
- sum[now]=sum[ls[now]]+sum[rs[now]];
- mx[now]=max(mx[ls[now]],mx[rs[now]]);
- mi[now]=min(mi[ls[now]],mi[rs[now]]);
- }
- void build(long long &now,long long left,long long right)
- {
- now=++tot;lazy[now]=;add[now]=;
- if (left==right)
- {
- sum[now]=mx[now]=mi[now]=a[left];
- return;
- }
- long long mid=(left+right)>>;
- build(ls[now],left,mid);
- build(rs[now],mid+,right);
- pushup(now);
- }
- void pushdown(long long now,long long left,long long right)
- {
- long long mid=(left+right)>>;
- if (vis[now]==true)
- {
- lazy[ls[now]]=lazy[rs[now]]=mx[ls[now]]=mx[rs[now]]=mi[ls[now]]=mi[rs[now]]=lazy[now];
- sum[ls[now]]=(mid-left+)*lazy[now];
- sum[rs[now]]=(right-mid)*lazy[now];
- lazy[now]=;vis[now]=false;vis[ls[now]]=vis[rs[now]]=true;
- add[ls[now]]=;add[rs[now]]=;
- }
- if (add[now]!=)
- {
- add[ls[now]]+=add[now];add[rs[now]]+=add[now];
- sum[ls[now]]+=(mid-left+)*add[now];
- sum[rs[now]]+=(right-mid)*add[now];
- mx[ls[now]]+=add[now];mx[rs[now]]+=add[now];
- mi[ls[now]]+=add[now];mi[rs[now]]+=add[now];
- add[now]=;
- }
- }
- void modify(long long now,long long left,long long right,long long l,long long r,long long p,long long type)
- {
- pushdown(now,left,right);
- if ((left==l) && (right==r))
- {
- if (type==)
- {
- add[now]+=p;sum[now]+=(right-left+)*p;mx[now]+=p;mi[now]+=p;
- return;
- }
- else
- {
- lazy[now]=p;add[now]=;sum[now]=p*(right-left+);
- mx[now]=mi[now]=p;vis[now]=true;
- return;
- }
- }
- long long mid=(left+right)>>;
- if (r<=mid) modify(ls[now],left,mid,l,r,p,type);
- else if (l>=mid+) modify(rs[now],mid+,right,l,r,p,type);
- else
- {
- modify(ls[now],left,mid,l,mid,p,type);
- modify(rs[now],mid+,right,mid+,r,p,type);
- }
- pushup(now);
- }
- long long ask(long long now,long long left,long long right,long long l,long long r,long long type)
- {
- pushdown(now,left,right);
- if ((left==l) && (right==r))
- {
- if (type==) return sum[now];
- else if (type==) return mx[now];
- else return mi[now];
- }
- long long mid=(left+right)>>;
- if (r<=mid) return ask(ls[now],left,mid,l,r,type);
- else if (l>=mid+) return ask(rs[now],mid+,right,l,r,type);
- else
- {
- if (type==)
- {
- long long regis1=ask(ls[now],left,mid,l,mid,type);
- long long regis2=ask(rs[now],mid+,right,mid+,r,type);
- return regis1+regis2;
- }
- else if (type==) return max(ask(ls[now],left,mid,l,mid,type),ask(rs[now],mid+,right,mid+,r,type));
- else return min(ask(ls[now],left,mid,l,mid,type),ask(rs[now],mid+,right,mid+,r,type));
- }
- }
- int main()
- {
- memset(vis,false,sizeof(vis));
- scanf("%lld%lld",&n,&m);
- for (long long i=;i<=n;i++)
- scanf("%lld",&a[i]);
- build(root,,n);
- for (long long i=;i<=m;i++)
- {
- char type[];
- scanf("%s",type);
- if (type[]=='a')
- {
- scanf("%lld%lld%lld",&x,&y,&z);
- modify(root,,n,x,y,z,);
- }
- else if ((type[]=='s') && (type[]=='e'))
- {
- scanf("%lld%lld%lld",&x,&y,&z);
- modify(root,,n,x,y,z,);
- }
- else if ((type[]=='s') && (type[]=='u'))
- {
- scanf("%lld%lld",&x,&y);
- printf("%lld\n",ask(root,,n,x,y,));
- }
- else if ((type[]=='m') && (type[]=='a'))
- {
- scanf("%lld%lld",&x,&y);
- printf("%lld\n",ask(root,,n,x,y,));
- }
- else
- {
- scanf("%lld%lld",&x,&y);
- printf("%lld\n",ask(root,,n,x,y,));
- }
- }
- return ;
- }
codevs 4927 线段树练习5的更多相关文章
- Codevs 4927 线段树练习5(分块)
4927 线段树练习5 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有n个数和5种操作 add a b c:把区间[a,b]内的 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- codevs 1080 线段树练习 CDQ分治
codevs 1080 线段树练习 http://codevs.cn/problem/1080/ 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 一行N个 ...
- codevs 1080 线段树练习
链接:http://codevs.cn/problem/1080/ 先用树状数组水一发,再用线段树水一发 树状数组代码:84ms #include<cstdio> #include< ...
- 【树状数组区间修改区间求和】codevs 1082 线段树练习 3
http://codevs.cn/problem/1082/ [AC] #include<bits/stdc++.h> using namespace std; typedef long ...
- codevs 1082 线段树练习3
1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 Description 给你N个数,有两种操作: 1: ...
- codevs 1299 线段树 区间更新查询
1299 切水果 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Description 简单的说,一共N个水果排成 ...
随机推荐
- docker-py的配置与使用
测试环境 75机:Red Hat Enterprise Linux Server 7.0,无外网访问权限 73机:Red Hat Enterprise Linux Server 7.0,无外网访问权限 ...
- JSP 页面打印
<HTML><HEAD><TITLE>javascript打印-打印页面设置-打印预览代码</TITLE> <META http-equiv=Co ...
- POJ 3692
Kindergarten Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4787 Accepted: 2326 Desc ...
- POJ 1006 Biorhythms (中国剩余定理)
在POJ上有译文(原文右上角),选择语言:简体中文 求解同余方程组:x=ai(mod mi) i=1~r, m1,m2,...,mr互质利用中国剩余定理令M=m1*m2*...*mr,Mi=M/mi因 ...
- iOS第三方支付-支付宝支付
处理手机中有无支付宝的情况支付宝调用接口: - (void)payOrder:(NSString *)orderStr fromScheme:(NSString *)schemeStr ...
- CSS Animatie是一款在线制作CSS3动画的工具,可以在线直接制作CSS3动画效果,生成代码
CSS Animatie是一款在线制作CSS3动画的工具,可以在线直接制作CSS3动画效果,生成代码 CSS Animatie 彩蛋爆料直击现场 CSS Animatie是一款在线制作CSS3动画的工 ...
- POJ 2127
#include <iostream> #define MAXN 501 using namespace std; int a[MAXN],b[MAXN],ans[MAXN]; int G ...
- POJ 1538
#include <iostream> #include <iomanip> using namespace std; ]; //拉格朗日插值算法 int main() { / ...
- interviewbit :Min Steps in Infinite GridBookmark Suggest Edit
You are in an infinite 2D grid where you can move in any of the 8 directions : (x,y) to (x+1, y), (x ...
- lintcode:格雷编码
格雷编码 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个二进制的差异. 给定一个非负整数 n ,表示该代码中所有二进制的总数,请找出其格雷编码顺序.一个格雷编码顺序必须以 0 开始, ...