动物园
贪心宝宝题。注意边界。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
int n, m, k, c, b[64], d[N];
ll a[N];
map<int, int>mp;
vector<pii>l;
int main() {
scanf("%d%d%d%d", &n, &m, &c, &k);
for (int i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
for (int j = 0; j < 64; j++)
if (a[i] & (1ll << j)) b[j] = 1;
}
for (int i = 1; i <= m; i++) {
int p, q;
scanf("%d%d", &p, &q);
if (b[p]) mp[q] = 1;
else l.push_back({p, q});
}
for (auto [p, q] : l)
if (!mp[q]) d[p] = 1;
int s = 0;
for (int i = 0; i < 64; i++) if (d[i]) s++;
if (k == 64 && s == 0) {
if (n == 0) puts("18446744073709551616");
else printf("%llu\n", -(ull)n);
} else printf("%lld\n", (1ll << (k - s)) - n);
return 0;
}

浙公网安备 33010602011771号