热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

UVA11992:FastMatrixOperations

线段树,注

线段树,注意tag优先级

#include
#include

#include

#include

#define MAXN 1000005
using namespace std;
struct Node{
int sumv,maxv,minv,tag_add,tag_change;
Node(
int p1=0,int p2=0,int p3=0,int p4=0,int p5=0){
sumv
=p1,maxv=p3,minv=p2,tag_add=p4,tag_change=p5;
}
}dat[
22][MAXN<<2];
int a[22][MAXN];
Node Merge(Node t1,Node t2){
if(t1.tag_add==-1)return t2;
if(t2.tag_add==-1)return t1;
Node ret;
ret.sumv
=t1.sumv+t2.sumv;
ret.maxv
=max(t1.maxv,t2.maxv);
ret.minv
=min(t1.minv,t2.minv);
return ret;
}
void build(Node d[],int x,int k,int L,int R){
if(L+1==R){
d[k].sumv
=d[k].maxv=d[k].minv=a[x][L];
return;
}
build(d,x,k
<<1,L,(L+R)>>1);
build(d,x,k
<<1|1,(L+R)>>1,R);
d[k]
=Merge(d[k<<1],d[k<<1|1]);
}
void pushdown(Node d[],int k,int L,int R){
int lc=(k<<1),rc=(k<<1|1);
if(d[k].tag_change){
d[lc].tag_add
=0;
d[lc].tag_change
=d[k].tag_change;
d[lc].sumv
=d[k].tag_change*(((L+R)>>1)-L);
d[lc].maxv
=d[k].tag_change;
d[lc].minv
=d[k].tag_change;
d[rc].tag_add
=0;
d[rc].tag_change
=d[k].tag_change;
d[rc].sumv
=d[k].tag_change*(R-((L+R)>>1));
d[rc].maxv
=d[k].tag_change;
d[rc].minv
=d[k].tag_change;
d[k].tag_change
=0;
}
if(d[k].tag_add){
d[lc].tag_add
+=d[k].tag_add;
d[lc].sumv
+=d[k].tag_add*(((L+R)>>1)-L);
d[lc].maxv
+=d[k].tag_add;
d[lc].minv
+=d[k].tag_add;
d[rc].tag_add
+=d[k].tag_add;
d[rc].sumv
+=d[k].tag_add*(R-((L+R)>>1));
d[rc].maxv
+=d[k].tag_add;
d[rc].minv
+=d[k].tag_add;
d[k].tag_add
=0;
}
}
void add(Node d[],int a,int b,int k,int L,int R,int x){
if(b<=L||R<=a){
return;
}
else if(a<=L&&R<=b){
d[k].tag_add
+=x;
d[k].sumv
+=x*(R-L);
d[k].maxv
+=x;
d[k].minv
+=x;
}
else{
if(d[k].tag_add||d[k].tag_change){
pushdown(d,k,L,R);
}
add(d,a,b,k
<<1,L,(L+R)>>1,x);
add(d,a,b,k
<<1|1,(L+R)>>1,R,x);
d[k]
=Merge(d[k<<1],d[k<<1|1]);
}
}
void change(Node d[],int a,int b,int k,int L,int R,int x){
if(b<=L||R<=a){
return;
}
else if(a<=L&&R<=b){
d[k].tag_add
=0;
d[k].tag_change
=x;
d[k].sumv
=x*(R-L);
d[k].maxv
=x;
d[k].minv
=x;
}
else{
if(d[k].tag_add||d[k].tag_change){
pushdown(d,k,L,R);
}
change(d,a,b,k
<<1,L,(L+R)>>1,x);
change(d,a,b,k
<<1|1,(L+R)>>1,R,x);
d[k]
=Merge(d[k<<1],d[k<<1|1]);
}
}
Node query(Node d[],
int a,int b,int k,int L,int R){
if(b<=L||R<=a){
return Node(-1,-1,-1,-1,-1);
}
else if(a<=L&&R<=b){
return d[k];
}
else{
if(d[k].tag_add||d[k].tag_change){
pushdown(d,k,L,R);
}
Node lc
=query(d,a,b,k<<1,L,(L+R)>>1);
Node rc
=query(d,a,b,k<<1|1,(L+R)>>1,R);
return Merge(lc,rc);
}
}
void debug(Node d[],int k,int L,int R){
if(d[k].tag_add||d[k].tag_change){
pushdown(d,k,L,R);
}
if(L+1==R){
printf(
"%d ",d[k]);
return;
}
debug(d,k
<<1,L,(L+R)>>1);
debug(d,k
<<1|1,(L+R)>>1,R);
}
int m,n,T;
void solve(){
for(int i=1;i<=m;i++){
build(dat[i],i,
1,1,n+1);
}
while(T--){
int p;scanf("%d",&p);
int x1,y1,x2,y2;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(1==p){
int v;scanf("%d",&v);
for(int i=x1;i<=x2;i++){
add(dat[i],y1,y2
+1,1,1,n+1,v);
}
}
else if(2==p){
int v;scanf("%d",&v);
for(int i=x1;i<=x2;i++){
change(dat[i],y1,y2
+1,1,1,n+1,v);
}
}
else{
Node ans
=query(dat[x1],y1,y2+1,1,1,n+1);
for(int i=x1+1;i<=x2;i++){
Node t
=query(dat[i],y1,y2+1,1,1,n+1);
ans.sumv
+=t.sumv;
ans.maxv
=max(ans.maxv,t.maxv);
ans.minv
=min(ans.minv,t.minv);
}
printf(
"%d %d %d\n",ans.sumv,ans.minv,ans.maxv);
}
}
}
int main()
{
// freopen("data.in","r",stdin);
// freopen("my.in","w",stdout);
while(~scanf("%d%d%d",&m,&n,&T)){
solve();
}
}

 


推荐阅读
  • iOS snow animation
    CTSnowAnimationView.hCTMyCtripCreatedbyalexon1614.Copyright©2016年ctrip.Allrightsreserved.# ... [详细]
  • packagecom.panchan.tsmese.utils;importjava.lang.reflect.ParameterizedType;importjava.lang. ... [详细]
  • Java EE 平台集成了多种服务、API 和协议,旨在支持基于 Web 的多层应用程序开发。本文将详细介绍 Java EE 中的 13 种关键技术规范,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • 阿里云 Aliplayer高级功能介绍(八):安全播放
    如何保障视频内容的安全,不被盗链、非法下载和传播,阿里云视频点播已经有一套完善的机 ... [详细]
  • JavaSE For循环入门示例
    本文将介绍Java中For循环的基本概念和使用方法,通过几个简单的示例帮助初学者更好地理解和掌握For循环。 ... [详细]
  • 本文介绍了如何使用Postman构建和发送HTTP请求,包括四个主要部分:方法(Method)、URL、头部(Headers)和主体(Body)。特别强调了Body部分的重要性,并详细说明了不同类型的请求体。 ... [详细]
  • 如何解决TS1219:实验性装饰器功能可能在未来版本中更改的问题
    本文介绍了两种方法来解决TS1219错误:通过VSCode设置启用实验性装饰器,或在项目根目录下创建配置文件(jsconfig.json或tsconfig.json)。 ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • 蒜头君的倒水问题(矩阵快速幂优化)
    蒜头君将两杯热水分别倒入两个杯子中,每杯水的初始量分别为a毫升和b毫升。为了使水冷却,蒜头君采用了一种特殊的方式,即每次将第一杯中的x%的水倒入第二杯,同时将第二杯中的y%的水倒入第一杯。这种操作会重复进行k次,最终求出两杯水中各自的水量。 ... [详细]
  • 本文介绍了一种支付平台异步风控系统的架构模型,旨在为开发类似系统的工程师提供参考。 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • Gty的二逼妹子序列 - 分块与莫队算法的应用
    Autumn 和 Bakser 正在研究 Gty 的妹子序列,但遇到了一个难题。他们希望计算某个区间内美丽度属于 [a, b] 的妹子的美丽度种类数。本文将详细介绍如何利用分块和莫队算法解决这一问题。 ... [详细]
  • 从零开始编译Linux系统:第16章 全新起点
    本章将详细介绍如何从零开始编译一套完整的Linux系统,涵盖关键组件如glibc库的介绍及其重要性。通过本文,读者将了解从源代码构建Linux系统的全过程。 ... [详细]
  • 本文介绍了一种使用CSS3和jQuery实现的35款SVG图标加载动画。这些动画不仅视觉效果出色,还能提升用户体验。通过本文,您可以了解如何在项目中应用这些动画。 ... [详细]
  • 本文介绍了如何在 Qt 应用程序中实现状态栏、浮动窗口(铆接部件)和中心部件。通过简单的代码示例,详细解释了每个组件的创建和设置方法。 ... [详细]
author-avatar
hexin01
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有