QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#371656#244. Turn Off The Lightmfeitveer0 316ms114040kbC++143.3kb2024-03-30 14:47:592024-03-30 14:48:00

Judging History

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

  • [2024-03-30 14:48:00]
  • 评测
  • 测评结果:0
  • 用时:316ms
  • 内存:114040kb
  • [2024-03-30 14:47:59]
  • 提交

answer

/*
  ! Though life is hard, I want it to be boiling.
  ! Created: 2024/03/30 09:57:44
*/
#include <bits/stdc++.h>
using namespace std;

#define x first
#define y second
#define int long long
#define mp(x, y) make_pair(x, y)
#define eb(...) emplace_back(__VA_ARGS__)
#define fro(i, x, y) for(int i = (x); i <= (y); i++)
#define pre(i, x, y) for(int i = (x); i >= (y); i--)
inline void JYFILE19();

typedef long long i64;
typedef pair<int, int> PII;

bool ST;
const int N = 1e6 + 10;
const int mod = 1e9 + 7;

int n, m, ans, a[N], b[N];
int sf1[N], pr1[N], sf2[N], pr2[N];
int sf3[N], pr3[N], sf4[N], pr4[N];
int sf5[N][2], pr5[N][2];
string s;

inline void sol1(int i) {
  if (i == 1) {
    pr5[i - 1][1] = 3;
    pr5[i - 1][0] = 0;
  } else if (i - 1 == pr2[n]) {
    pr5[i - 1][0] = 1;
    pr5[i - 1][1] = 2;
  } else {
    if (a[i - 1] == 1) {
      pr5[i - 1][1] = pr5[i - 2][1] + 3;
      pr5[i - 1][0] = pr5[i - 2][0] + 1;
    } else {
      pr5[i - 1][1] = pr5[i - 2][0] + 3;
      pr5[i - 1][0] = pr5[i - 2][1] + 1;
    }
  }
}
inline void sol2(int i) {
  if (i == n) {
    sf5[i + 1][1] = 3;
    sf5[i + 1][0] = 0;
  } else if (i + 1 == sf2[1]) {
    sf5[i + 1][0] = 1;
    sf5[i + 1][1] = 2;
  } else {
    if (a[i + 1] == 1) {
      sf5[i + 1][1] = sf5[i + 2][1] + 3;
      sf5[i + 1][0] = sf5[i + 2][0] + 1;
    } else {
      sf5[i + 1][1] = sf5[i + 2][0] + 3;
      sf5[i + 1][0] = sf5[i + 2][1] + 1;
    }
  }
}
inline int sol1(int l, int i, int r) {
  int b = a[i] ^ (l != i) ^ pr4[i];
  return (i - l) * 2 + pr3[i] + sf5[i + 1][b];
}
inline int sol2(int l, int i, int r) {
  int b = a[i] ^ (r != i) ^ sf4[i];
  return (r - i) * 2 + sf3[i] + pr5[i - 1][b];
}

inline void solve() {
  cin >> n >> s, ans = 0;
  fro(i, 1, n) a[i] = s[i - 1] - '0';
  fro(i, 1, n) {
    pr1[i] = pr1[i - 1] | a[i];
    pr2[i] = pr2[i - 1];
    if (!pr2[i] && a[i]) pr2[i] = i;
  }
  pre(i, n, 1) {
    sf1[i] = sf1[i + 1] | a[i];
    sf2[i] = sf2[i + 1];
    if (!sf2[i] && a[i]) sf2[i] = i;
  }
  if (pr2[n]) {
    int num = 0;
    fro(i, 1, n) b[i] = a[i];
    fro(i, pr2[n] + 1, n - 1) {
      if (b[i]) pr4[i + 1] = 1;
      if (b[i]) b[i] ^= 1, b[i + 1] ^= 1, num += 2;
      pr3[i + 1] = num;
    }
  }
  if (sf2[1]) {
    int num = 0;
    fro(i, 1, n) b[i] = a[i];
    pre(i, sf2[1] - 1, 1 + 1) {
      if (b[i]) sf4[i - 1] = 1;
      if (b[i]) b[i] ^= 1, b[i - 1] ^= 1, num += 2;
      sf3[i - 1] = num;
    }
  }
  fro(i, 1, n) sol1(i);
  pre(i, n, 1) sol2(i);
  fro(i, 1, n) {
    int f1 = pr2[i - 1], f2 = sf2[i + 1];
    if (f1 && f2) {
      int s1 = sol1(f1, i, f2);
      int s2 = sol2(f1, i, f2);
      ans += min(s1, s2) * i;
    } else if (f2) {
      ans += sol1(i, i, f2) * i;
    } else if (f1) {
      ans += sol2(f1, i, i) * i;
    }
    ans %= mod;
  }
  cout << ans << "\n";
  fro(i, 0, n + 1) pr1[i] = sf1[i] = pr2[i] = sf2[i] = 0;
  fro(i, 0, n + 1) pr3[i] = sf3[i] = pr4[i] = sf4[i] = 0;
  fro(i, 0, n + 1) pr5[i][0] = sf5[i][0] = pr5[i][1] = sf5[i][1] = 0;
}

signed main() {
  JYFILE19();
  int t; cin >> t;
  while (t--) {
    solve();
  }
  return 0;
}

bool ED;
inline void JYFILE19() {
  srand(random_device{}());
  ios::sync_with_stdio(0), cin.tie(0);
  double MIB = fabs((&ED-&ST)/1048576.), LIM = 512;
  cerr << "MEMORY: " << MIB << endl, assert(MIB<=LIM);
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 316ms
memory: 114040kb

input:

146645
2
00
2
10
2
01
2
11
3
000
3
100
3
010
3
110
3
001
3
101
3
011
3
111
4
0000
4
1000
4
0100
4
1100
4
0010
4
1010
4
0110
4
1110
4
0001
4
1001
4
0101
4
1101
4
0011
4
1011
4
0111
4
1111
5
00000
5
10000
5
01000
5
11000
5
00100
5
10100
5
01100
5
11100
5
00010
5
10010
5
01010
5
11010
5
00110
5
10110
5...

output:

0
2
1
6
0
11
4
12
5
24
12
26
0
31
16
36
9
40
20
38
14
60
40
58
24
62
42
60
0
66
41
66
24
80
50
83
19
90
60
93
34
87
57
80
30
120
90
123
64
117
87
110
42
123
93
120
67
118
88
129
0
120
83
126
54
128
86
125
37
150
108
147
70
153
111
152
36
168
126
165
88
171
129
170
54
165
123
168
85
154
112
159
55
21...

result:

wrong answer 2nd lines differ - expected: '5', found: '2'