2017 3 5 周考 解題報告

2022-08-20 19:36:18 字數 2454 閱讀 4046

~~又是一周一度的周考~~

1.1題目描述

求由 1 到 n 一共 n 個數字組成的所有排列中,逆序對個數為 k 的有多少個

1.2輸入格式

第一行為乙個整數 t,為資料組數。

以下 t 行,每行兩個整數 n, k,意義如題目所述。

1.3輸出格式

對每組資料輸出答案對 10000 取模後的結果

1.4 sample input

14 1

1.5 sample output

3

1.6資料範圍及約定

對於 30% 的資料,滿足 n ≤ 12。

對於所有資料,滿足 n ≤ 1000, k ≤ 1000, t

≤ 10。

解題思路:

第一眼咋一看,逆序對?歸併!!然而並不是。

接著仔細一讀,排列中的逆序對……排序是有順序的,想想排列中的交換某些位置後逆序對數的變化,of course是有規律的。

設f[i][j]為由1到i組成的序列中,逆序對數最多為j的有多少。

當多加乙個數後,逆序對最多增加i,最少為0。

得到轉移方程:

if(jelse f[i][j]=(f[i][j-1]+f[i-1][j]-f[i-1][j-i]);

最後輸出為f[n][k]-f[n][k-1].

code:

#include#include#includeusing namespace std;

const int maxn=1e3+2,mod=1e4;

int f[maxn][maxn]=;

int main()

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

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

}} scanf("%d",&q);

while(q--)

cout<3.1題目描述

一開始你有乙個空集,集合可以出現重複元素,然後有

q 個操作

1. add s

在集合中加入數字

s。2. del s

在集合中刪除數字

s。保證

s 存在

3. cnt s

查詢滿足 a&s = a 條件的 a 的個數

3.2輸入格式

第一行乙個整數 q 接下來

q 行,每一行都是

3 個操作中的乙個

3.3輸出格式

對於每個 cnt 操作輸出答案

3.4 sample input

7

add 11

cnt 15

add 4

add 0

cnt 6

del 4

cnt 15

3.5 sample output

1 2 2

3.6資料範圍及約定

對於 30% 的資料滿足:

1 ≤ n ≤ 1000

對於 100% 的資料滿足,

1 ≤ n ≤ 200000 , 0 < s < 216

解題思路:

先開始並沒有像出來,216用set絕對會炸,看了看題解,聽了聽lifel講,大概知道了題解之意。

分塊計算。

a[pre][suf],其中

pre < 28, suf < 28,表示前面 8 位是 pre,後面 8 位是 suf 的子集的數字的個數。

那麼對於每個 add 和

del 操作都可以最多

28 時間列舉

suf 更新

a 陣列。

對於 cnt 操作,最多

28 列舉

pre,計算答案即可。

code

#include#includeusing namespace std;

const int maxn=301;

int a[maxn][maxn];

int main()

} else

printf("%d\n",ans);

} }return 0;

}

13 4 7周賽解題報告

第一題,開始被輸出嚇著了,仔細看,水題一道,dfs即可啊 include include includeusing namespace std int p 25 5 bool v 25 int m,a,num int f 25 void go int x,int n double find int ...

13 03 31第四周周賽解題報告

a.roma and changing signs 乍一看此題還挺簡單,結果wa了兩次,還是要思考一下的 多次change可以作用在乙個數上 include include include include include includeusing namespace std int main int...

Leetcode 第136場周賽解題報告

週日的比賽的時候正在外面辦事,沒有參加。賽後看了下題目,幾道題除了表面要考的內容,還是有些能發散擴充套件的地方。做題目不是最終目的,通過做題發現知識盲區,去研究學習,才能不斷提高。理論和實際是有關係的,一些題目也都有現實意義。計算機的一些模擬操作,通過數學演算法,能夠大大減輕 量和演算法複雜度。第一...