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