首页 > 其他分享 >ABC356

ABC356

时间:2024-06-03 22:00:25浏览次数:27  
标签:limits int rep cin vector ABC356 using

A. Subsegment Reverse

模拟

代码实现
n, l, r = map(int, input().split())
l -= 1
a = list(range(1, n+1))
a[l:r] = a[l:r][::-1]
print(*a)

B. Nutrients

模拟

代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)

using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    
    vector<int> a(m);
    rep(i, m) cin >> a[i];
    
    vector x(n, vector<int>(m));
    rep(i, n)rep(j, m) cin >> x[i][j];
    
    vector<int> s(m);
    rep(i, n)rep(j, m) {
        s[j] += x[i][j];
    }
    
    rep(i, m) {
        if (s[i] < a[i]) {
            puts("No");
            return 0;
        }
    }
    
    puts("Yes");
    
    return 0;
}

C.Keys

二进制枚举

代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)

using namespace std;

int main() {
    int n, m, k;
    cin >> n >> m >> k;
    
    vector<int> as(m); 
    vector<char> r(m);
    rep(i, m) {
        int c;
        cin >> c;
        rep(j, c) {
            int a;
            cin >> a;
            --a;
            as[i] |= 1<<a;
        }
        cin >> r[i];
    }
    
    int ans = 0;
    rep(s, 1<<n) {
        bool ok = true;
        rep(i, m) {
            int num = __builtin_popcount(as[i]&s);
            if ((num >= k) != (r[i] == 'o')) ok = false;
        }
        if (ok) ans++;
    }
    
    cout << ans << '\n';
    
    return 0;
}

D. Masked Popcount

\( \sum\limits_{k=0}^n \operatorname{popcount}(k\&m) = \sum\limits_{k=0}^n\sum\limits_{i = 0}^{59} [\frac{k\& m}{2^i} = 1] = \sum\limits_{i = 0}^{59}\sum\limits_{k=0}^n [\frac{k\& m}{2^i} = 1] \)

其中,\(\sum\limits_{k=0}^n [\frac{k\& m}{2^i} = 1]\) 表示使得 \(k\& m\) 的第 \(i\) 位是 \(1\) 的 \(k\) 的个数
容易发现只有 \(m\) 中的 1 所在的位置才会产生贡献

image

考虑第 \(i\) 位,可以发现 \(2^i\) 个 \(0\) 和 \(2^i\) 个 \(1\) 交替出现
那么周期就是 \(2^{i+1}\),那么一个完整周期的贡献就是 \(2^i\),而剩下不足一个周期的部分(假设为 \(r\))的贡献就是 \(\max(0, r-2^i)\)

代码实现
#include <bits/stdc++.h>
#if __has_include(<atcoder/all>)
#include <atcoder/all>
using namespace atcoder;
#endif
#define rep(i, n) for (int i = 0; i < (n); ++i)

using namespace std;
using ll = long long;
using mint = modint998244353;

int main() {
    ll n, m;
    cin >> n >> m;
    n++;
    
    mint ans;
    rep(i, 60) {
        if (m>>i&1) {
            ll p = 2ll<<i;
            ll r = n%p;
            ans += (n-r)/2;
            if (r >= (1ll<<i)) {
                ans += r-(1ll<<i);
            }
        }
    }
    
    cout << ans.val() << '\n';
    
    return 0;
}

标签:limits,int,rep,cin,vector,ABC356,using
From: https://www.cnblogs.com/Melville/p/18229765

相关文章

  • abc356
    D1.5h没做出,E0.5h做出来啦?E有两个做法,第一个是枚举分子来计算分母对答案的贡献,另一种是枚举分母来求分子对答案的贡献。枚举分子来计算分母对答案的贡献需要用到数论分块,所以我们讲枚举分母来求分子对答案的贡献的写法。我们可以直接去枚举这个数是分母的情况。我们先考虑用......
  • ABC356G
    题意:给定一个\(N\),求所有\(N\)的子区间\([l,r],1\leql\leqr\leqN\)中满足\(i\in[l,r]\)中有至少一个\(A_i\)的出现次数有且仅出现一次。题意很明确,如何解决?暴力:直接\(N^2\)扫一遍然后进行每个区间的特判即可,复杂度\(O(N^3)\)估计只能过样例。莫队:由于发现......