线段树--区间修改set,区间更新add
来源:互联网 发布:印刷报价软件好用吗 编辑:程序博客网 时间:2024/05/16 21:15
#include <iostream>
#include <cstdio>
#include <cstring>
using namespacestd;
const int maxn =1e6 +5;
const int INF =1 <<30;
int ql,qr,op;
int x1,x2,v;
int _sum,_min,_max;
struct tree{
struct node{
int minv,maxv,sumv;
int add,set;
}seg[maxn <<2];
void pushup(int l,int r,int rt)
{
int lc = rt <<1,rc = lc |1;
seg[rt].minv =min(seg[lc].minv,seg[rc].minv);
seg[rt].maxv =max(seg[lc].maxv,seg[rc].maxv);
seg[rt].sumv =seg[lc].sumv +seg[rc].sumv;
}
void pushdown(int l,int r,int rt)
{
int lc = rt <<1,rc = lc |1;
int mid = (l + r) >>1;
if(seg[rt].set){//v > 0
int x =seg[rt].set;
seg[lc].set =seg[rc].set = x;
seg[lc].maxv =seg[rc].maxv = x;
seg[lc].minv =seg[rc].minv = x;
seg[lc].sumv = (mid - l +1) * x;seg[rc].sumv = (r - mid) * x;
seg[rt].set =seg[lc].add =seg[rc].add =0;//有set时,add就失效,变成0
}
if(seg[rt].add){
int x =seg[rt].add;
seg[lc].add += x;seg[rc].add += x;
seg[lc].maxv += x;seg[rc].maxv += x;
seg[lc].minv += x;seg[rc].minv += x;
seg[lc].sumv += (mid - l +1) * x;seg[rc].sumv += (r - mid) * x;
seg[rt].add =0;
}
}
void update(int l,int r,int rt)
{
if(ql <= l && r <=qr){
if(op ==1){
seg[rt].add +=v;
seg[rt].minv +=v;
seg[rt].maxv +=v;
seg[rt].sumv += (r - l +1) *v;
}
else{
seg[rt].set =seg[rt].minv =seg[rt].maxv =v;
seg[rt].sumv = (r - l +1) *v;
seg[rt].add =0;
}
return;
}
pushdown(l, r, rt);
int mid = (l + r) >>1;
if(ql <= mid)update(l, mid, rt <<1);
if(mid <qr)update(mid +1, r, rt <<1 |1);
pushup(l, r, rt);
}
void query(int l,int r,int rt)
{
if(ql <= l && r <=qr){
_sum +=seg[rt].sumv;
_min =min(_min,seg[rt].minv);
_max =max(_max,seg[rt].maxv);
return;
}
pushdown(l, r, rt);
int mid = (l + r) >>1;
if(ql <= mid)query(l, mid, rt <<1);
if(mid <qr)query(mid +1, r, rt <<1 |1);
}
}trees[22];
int main()
{
int r,c,m;
while (scanf("%d%d%d",&r,&c,&m) !=EOF) {
memset(trees,0,sizeof(trees));
for (int i =0; i < m; i ++) {
scanf("%d%d%d%d%d",&op,&x1,&ql,&x2,&qr);
if(op <3){
scanf("%d",&v);
for (int j =x1; j <=x2; j ++) {
trees[j].update(1, c,1);
}
}
else{
_sum =0,_max = -INF,_min =INF;
for (int j =x1; j <=x2; j ++) {
trees[j].query(1, c,1);
}
printf("%d %d %d\n",_sum,_min,_max);
}
}
}
return0;
}
- 线段树--区间修改set,区间更新add
- 二维线段树区间修改(add,set)uva11992
- UVa 11992 add与set结合区间修改线段树
- Uva 11992 - Fast Matrix Operations题解(线段树区间更新+区间Set+Add,查询最大值,最小值,总和)
- 线段树区间更新
- 线段树区间更新
- 线段树 区间更新
- 线段树区间更新
- 线段树-区间更新
- 线段树区间更新
- 线段树区间更新
- 线段树区间更新
- 区间更新线段树
- 线段树区间更新
- 线段树 区间更新
- 线段树区间更新
- 线段树区间修改
- 线段树区间修改
- 图文详解 IntelliJ IDEA 15 创建普通 Java Web 项目
- 负载均衡的6种算法
- bzoj 1816: [Cqoi2010]扑克牌 二分
- 习题3.12
- 整数中1出现的次数
- 线段树--区间修改set,区间更新add
- bzoj4403 序列统计 ( 组合数学 + lucas )
- MySQL
- 三扇门的问题
- 初识JDBC
- 访问权限修饰符private、protected、default、private图解
- Qt程序关于 undefined refrence to vtable for xxx的解决
- 091 高等数学(上)复习:第一章极限与连续
- 中文分词工具-IKAnalyzer下载及使用