답안 #1098450

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1098450 2024-10-09T12:02:47 Z anhthi Snake Escaping (JOI18_snake_escaping) C++14
0 / 100
1 ms 4444 KB
#include <bits/stdc++.h>
 
using namespace std;
 
#define fi first
#define se second
#define ll long long
#define mp(x, y) make_pair(x, y)
#define sz(v) ((int) (v).size())
#define all(v) (v).begin(), (v).end()
#define MASK(i) (1LL << (i))
#define BIT(x, y) (((x) >> (y)) & 1)
#define pb push_back
#define heap priority_queue
#define max_rng *max_element
#define min_rng *min_element
#define rep(i, n) for(int i = 1, _n = (n); i <= _n; ++i)
#define forn(i, a, b) for(int i = (a), _b = (b); i <= _b; ++i)
#define ford(i, a, b) for(int i = (a), _b = (b); i >= _b; --i)

 
template <class X, class Y>
    inline bool maximize(X &x, Y y) {
        return (x < y ? x = y, true : false);
    }
 
template <class X, class Y>
    inline bool minimize(X &x, Y y) {
        return (x > y ? x = y, true : false);
    }
 
template <class X>
    inline void compress(vector<X> &a) {
        sort(all(a));
        a.resize(unique(all(a)) - a.begin());
    }
 
int ctz(ll x) { return __builtin_ctzll(x); }
int lg(ll x) { return 63 - __builtin_clzll(x); }
int popcnt(ll x) { return __builtin_popcount(x); }
 
mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
ll rand(ll l, ll r) {
    return l + abs((ll) rng()) % (r - l + 1);
}
 
const ll oo = (ll) 1e18 + 5;
const int inf = (ll) 1e9 + 7, mod = (ll) 1e9 + 7;
 
const int N = 21, LOG = 21;
 
void add(int &x, int y) { x += y; if (x >= mod) x -= mod; }
void sub(int &x, int y) { x -= y; if (x < 0) x += mod; }

int L, Q;
char cost[MASK(N) + 5];
ll f[MASK(N) + 5], dp[MASK(N) + 5];

int main(void) {
 
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    cin >> L >> Q;
    forn(i, 0, MASK(L) - 1) {
        cin >> cost[i];
        f[i] = dp[i] = cost[i] - '0'; 
    }

    forn(i, 0, L - 1) forn(msk, 0, MASK(L) - 1)
        if (BIT(msk, i)) f[msk] += f[msk - MASK(i)];

    forn(i, 0, L - 1) forn(msk, 0, MASK(L) - 1)
        if (!BIT(msk, i)) dp[msk] += dp[msk + MASK(i)];

    string s;
    rep(_, Q) {
        cin >> s;

        int mask1 = 0, mask2 = 0, mask3 = 0;
        forn(i, 0, L - 1) {
            int cur = MASK(L - i - 1);
            if (s[i] == '1')
                mask1 += cur;
            else if (s[i] == '?') mask2 += cur;
            else mask3 += cur;
        }
        ll res = 0;
        if (popcnt(mask2) <= 6) {
            for (int msk = mask2; ; msk = (msk - 1) & mask2) {
                res += cost[msk + mask1] - '0';
                if (!msk) break;
            }
        }
        else if (popcnt(mask1) <= 6) {
            for (int msk = mask1; ; msk = (msk - 1) & mask1) {
                if (popcnt(msk) & 1) res -= dp[msk + mask2];
                else res += dp[msk + mask2];
                if (!msk) break;
            }
        }
        else {
            for (int msk = mask3; ; msk = (msk - 1) & mask3) {
                if (popcnt(msk) & 1) res -= dp[msk + mask1];
                else res += dp[msk + mask1];
                if (!msk) break;
            }
        }
        cout << res << '\n';
    }

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4444 KB Output is correct
2 Incorrect 1 ms 4444 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4444 KB Output is correct
2 Incorrect 1 ms 4444 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4444 KB Output is correct
2 Incorrect 1 ms 4444 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4444 KB Output is correct
2 Incorrect 1 ms 4444 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4444 KB Output is correct
2 Incorrect 1 ms 4444 KB Output isn't correct
3 Halted 0 ms 0 KB -