QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#457733#8832. Daily Disinfectionucup-team3890#WA 8ms9672kbC++142.1kb2024-06-29 13:49:202024-06-29 13:49:21

Judging History

你现在查看的是最新测评结果

  • [2024-06-29 13:49:21]
  • 评测
  • 测评结果:WA
  • 用时:8ms
  • 内存:9672kb
  • [2024-06-29 13:49:20]
  • 提交

answer

#include <iostream>
#include <queue>

namespace MF {
int n, s, t;
struct Edge {
  int u, v, c, nxt;
} edges[20000007];
int ecnt;
int head[1000007];
void _addedge(int u, int v, int c) {
  edges[ecnt].u = u, edges[ecnt].v = v, edges[ecnt].c = c;
  edges[ecnt].nxt = head[u], head[u] = ecnt, ++ecnt;
}
void addedge(int u, int v, int c) { _addedge(u, v, c), _addedge(v, u, 0); }
int dis[1000007];
int cur[1000007];
bool BFS() {
  for (int i = 1; i <= n; ++i) {
    dis[i] = +0x3b9aca00;
    cur[i] = head[i];
  }
  std::queue<int> q;
  dis[s] = 0, q.push(s);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int e = head[u]; e != -1; e = edges[e].nxt) {
      if (edges[e].c != 0 && dis[u] + 1 < dis[edges[e].v]) {
        dis[edges[e].v] = dis[u] + 1, q.push(edges[e].v);
      }
    }
  }
  return dis[t] != +0x3b9aca00;
}
int sF;
int dfs(int u, int fl) {
  if (u == t) {
    sF += fl;
    return fl;
  }
  int rf = fl;
  for (int& e = cur[u]; e != -1; e = edges[e].nxt) {
    if (edges[e].c != 0 && dis[edges[e].v] == dis[u] + 1) {
      int f = dfs(edges[e].v, std::min(fl, edges[e].c));
      fl -= f, edges[e].c -= f, edges[e ^ 1].c += f;
      if (fl == 0) {
        return rf;
      }
    }
  }
  return rf - fl;
}
void init(int _n, int _s, int _t) {
  n = _n, s = _s, t = _t;
  for (int i = 1; i <= n; ++i) {
    head[i] = -1;
  }
  ecnt = 0;
}  
int Dinic() {
  sF = 0;
  while (BFS()) {
    dfs(s, +0x3b9aca00);
  }
  return sF;
}
};

void solve() {
  int n;
  std::string s;
  std::cin >> n >> s;
  MF::init(n + 2, 1, 2);
  int cc = 0;
  for (int i = 0; i < n; ++i) {
    if (s[i] == '1') {
      MF::addedge(1, i + 3, 1);
      ++cc;
    } else {
      MF::addedge(i + 3, 2, 1);
    }
    for (int j : {i - 1, i + 1}) {
      if (0 <= j && j < n) {
        if (s[i] == '1' && s[j] == '0') {
          MF::addedge(i + 3, j + 3, 1);
        }
      }
    }
  }
  int f = MF::Dinic();
  std::cout << cc * 2 - f << '\n';
}
int main() {
  std::cin.tie(nullptr)->sync_with_stdio(false);
  int t;
  std::cin >> t;
  while (t--) {
    solve();
  }
  return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 9672kb

input:

3
2
01
5
00110
9
101010101

output:

1
2
6

result:

ok 3 number(s): "1 2 6"

Test #2:

score: -100
Wrong Answer
time: 8ms
memory: 9620kb

input:

10000
15
010111111011011
10
1000101111
10
0011111101
1
0
3
110
4
1000
8
10000111
20
00000101000100001110
13
1101110110110
13
0111100011010
17
00001001111110101
1
0
20
10001010011000111100
11
00100110101
11
10110101000
15
001011110011000
16
1110111110000111
15
011110110110010
1
0
20
10110001101100010...

output:

18
9
12
0
3
1
6
7
14
9
14
0
11
6
6
9
19
13
0
11
8
7
4
9
0
6
3
7
4
10
15
6
9
1
9
2
1
11
1
12
16
13
21
5
17
20
26
7
5
4
7
1
1
9
9
5
3
0
0
15
11
8
7
9
7
5
12
1
5
5
17
0
2
12
5
3
9
11
3
11
5
4
11
11
26
2
8
9
11
11
7
1
2
7
2
18
12
6
0
0
6
8
5
12
0
4
8
13
5
4
13
4
8
18
10
1
13
6
8
2
5
12
8
1
7
8
9
3
7
18
...

result:

wrong answer 1st numbers differ - expected: '11', found: '18'