Fast Matrix Operations

uva11992:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3143

题意:给你n*m的矩阵初始化的时候矩阵里面的元素全部是0,对于这个矩阵有3中操作。

1 x1 y1 x2 y2 v   把(x1 y1 x2 y2)子矩阵 里面的元素全部加上v 

2 x1 y1 x2 y2 v   把(x1 y1 x2 y2)子矩阵 里面的元素全部置成v

3 x1 y1 x2 y2  求(x1 y1 x2 y2)子矩阵的和,以及最小值和最大值

题解:很明显是二维线段树维护,并且题目中的n不超过20.打20棵线段树就可以解决。这里的置成v,可以看成是*0+v,加上v可以看成*1+v;

线段树维护一个mul乘数,add加数,sum总和,minn最小值,maxn最大值。注意pushdown时候对子节点先*后加。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<cstring>
  5 using namespace std;
  6 const int N=100002;
  7 struct SegTree{
  8    int l,r;
  9    int add,mul;
 10    int sum,minn,maxn;
 11    void init(){
 12      add=0;mul=1;
 13    }
 14    inline int mid(){
 15         return (l+r)>> 1;
 16     }
 17     inline int len(){
 18         return r-l+1;
 19     }
 20     void to_mul(int m){//每次*一个数,那么之前add的数此时也要*这个数
 21         sum *=m;
 22         minn*=m;
 23         maxn*=m;
 24         mul *= m;
 25         add *= m;
 26     }
 27     void to_add(int a){
 28         minn+=a;
 29         maxn+=a;
 30         sum +=a* len();
 31         add +=a;
 32     }
 33 }T[23][N*4];
 34 void pushdown(int num,int rt){//这里一定要注意
 35     T[num][rt<<1].to_mul(T[num][rt].mul);
 36     T[num][rt<<1|1].to_mul(T[num][rt].mul);
 37     T[num][rt<<1].to_add(T[num][rt].add);
 38     T[num][rt<<1|1].to_add(T[num][rt].add);
 39     T[num][rt].init();
 40 }
 41 void pushup(int num,int rt){
 42    T[num][rt].sum=T[num][rt<<1].sum+T[num][rt<<1|1].sum;
 43    T[num][rt].maxn=max(T[num][rt<<1].maxn,T[num][rt<<1|1].maxn);
 44    T[num][rt].minn=min(T[num][rt<<1].minn,T[num][rt<<1|1].minn);
 45 }
 46 void build(int num,int rt,int l,int r){
 47     T[num][rt].l=l;
 48     T[num][rt].r=r;
 49     T[num][rt].minn=T[num][rt].maxn=T[num][rt].sum=0;
 50     T[num][rt].init();
 51     if(l==r){
 52     return;
 53     }
 54     int mid=T[num][rt].mid();
 55     build(num,rt<<1,l,mid);
 56     build(num,rt<<1|1,mid+1,r);
 57     pushup(num,rt);
 58 }
 59 void update(int num,int rt,int l,int r,int mul,int add){
 60        if(T[num][rt].l==l&&T[num][rt].r==r){
 61            T[num][rt].to_mul(mul);
 62            T[num][rt].to_add(add);
 63            return;
 64        }
 65       pushdown(num,rt);
 66       int mid=T[num][rt].mid();
 67       if(mid>=r)update(num,rt<<1,l,r,mul,add);
 68       else if(mid<l)update(num,rt<<1|1,l,r,mul,add);
 69       else {
 70         update(num,rt<<1,l,mid,mul,add);
 71         update(num,rt<<1|1,mid+1,r,mul,add);
 72       }
 73      pushup(num,rt);
 74 }
 75 SegTree query(int num,int rt,int l,int r){
 76         if(T[num][rt].l==l&&T[num][rt].r==r)
 77             return T[num][rt];
 78         pushdown(num,rt);
 79         int mid=T[num][rt].mid();
 80         if(mid>=r)return query(num,rt<<1,l,r);
 81         else if(mid<l)return query(num,rt<<1|1,l,r);
 82         else{
 83             SegTree  t1=query(num,rt<<1,l,mid);
 84             SegTree  t2=query(num,rt<<1|1,mid+1,r);
 85              SegTree  t;
 86              t.maxn=max(t1.maxn,t2.maxn);
 87              t.minn=min(t1.minn,t2.minn);
 88              t.sum=t1.sum+t2.sum;
 89               return t;
 90         }
 91 }
 92 int n,m,r;
 93 int x1,y1,x2,y2,val,type;
 94 int main(){
 95    while(~scanf("%d%d%d",&r,&n,&m)){
 96        for(int i=1;i<=r;i++)
 97           build(i,1,1,n);
 98        for(int i=1;i<=m;i++){
 99           scanf("%d%d%d%d%d",&type,&x1,&y1,&x2,&y2);
100           if(type==1){
101             scanf("%d",&val);
102             for(int i=x1;i<=x2;i++)
103                 update(i,1,y1,y2,1,val);
104           }
105           else if(type==2){
106             scanf("%d",&val);
107             for(int i=x1;i<=x2;i++)
108                 update(i,1,y1,y2,0,val);
109           }
110           else {
111             int sum=0,minn=1000000002,maxn=0;
112             SegTree ans;
113             for(int i=x1;i<=x2;i++){
114                 ans=query(i,1,y1,y2);
115                 sum+=ans.sum;
116                 minn=min(minn,ans.minn);
117                 maxn=max(maxn,ans.maxn);
118             }
119             printf("%d %d %d\n",sum,minn,maxn);
120           }
121        }
122    }
123 
124 }
View Code

 

转载于:https://www.cnblogs.com/chujian123/p/3840487.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

struts2+jquery 实现ajax登陆

一、新建一个web项目&#xff1a;test,配置好struts2的环境(详细配置见&#xff1a;http://www.cnblogs.com/wuweidu/p/3841297.html) 导入Jquery的js文件到项目 二、在com.action包下&#xff0c;新建一个loginAction.java loginAction.java的代码如下 package com.action;imp…

Docker Kafka 单机版安装

一、安装 下载library/zookeeper并运行 docker run --name zookeeper -d -p 2181:2181 -v /etc/localtime:/etc/localtime library/zookeeper 测试zookeeper端口是否通wget IP:2181 下载wurstmeister/kafka并运行 docker run -d --name kafka -p 9092:9092 --link zookeeper…

Docker 安装nginx,并挂载文件

创建挂载所需目录&#xff1a; mkdir /test/server/nginx/{conf,logs,html,conf.d} /test/server/nginx/conf创建nginx.conf文件&#xff0c;并编辑: user nginx; worker_processes 1;error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;events {wor…

ArrayList 源码分析

介绍 ArrayList 是一个数组队列&#xff0c;相当于 动态数组。与Java中的数组相比&#xff0c;它的容量能动态增长。 结构 ArrayList继承于AbstractList&#xff0c;实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。如下图&#xff1a; public class Arra…

Docker 简单入门(一)

Docker 简介 Docker是一个开源的容器引擎&#xff0c;它有助于更快地交付应。Docker可将应用程序和基础设施层隔离&#xff0c;并且能将基础设施当作程序-样进行管理。使用Docker&#xff0c;可更快地打包、测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期。 Docke…

PDF解决方案(2)--文件转PDF

相关专题链接&#xff1a; PDF解决方案&#xff08;1&#xff09;--文件上传 PDF解决方案&#xff08;2&#xff09;--文件转PDF PDF解决方案&#xff08;3&#xff09;--PDF转SWF PDF解决方案&#xff08;4&#xff09;--在线浏览 前言&#xff1a;上一篇中讲到的文件上传&…

Docker 常用命令(二)

Docker 镜像常用命令 搜索镜像 可使用 docker search 命令搜索存放在 Docker Hub 中的镜像。例如&#xff1a; docker search java 执行该命令后&#xff0c; Docker 就会在 Docker Hub 中搜索含有 java 这个关键词的镜像仓库。执行该命令后&#xff0c;可看到类似于如下的表格…

Docker 使用Dockerfile构建Docker(三)

Dockerfile 简单使用 先来编写一个最简单的 Dockerfile。 例如&#xff1a; FROM nginx RUN echo <h1>使用Dockerfile构建镜像</h1> > /usr/share/nginx/html/index.html 该 Dockerfile 非常简单&#xff0c;其中的 FORM 、 RUN 都是 Dockerfile 的指令。 FROM …

网络流之最大流问题

Reference&#xff1a; http://blog.csdn.net/rrerre/article/details/6751520 http://blog.csdn.net/y990041769/article/details/21026445 http://www.nocow.cn/index.php/Translate:USACO/NetworkFlow 最大流Edmonds_Karp算法模板&#xff1a; EK算法即增广路算法。 最大流最…

浅谈 trie树 及其实现

定义&#xff1a;又称字典树&#xff0c;单词查找树或者前缀树&#xff0c;是一种用于快速检索的多叉树结构&#xff0c; 如英文字母的字典树是一个26叉树&#xff0c;数字的字典树是一个10叉树。 核心思想&#xff1a;是空间换时间.利用字符串的公共前缀来降低查询时间的开销以…

Docker-compose 安装与基本使用(四)

安装 Docker-Compose Compose有多种安装方式,例如通过 shell, pip以及将 Compose作为容器安装等。本次安装以Shell 为主。 通过以下命令自动下载并安装适应系统版本的 Compose: curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(un…

git pull 报错:Untracked Fles Preventing Merge

场景 使用 git pull 命令更新报错解决 找到对应的文件删除后重新打开项目。

SpringBoot 配置多数据源

项目Git地址&#xff1a;SpringBoot 配置多数据源&#xff1a;Jacob-multi-data-source 准备工作 准备两个数据库(此模块中两个数据库一个为本地 一个为远程&#xff0c;本地为主&#xff0c;远程为从)。然后建表。 #本地库 CREATE TABLE username (id bigint(11) NOT NULL AUT…

微服务之基础知识

什么是微服务架构 微服务是系统架构上的一种设计风格&#xff0c; 它的主旨是将一个原本独立的系统拆分成多个小型服务&#xff0c;这些小型服务都在各自独立的进程中运行&#xff0c;服务之间通过基于HTTP的RESTful API进行通信协作。 被拆分成的每一个小型服务都围绕着系统中…

还是俄罗斯方块之android版

前面的&#xff0c;口水话 请直接跳过。 虽然现在不比以前了 也没多少人气了&#xff0c;放到首页 都不到几百的点击量。也许博客园整体水平也是在往水的方向发展。不谈那些了&#xff0c;哥也曾经辉煌过 有过一天上千的点击量 &#xff0c;哥也曾经有过粉丝&#xff0c;被小妹…

自定义快捷命令程序(VC++加批处理)

一 概述 在看《从小工到专家-程序员修炼之道》时&#xff0c;看到建议使用Shell&#xff0c;很有感触。在很多时候&#xff0c;通过键盘操作&#xff0c;比鼠标的确会块很多&#xff0c;如果能用好shell命令&#xff08;或批处理命令&#xff09; &#xff0c;的确能节省我们…

7. Adapter

转载于:https://www.cnblogs.com/anit/p/3930202.html

jQuery 学习笔记(jQuery: The Return Flight)

第一课. ajax&#xff1a;$.ajax(url[, settings]) 练习代码&#xff1a; $(document).ready(function() {$("#tour").on("click", "button", function() {$.ajax(/photos.html, {success: function(response) {$(.photos).html(response).fadeI…

于我,过去,现在和未来 —— 西格里夫·萨松

In me, past, present, future meet            于我&#xff0c;过去、现在和未来To hold long chiding conference              商讨聚会 各执一词 纷扰不息My lusts usurp the present tense             林林总总的 欲望&#xff0c;…

Java assert关键字

Java assert关键字 Assert 简介 Java2在1.4中新增了一个关键字&#xff1a;assert。在程序开发过程中使用它创建一个断言(assertion)。语法格式有两种&#xff1a; assert condition; 这里condition是一个必须为真(true)的表达式。如果表达式的结果为true&#xff0c;那么断言为…