#include <stdio.h>
#include <queue>
#include <utility>
using namespace std;
char buff[1000000+7];
int main(void) {
size_t TC; scanf("%lu", &TC);
while (TC--) {
size_t n;
scanf("%lu", &n);
// char *buff = new char[n+1];
scanf("%s", buff);
priority_queue<pair<size_t, bool>> longest; // pair: longest intervals, is_extreme?
size_t result = 0;
for (size_t i=0; i<n; ++i)
if (buff[i] == '1')
++result;
size_t i = 0;
for (; i < n && buff[i] == '0'; ++i);
if (i == n) { printf("0\n"); continue; }
longest.push(make_pair(i*2, true));
size_t length = 0;
for (; i < n; ++i) {
if (buff[i] == '1') {
if (length != 0) {
longest.push(make_pair(length, false));
// longest.push(length);
// longest.push(length);
}
length = 0;
} else {
++length;
}
}
if (length != 0)
longest.push(make_pair(length*2, true));
size_t next_length = 0;
while (!longest.empty()) {
auto p = longest.top();
longest.pop();
if (p.second) {
result += min(next_length, p.first/2);
++next_length;
} else {
// result += min(next_length*2 + 1, p.first-1);
result += min(next_length, p.first/2 + (p.first%2));
result += min(next_length+1, p.first/2);
next_length += 2;
// if (next_length+1 >= p.first) {
// result += min(next_length, p.first);
// next_length += 1;
// } else {
// }
}
}
printf("%lu\n", result);
}
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #include <stdio.h> #include <queue> #include <utility> using namespace std; char buff[1000000+7]; int main(void) { size_t TC; scanf("%lu", &TC); while (TC--) { size_t n; scanf("%lu", &n); // char *buff = new char[n+1]; scanf("%s", buff); priority_queue<pair<size_t, bool>> longest; // pair: longest intervals, is_extreme? size_t result = 0; for (size_t i=0; i<n; ++i) if (buff[i] == '1') ++result; size_t i = 0; for (; i < n && buff[i] == '0'; ++i); if (i == n) { printf("0\n"); continue; } longest.push(make_pair(i*2, true)); size_t length = 0; for (; i < n; ++i) { if (buff[i] == '1') { if (length != 0) { longest.push(make_pair(length, false)); // longest.push(length); // longest.push(length); } length = 0; } else { ++length; } } if (length != 0) longest.push(make_pair(length*2, true)); size_t next_length = 0; while (!longest.empty()) { auto p = longest.top(); longest.pop(); if (p.second) { result += min(next_length, p.first/2); ++next_length; } else { // result += min(next_length*2 + 1, p.first-1); result += min(next_length, p.first/2 + (p.first%2)); result += min(next_length+1, p.first/2); next_length += 2; // if (next_length+1 >= p.first) { // result += min(next_length, p.first); // next_length += 1; // } else { // } } } printf("%lu\n", result); } return 0; } |
English