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.pswp.cn/news/273666.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273666.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273666.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux ll命令無效

1.編輯~/.bashc vim ~/.bashc 若vi/vim命令無效&#xff0c;參考 bash: vi: command not found/bash: vim: command not found 2.重新執行剛修改的初始化文件 source ~/.bashc

jquery不同版本沖突導致低版本功能不能用

oConflict() 方法讓渡變量 $ 的 jQuery 控制權。 該方法釋放 jQuery 對 $ 變量的控制。 使用方法&#xff1a; var jq $.noConflict();//轉換控制權 jq(document).ready(function () { jq("#outside").click(function () {你的操作...... }); }); });轉載于:https:/…

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…

hdu 2026 首字母變大寫

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid2026 題目大意&#xff1a;將一個英文句子&#xff0c;每個單詞第一個首字母變大寫。 1 #include <stdio.h>2 int main (void)3 {4 int i;5 char ch[100];6 while(gets(ch))7 {8 for (i0; c…

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…

HDU1429勝利大逃亡(續)HDU 1885 Key Task BFS+狀態壓縮+水

HDU1429 只有10把鑰匙 1<<10足夠了 標記用三維數組 用Linux好不習慣 繼續克服&#xff5e; #include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #include <malloc.h> #include <ctype.h> #include &l…

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…

http解碼-5

http://www.freebuf.com/articles/web/18084.html (1) 在 前端安全技術中常見的編碼繞過技術利用的就是不同系統間的編碼位寬(addslashes()樓哦的那個)&#xff0c;不同編碼的解碼順序(htmlParserjavascriptParser的解碼順序)&#xff0c;不同的解碼規則(unicode->ascii轉換…

IllegalArgumentException:argument type mismatch

Exception nested exception is org.apache.ibatis.reflection.ReflectionException: Could not set property id of class com.wzq.test.demo.entity.Fee with value 1211518556674199553Cause:java.lang.IllegalArgumentException: argument type mismatch 場景: 添加不傳ID使…

hadoop家族的各個成員

這篇文章不提原理&#xff0c;講講hadoop及其周邊項目的作用。 hadoop這個詞已經流行好多年了&#xff0c;一提到大數據就會想到hadoop&#xff0c;那么hadoop的作用是什么呢&#xff1f; 官方定義&#xff1a;hadoop是一個開發和執行處理大規模數據的軟件平臺。核心詞語是平臺…

ArrayList 源碼分析

介紹 ArrayList 是一個數組隊列&#xff0c;相當于 動態數組。與Java中的數組相比&#xff0c;它的容量能動態增長。 結構 ArrayList繼承于AbstractList&#xff0c;實現了List, RandomAccess, Cloneable, java.io.Serializable這些接口。如下圖&#xff1a; public class Arra…

Poj 1556 The Doors 計算幾何+最短路

其實本題非常的無腦&#xff0c;無腦拍完1A&#xff0c;寫到blog里只因為TM無腦拍也拍了很久啊 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostr…

String equals()方法 源碼分析

public boolean equals(Object anObject) {// :比較的引用類型&#xff0c;比較的是地址值是否相同if (this anObject) { //地址值相等&#xff0c;返回truereturn true;}// instanceOf判斷一個對象是不是某個類型的實例if (anObject instanceof String) {String anotherStrin…

Google,真的要離我們而去嗎?

Google,真的要離我們而去嗎&#xff1f; 好懷念&#xff0c;真正要解決問題&#xff0c;還得搜google!轉載于:https://www.cnblogs.com/fuyujian/p/3852444.html

Oracle 位圖索引

內容簡介: 1.位圖索引 1.1位圖索引使用注意事項; 1.2 使用位圖索引; 1.3 位圖索引對DML操作的影響; 2.位圖連接索引 2.1 明確需求后使用位圖索引; 2.1創建位圖連接索引的注意事項: 1.位圖索引: 1.1位圖索引使用注意事項: ? 一般適用于低基數列; ? 適合數據倉庫; ? 對于啟用位…

oracle服務器和客戶端字符集的查看和修改

一、什么是oracle字符集 Oracle字符集是一個字節數據的解釋的符號集合,有大小之分,有相互的包容關系。ORACLE 支持國家語言的體系結構允許你使用本地化語言來存儲&#xff0c;處理&#xff0c;檢索數據。它使數據庫工具&#xff0c;錯誤消息&#xff0c;排序次序&#xff0c;日…

Java 按位運算符(,|,^,,)

&(按位與) 定義&#xff1a;針對二進制&#xff0c;只要有一個為0&#xff0c;就為0。2 & 5 02的二進制&#xff1a;00000000 00000000 00000000 000000105的二進制&#xff1a;00000000 00000000 00000000 00000101 |(按位或) 定義&#xff1a;針對二進制&#xff0c…

Oracle 多行合并一行 方法

假如有如下表&#xff0c;其中各個i值對應的行數是不定的 Sql代碼 SQL> select * from t; I A D ---------- ---------- ------------------- 1 b 2008-03-27 10:55:42 1 a 2008-03-27 10:55:46 1…

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;上一篇中講到的文件上傳&…