yuwj  

图片

最后一分钟写出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';
}
posted on 2025-09-24 23:47  xiaowang524  阅读(41)  评论(0)    收藏  举报