QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#635863 | #9457. Prime Set | ucup-team296# | AC ✓ | 44ms | 31668kb | C++20 | 4.5kb | 2024-10-12 21:14:30 | 2024-10-13 19:28:09 |
Judging History
answer
#include <bits/stdc++.h>
#define long long long int
#define DEBUG
using namespace std;
// @author: pashka
struct maxflow {
struct edge {
int src, dst, cap, flw;
};
vector<edge> edges;
vector<vector<int>> graph;
vector<int> first;
vector<int> dist;
maxflow(int n) {
graph.resize(n);
}
void bfs(int s) {
dist.assign(graph.size(), -1);
dist[s] = 0;
int h = 0;
vector<int> q;
q.push_back(s);
while (h < q.size()) {
int x = q[h++];
for (int i = 0; i < graph[x].size(); i++) {
edge &e = edges[graph[x][i]];
if (e.flw == e.cap) continue;
int y = e.dst;
if (dist[y] == -1) {
dist[y] = dist[x] + 1;
q.push_back(y);
}
}
}
}
int dfs(int x, int t, int f) {
if (f == 0) return 0;
if (x == t) return f;
for (int i = first[x]; i < graph[x].size(); i++) {
first[x] = i;
edge &e = edges[graph[x][i]];
edge &er = edges[graph[x][i] ^ 1];
if (e.flw == e.cap || dist[e.dst] != dist[e.src] + 1)
continue;
int y = e.dst;
int res = dfs(y, t, std::min(f, e.cap - e.flw));
if (res > 0) {
e.flw += res;
er.flw -= res;
return res;
}
}
return 0;
}
long maxFlow(int s, int t) {
long flow = 0;
while (true) {
bfs(s);
first.assign(graph.size(), 0);
if (dist[t] == -1) break;
while (true) {
int pushed = dfs(s, t, INT_MAX);
if (pushed > 0) {
flow += pushed;
} else {
break;
}
}
}
return flow;
}
int addEdge(int u, int v, int cap) {
// cout << u << " " << v << "\n";
edges.push_back({u, v, cap, 0});
edges.push_back({v, u, 0, 0});
graph[u].push_back(edges.size() - 2);
graph[v].push_back(edges.size() - 1);
return edges.size() - 2;
}
};
const int MAX = 2000001;
vector<bool> prime(MAX, true);
struct test {
void solve() {
int n, k;
cin >> n >> k;
map<int, int> c0, c1;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
if (x % 2 == 0) {
c0[x]++;
} else {
c1[x]++;
}
}
vector<int> p0, p1;
for (auto [x, y]: c0) p0.push_back(x);
for (auto [x, y]: c1) p1.push_back(x);
int n0 = p0.size();
int n1 = p1.size();
maxflow mf(n0 + n1 + 2);
int s = n0 + n1;
int t = s + 1;
for (int i = 0; i < n0; i++) {
mf.addEdge(s, i, c0[p0[i]]);
}
for (int i = 0; i < n1; i++) {
if (p1[i] != 1) {
mf.addEdge(n0 + i, t, c1[p1[i]]);
}
}
vector<bool> g0(n0), g1(n1);
for (int i = 0; i < n0; i++) {
for (int j = 0; j < n1; j++) {
if (prime[p0[i] + p1[j]]) {
g0[i] = true;
g1[j] = true;
mf.addEdge(i, n0 + j, n);
}
}
}
if (c1[1] > 1) {
g1[0] = true;
}
int gn = 0;
for (int i = 0; i < n0; i++) {
if (g0[i]) gn += c0[p0[i]];
}
for (int i = 0; i < n1; i++) {
if (g1[i]) gn += c1[p1[i]];
}
int r = mf.maxFlow(s, t);
if (n1 > 0 && p1[0] == 1) {
int e = mf.addEdge(n0, t, c1[1]);
r += mf.maxFlow(s, t);
r += (mf.edges[e].cap - mf.edges[e].flw) / 2;
}
// cout << "! " << r << " " << gn << "\n";
r = min(r, k);
int res = min(r * 2 + (k - r), gn);
cout << res << "\n";
}
};
int main() {
ios::sync_with_stdio(false);
prime[0] = prime[1] = false;
for (int i = 2; i * i < MAX; i++) {
if (prime[i]) {
for (int j = i * i; j < MAX; j += i) {
prime[j] = false;
}
}
}
int n;
cin >> n;
for (int i = 0; i < n; i++) {
test().solve();
}
return 0;
}
这程序好像有点Bug,我给组数据试试?
详细
Test #1:
score: 100
Accepted
time: 8ms
memory: 3812kb
input:
4 4 2 2 3 4 5 5 3 3 4 12 3 6 6 3 1 3 6 8 1 1 1 0 1
output:
4 3 6 0
result:
ok 4 lines
Test #2:
score: 0
Accepted
time: 44ms
memory: 31668kb
input:
110 3 3 2 2 2 3 1 1 1 1 3 2 1 1 1 3 3 1 1 1 4 2 1 1 1 1 10 7 1 1 1 2 4 6 8 10 12 14 18 1 10 5 9 4 10 7 2 4 9 1 6 1 4 9 2 4 9 7 19 5 1 6 1 8 8 1 5 10 9 2 10 2 1 9 6 10 4 3 6 14 4 6 6 8 9 5 3 4 9 2 2 1 10 10 1 15 10 5 4 2 4 10 1 8 4 10 3 10 3 7 10 4 17 5 10 7 2 4 3 1 10 8 2 8 3 4 1 1 1 1 1 20 6 8 4 6 ...
output:
0 2 3 3 4 8 2 10 8 15 10 12 10 10 12 16 10 10 12 16 14 13 13 14 17 0 19 12 12 11 16 10 19 2 12 10 5 14 10 10 13 2 18 2 4 4 11 8 11 8 0 10 10 0 10 0 8 15 12 11 13 18 10 17 9 8 20 19 13 6 4 6 11 9 13 11 6 2 8 12 17 14 6 2 20 2 18 17 6 2 10 0 7 16 2 2 0 2 18 14 11 8 4 6 0 19 890 204 2746 2372
result:
ok 110 lines
Extra Test:
score: 0
Extra Test Passed