
最后一分钟写出B得代码没交上,哈哈哈哈,这辈子有了
这么简单得暴力要想3个小时,这辈子有了,哈哈哈
哈哈哈哈哈哈
A
void solve(){
cin >> n >> m;
vector<int> num(m+1);
for(int i=1;i<=m;++i) cin >> num[i];
bool isContinue = 1;
For(i,2,m) if(num[i] != num[i-1] + 1) isContinue = 0;
if(isContinue) cout << n + 1 - num.back() << '\n';
else cout << 1 << '\n';
}
B
void solve(){
cin >> n >> m >> s, s = " " + s;
set<int> st, exist;
vector<int> vec;
For(i,1,m) cin >> x, st.insert(x), vec.pb(x);
// 最多 多 n 个黑色格子,但是怎么多?
// 每一步最少走 i 步,最多走到哪里?
// 一个B,一直增加当前能到达得最远步数
int add = 0,now = 0;
for(int i=1;i<=n;++i){
if(s[i] == 'A'){
st.insert(i+add+1);
}else{
now = i+1+add;
// cerr << now << '\n';
while(st.count(now)) now++;
st.insert(now);
// int t = now;
while(st.count(now))now++;
// cerr << now << '\n';
add += now - (i+add+1);
// cerr << add << '\n';
}
}
cout << st.size() << '\n';
for(auto x : st) cout << x << ' ';
cout << '\n';
}
C
// 区间奇数和,偶数和
void solve(){
cin >> n;
vector<int> num(n*2+1), ans(n+2), oddSum(2*n+2), evenSum(2*n+2);
For(i,1,n*2) cin >> num[i];
For(i,1,n*2){
oddSum[i] = oddSum[i-1], evenSum[i] = evenSum[i-1];
if(i&1) oddSum[i] += num[i];
else evenSum[i] += num[i];
}
For(i,1,n-1) ans[i+1] = ans[i] + num[2*n+1-i] - num[i];
For(i,1,n) {
if(i&1) ans[i] += evenSum[2*n+1-i] - evenSum[i-1] - (oddSum[2*n+1-i] - oddSum[i-1]);
else ans[i] += oddSum[2*n+1-i] - oddSum[i-1] - (evenSum[2*n+1-i] - evenSum[i-1]);
}
For(i,1,n) cout << ans[i] << " \n"[i==n];
}
D
首先发现每列只能填一个,所以总数只能是 n,且每行填的格子满足对称仍然有效,不会被x吃掉可能得值,所以每行都有能够填的范围,刚好是一个倒金字塔形状,这样也同时限制了每行能用得格子上限,
然后从下往上填,一边填一遍记录填过的列,到了第 k 行可选列就减少了,然后这样计数答案就出来了
const int MAXN = 2e5 + 5;
ll inv(ll a) {
return qmi(a, Mod - 2,Mod);
}
std::vector<int> fac, invfac;
void init() {
fac.resize(MAXN), invfac.resize(MAXN);
fac[0] = 1;
for (int i = 1; i < MAXN; i++) {
fac[i] = 1LL * fac[i - 1] * i % Mod;
}
invfac[MAXN - 1] = inv(fac[MAXN - 1]);
for (int i = MAXN - 2; i >= 0; i--) {
invfac[i] = 1LL * invfac[i + 1] * (i + 1) % Mod;
}
}
ll binom(int n, int k) {
if (k < 0 || k > n) {
return 0;
}
return 1LL * fac[n] * invfac[k] % Mod * invfac[n - k] % Mod;
}
void solve(){
cin >> n;
vector<int> num(n+1), can(n+1);
can[1] = n;
For(i,2,n) can[i] = max(can[i-1] - 2, 0ll);
bool ok = 1;
For(i,1,n) {
cin >> num[i];
if(num[i]>can[i]) ok=0;
}
if(!ok || accumulate(all(num),0ll) != n) return cout << 0 << '\n', void();
ll ans = 1, used = 0;
for(int i=(n+1)/2; i >= 1; --i){
int now = can[i] - used;
ans = ans*binom(now,num[i])%Mod;
used += num[i];
}
cout << ans << '\n';
}

浙公网安备 33010602011771号