description
維護乙個w*w的矩陣,初始值均為s.每次操作可以增加某格仔的權值,或詢問某子矩陣的總權值.修改運算元m<=160000,詢問數q<=10000,w<=2000000.
input
第一行兩個整數,s,w;其中s為矩陣初始值;w為矩陣大小
接下來每行為一下三種輸入之一(不包含引號):
"1 x y a"
"2 x1 y1 x2 y2"
"3"輸入1:你需要把(x,y)(第x行第y列)的格仔權值增加a
輸入2:你需要求出以左下角為(x1,y1),右上角為(x2,y2)的矩陣內所有格仔的權值和,並輸出
輸入3:表示輸入結束
output
對於每個輸入2,輸出一行,即輸入2的答案
sample input
0 41 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
3sample output35
hint
保證答案不會超過int範圍
#include#includeview code#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define fou(i,x,y) for(int i=x;i<=y;i++)
#define fod(i,x,y) for(int i=x;i>=y;i--)
#define mem(a,val) memset(a,val,sizeof(a))
#define pi acos(-1.0)
const
double exp = 1e-9
;typedef
long
long
ll;typedef unsigned
long
long
ull;
const
int inf = 0x3f3f3f3f
;const ll minf = 0x3f3f3f3f3f3f3f3f
;const
double dinf = 0xffffffffffff
;const
int mod = 1e9+7
;const
int n = 2e6+5;
struct
nodea[n],tmp[n];
intn,w,tot;
int ans[10005]; //
答案陣列
bool
cmp(node a,node b)
int tree[n]; //
tree陣列按二進位制存,根據n的末尾0的個數訪問,樹狀陣列
int lowbit(intx)
int query(int x) //
返回1到x的字首和
return
res;}
void add(int x,int v) //
實現a[x]+v;}
void clearr(intx)}
void cdq(int l,int
r)
else
}while(p<=mid)
while(q<=r)
for(int i=l;i<=r;i++)}
intmain()
; }
else
;
//因為他是中間矩陣,而我們加是1~x,1~y的加,所以多出來的要賦值成-1,來減掉,val賦值-1
a[++m]=node;
a[++m]=node;
//這裡多減了一次,要加回來,val賦值1
a[++m]=node;
ans[tot]+=(x2-x1+1)*(y2-y1+1)*s; //
答案賦初值
} }
sort(a+1,a+1+m,cmp);
cdq(
1,m);
for(int i=1;i<=tot;i++)
printf(
"%d\n
",ans[i]);
return0;
}
矩陣中求子矩形
有乙個 n的矩形,其中每個元素只可能是0or1。比如如下矩陣a 1 1 0 0 0 0 1 1 1 0 1 0 1 1 0 1其中a 0 0 a 0 1 a 3 0 a 3 1 這四個元素恰好是乙個長方形的四個角,且每個元素都是1.因此稱這四個元素圍成了乙個子矩形。現在需要判斷,給定的矩陣a中,判斷...
LA3029 矩陣中求子矩陣最大問題
la3029 題意給你乙個矩陣,每個單元格要麼為空,要麼為滿,求全是空的最大子矩陣的格仔數 3.最樸素的演算法是列舉所有的子矩陣的左上角的點和右下角的點,這樣就能確定乙個矩形,然後再遍歷這個矩陣,看矩陣是否全是空。複雜度大概是o m 2 n 2 通過掃瞄法,每次維護left i j right i ...
求子陣列和的最大值
題目要求 輸入乙個一維整形陣列,陣列裡有正數也有負數。一維陣列首尾相接,像個一條首尾相接帶子一樣。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。程式設計思路 1 首先建立乙個一維陣列a,進行資料儲存。2 定義變數,n用於求和,m為和最大值 3 開始for迴...