NKOJ 4224 矩陣計數

2021-08-03 17:33:04 字數 2485 閱讀 3934

p4224矩陣計數

時間限制 :- ms空間限制 :65536 kb

評測說明 :1s

問題描述

給出乙個n*m的方格矩陣,每個格仔裡都有乙個整數。你有兩種操作:

"1 x y k" 將座標為x,y的格仔的數字改為k;

"2 x1 y1 x2 y2 k"詢問滿足值為k且座標(x,y) x1<=x<=x2 ,y1<=y<=y2的格仔的數量

輸入格式

第一行,兩個整數n和m

接下來乙個n*m的整數矩陣,表示矩陣的初始情況。

接下來一行,乙個整數q,表示有q個操作:

操作1:"1 x y k" 將座標為x,y的格仔的數字改為k;

操作2:"2 x1 y1 x2 y2 k"詢問滿足值為k且座標x1<=x<=x2 ,y1<=y<=y2的格仔的數量

輸出格式

對於每個2號操作,輸出一行,乙個整數,表示查詢結果
樣例輸入 1

3 3

1 2 3

3 2 1

2 1 3

32 1 1 2 2 1

1 2 3 2

2 2 2 3 3 2

樣例輸出 1

1

2

樣例輸入 2

5 5

4 3 4 5 3

2 5 4 1 3

5 2 3 4 4

2 5 3 3 3

5 1 1 1 3

62 1 1 5 3 1

1 2 2 2

1 2 3 4

2 2 1 5 3 2

1 4 4 2

2 1 1 3 5 2

樣例輸出 2

2

43

提示

對於30%的資料:n,m<=30     q<=5000

對於100%的資料:

n,m<=300 q<=200000 k<=100

1<=x,x1,x2<=n 1<=y,y1,y2<=m x1<=x2 y1<=y2

** 改編自jsoi2009 count

這道題目的解法其實很暴力

我們知道在某乙個二維矩陣裡頭增加標記1時的操作和計數,就是使用二維樹狀陣列

那麼如何在乙個二維矩陣當中增加某乙個數字的標記呢??

我們就多開一維嘛

我們給每乙個數字開乙個二維矩陣,當原矩陣當中的某個位置是某個數字時,我們就在該數字的矩陣的相應位置標個1

例如

1 2 3

4 5 6

1 2 3

那麼對應的數字1的矩陣為

1 0 0

0 0 0

1 0 0

對應數字5的矩陣為

0 0 0

0 1 0

0 0 0

這個樣子,我們就能夠輕易地進行改動,操作與二維樹狀陣列的修改和統計操作基本相同

我們在修改某個位置的數字時,要先將該位置的原數字標記取消掉,在新增新的標記

例如

原矩陣

1 2 3

3 2 1

我們將3 1上的數字3修改為1

那麼 3的矩陣將由

0 0 1

1 0 0

變為0 0 0

1 0 0

1的矩陣將由

1 0 0

0 0 1

變為1 0 1

0 0 1

#include 

#include

using

namespace

std;

int n,m;

int maps[345][345],c[123][312][312];

inline

int input()

int lowbit(int x)

void add(int x,int y,int num,int d)

int sum(int x,int y,int num)

int main()

t=input();

for(int i=1;i<=t;i++)

else

}return

0;}

NKOJ 3861 子矩陣(矩陣dp 單調佇列)

問題描述 小 a 有乙個 n m 的矩陣,矩陣中 1 n m 這 n m 個整數均出現過一次。現在小 a 在這個矩陣內選擇乙個子矩陣,其權值等於這個子矩陣中的所有數的最 小值。小 a 想知道,如果他選擇的子矩陣的權值為 i 1 i n m 那麼他選擇 的子矩陣可能有多少種?小 a 希望知道所有可能的...

NKOJ 4385 簡單計算(矩陣乘法)

問題描述 給你三個整數 n,x,和 m,計算 n k 1k xxk 輸入格式 一行,三個整數n,x,和 m,輸出格式 一行,乙個整數,表示計算結果 樣例輸入 1 100 1 10000 樣例輸出 1 樣例輸入 2 3 4 1000 樣例輸出 2 提示 1 n,m 2 10 9 1 x 50.注意到x...

題 矩陣乘法 NKOJ 3711 擺花

nkoj 3711 擺花 時間限制 ms 空間限制 65536 kb 評測說明 時限1000ms 問題描述 藝術館門前將擺出許多花,一共有n個位置排成一排,每個位置可以擺花也可以不擺花。有些花如果擺在相鄰的位置 隔著乙個空的位置不算相鄰 就不好看了。假定每種花數量無限,求擺花的方案數。輸入格式輸出格...