給定乙個 h*w 的矩陣,矩陣的行編號從上到下依次為 1..h,列編號從左到右依次1..w。在這個矩陣中你需要在每
個格仔中填入 1..m 中的某個數。給這個矩陣填數的時候有一些限制,給定 n 個該矩陣的子矩陣,以及該子矩陣的
最大值 v,要求你所填的方案滿足該子矩陣的最大值為 v。現在,你的任務是求出有多少種填數的方案滿足 n 個限
制。兩種方案是不一樣的當且僅當兩個方案至少存在乙個格仔上有不同的數。由於答案可能很大,你只需要輸出答
案 對 1,000,000,007 的取模即可。
輸入資料的第一行為乙個數 t,表示資料組數。
對於每組資料,第一行為四個數 h,w,m,n。
接下來 n 行,每一行描述乙個子矩陣的最大值 v。每行為五個整
數 x1,y1,x2,y2,v,表示乙個左上角為(x1,y1),右下角為(x2,y2)的子矩陣的最大
值為 v ( 1≤x1≤x2≤h, 1≤y1≤y2≤w)
t≤5,1≤h,w,m≤10000,1≤v≤m,1≤n≤10
對於每組資料輸出一行,表示填數方案 mod 1,000,000,007 後的值。
23 3 2 2
1 1 2 2 2
2 2 3 3 1
4 4 4 4
1 1 2 3 3
2 3 4 4 2
2 1 4 3 2
1 2 3 4 4
2876475
by 佚名上傳
題解:今年省選一試的題目。因為我只參加過二試,所以我知道這是day1的。
因為告訴你的是最大值v,說明那個矩陣裡面肯定要有乙個數=v,這樣子很不好做,我們考慮容斥,轉換為每個矩陣的數都<=v,通過2^n列舉每個最大值要不要-1(用來容斥)
接下來再用2^n暴力算出其中x個的交的區域大小為多少,容斥出來,就變成了一些塊,把每塊的v^siz乘起來就好了。
複雜度o(t*2^(2*n))
**:
#include #include #include #include #include #include using namespace std;const int mod = 1e9+7;
int fast_pow(int a, int x)
return res;
}int h, w, m, n;
struct info a[15], t[15], beg;
int siz(info x)
bool check(info x)
info add(info a, info b) ;
}int g[1<<15], f[1<<15];
void dfs1(int dep, info now, int s)
dfs1(dep+1, now, s<<1);
dfs1(dep+1, add(now, a[dep]), s<<1|1);
}#define cnt __builtin_popcount
void getf()
int ans;
void dfs3(int dep, int k)
else
return;
} t[dep] = a[dep]; dfs3(dep+1, k);
t[dep] = a[dep]; t[dep].v--; dfs3(dep+1, k^1);
}void work()
int main()
bzoj 5010 Fjoi2017 矩陣填數
給定乙個 h w 的矩陣,矩陣的行編號從上到下依次為 1.h,列編號從左到右依次1.w。在這個矩陣中你需要在每 個格仔中填入 1.m 中的某個數。給這個矩陣填數的時候有一些限制,給定 n 個該矩陣的子矩陣,以及該子矩陣的 最大值 v,要求你所填的方案滿足該子矩陣的最大值為 v。現在,你的任務是求出有...
Bzoj3924 Fjoi2015幻想鄉戰略遊戲
傲嬌少女幽香正在玩乙個非常有趣的戰略類遊戲,本來這個遊戲的地圖其實還不算太大,幽香還能管得過來,但是不知道為什麼現在的網遊廠商把遊戲的地圖越做越大,以至於幽香一眼根本看不過來,更別說和別人打仗了。在打仗之前,幽香現在面臨乙個非常基本的管理問題需要解決。整個地圖是乙個樹結構,一共有n塊空地,這些空地被...
FJOI2007 bzoj1002 輪狀病毒
description 輪狀病毒有很多變種,所有輪狀病毒的變種都是從乙個輪狀基產生的。乙個n輪狀基由圓環上n個不同的基原子 和圓心處乙個核原子構成的,2個原子之間的邊表示這2個原子之間的資訊通道。如下圖所示 n輪狀病毒的產生規律是在乙個n輪狀基中刪去若干條邊,使得各原子之間有唯一的資訊通道,例如共有...