题解:P12256 [蓝桥杯 2024 国 Java B] 数据库
tuboshu666 · · 题解
简化题意
共有
思路
将这
首先看插入和删除操作完整的一类。设有
插入第
插入第
插入第
于是,这
再看仅有插入操作的一类。设该类操作有
与第一类相似,这
两类操作方案相乘即得最终答案。
Code
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
const int N = 1e6 + 10;
const int MOD = 1e9 + 7;
unordered_map<int,int> mp;
long long sum[N];
long long C[N][10]; //组合数
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
//组合数递推
for (int i = 0 ; i <= 1e6 ; i++) C[i][0] = 1;
for (int i = 1 ; i <= 1e6 ; i++)
{
for (int j = 1 ; j <= min(2,i) ; j++)
{
C[i][j] = C[i-1][j-1] + C[i-1][j];
C[i][j] %= MOD;
}
}
int n;
cin >> n;
int m = 0; //完整操作组数
for (int i = 1 ; i <= n ; i++)
{
string type;
cin >> type;
if (type == "INSERT")
{
int x,y;
cin >> x >> y;
mp[x]++;
}
else
{
int x;
cin >> x;
mp[x]--;
m++;
}
}
long long ans = 1;
int k = 2;
//计算完整操作的组合数
for (int i = 1 ; i <= m ; i++)
{
ans *= C[k][2];
k += 2;
ans %= MOD;
}
//计算insert的排列数
for (int i = 2*m+1 ; i <= n ; i++)
{
ans *= i;
ans %= MOD;
}
cout << ans << endl;
return 0;
}