遼寧OI2016夏令營模擬T3 chess

2022-05-08 04:15:10 字數 2372 閱讀 7813

放棋子(chess.pas/c/cpp)

題目大意

現在有乙個 n*m 的棋盤,現在你需要在棋盤上擺放 2n 個棋子,要求滿足如下條件:

1、 每一列只能有乙個棋子;

2、 每一行的前 xi 個格仔有乙個棋子,而且最多有乙個棋子;

3、 每一行的後 yi 個格仔有乙個棋子,而且最多有乙個棋子;

求一共有多少種不同的放置方案,答案對於 1000000007 取模

輸入檔案

輸入檔案為 chess.in。

輸入共有 n+1 行。第一行有兩個整數 n,m,表示該棋盤的行數與列數。

接下來的 n 行,每行兩個整數 xi 和 yi,表示每一行的前 xi 個格仔需要有乙個棋子,每

一行的後 yi 個格仔需要有乙個棋子。

輸出檔案

輸出檔案為 chess.out。

輸出乙個整數表示共有多少種不同的方案,答案對於 1000000007 取模。

樣例輸入

3 61 2

3 33 2

樣例輸出

4資料規模與約定

n<=50 m<=200

對於所有的 i,有 xi+yi≤m。

——————————————————————————題解

首先60分我們只需要拿乘法原理算算算就可以了(把x,y排列順序不影響結果,那就變成排列後左邊對於第一行有x1中方法,第二行有x2-1種,第n行有xn-n+1種,乘法原理乘起來就好了,右邊同理,然後左右方案數相乘)因為最大的xi和最大的yi不會重合,但是如果他們最大重合了就要換乙個做法

首先我們左邊從小到大,右邊從大到小這麼想,因為xi+yi≤m,所以方塊排序後不會重疊,只是一列可能有兩種顏色

然後從左往右掃

然後我們對右邊來說事,也是從左往右掃,才能把兩者結合在一起

然後我們發現這只與i(掃到第幾行),k(選了幾個數),j(右邊可以放幾個)有關,然後我們把兩邊結合到一起

得到:不在右邊放f[i+1][j+p][k+z]+=f[i][j][k]*a(i-k,z)

在右邊放f[i+1][j-1+p][k+z+1]+=f[i][j][k]*j

最後的答案是f[m+1][0][2*n],因為到了m列的時候右邊還是可以放的

啊累死我了……本題結束了……下面是**……

1 #include 2 #include 3 #include 4 #include 5 #include 6

#define mo 1000000007

7#define siji(i,x,y) for(int i=(x);i<=(y);i++)

8#define gongzi(j,x,y) for(int j=(x);j>=(y);j--)

9#define xiaosiji(i,x,y) for(int i=(x);i

10#define sigongzi(j,x,y) for(int j=(x);j>(y);j--)

11#define pii pair12

#define fi first

13#define se second

14using

namespace

std;

15int n,m,x[55],y[55],z[205],p[205],b[205],c[205

];16

int a[205][105

];17

void

anm() 23}

24}25void

init()

28 siji(i,1

,n)

33 siji(i,1,m) b[i]=b[i-1]+p[i-1];//

這是個常數優化,加上後快到飛起

34 siji(i,1,m) c[i]=c[i-1]+z[i];//

同上35 anm();//

組合數預處理36}

37int f[205][55][205];//

f(i,j,k)

38void

solve() 48}

49}50 printf("

%d\n

",f[m+1][0][2*n]);51}

52int

main()

53

2016長樂夏令營 Day4

t1 模擬。開一排const char include include include include include include include include includeusing namespace std const char n0 5 3 const char n1 5 3 con...

2016長樂夏令營 Day9

t1 帶權並查集。每個約束看做一條x連向y的邊,邊權為x y c 對於乙個x,可能有多個y與他有關係,間接可以算出y與y 的關係,那麼邊權就記為y y 每次加入條件,就看看是否衝突 細節詳見 據說正解是差分約束?苟蒻是真不會。include include includeusing namespac...

北大資訊學夏令營模擬2019 5 21 神犇

時限 2s 空限 256mb 這題非常容易想到先做個字首和 a,b,c 分別表示三個人的粉絲數 不妨變成 a b,a c,b c 這樣相當於要從前面的字首中選個三維都不一樣的,使異或和最大。那麼這個可以暴力容斥地建出八種trie 每一維選和不選 然後自高位到低位的貪心,有的話走過去即可。注意如果有兩...