关于我没开1e7+10的数组然后RE的故事。
现在72pts求调。
求更优做法或优化
#include <bits/stdc++.h>
using namespace std;
const int N = 1e7 + 10;
int m, q, len, lower[N];
int v[N], cnt;
char s[N], c[N];
int change(int i, int j) {
int val = 0;
for (; i < len; i++) {
if (s[i] < '0' or s[i] > '9') break;
else val = val * 10 + (s[i] - '0');
}
v[j] = val;
return i - 1;
}
inline void init() {
stack <int> stac;
len = strlen(s);
int Len = 0;
for (int i = 0; i < len; i++) {
if (s[i] >= '0' and s[i] <= '9') {
i = change(i, Len);
c[Len++] = ' ';
} else if (s[i] != 'x') {
c[Len++] = s[i];
if (s[i] == '?') stac.push(Len);
if (s[i] == ':') {
lower[stac.top() - 1] = Len - 1;
stac.pop();
}
}
}
}
int main() {
ios :: sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> m >> q;
cin >> s;
init();
len = strlen(c);
while (q--) {
int val;
cin >> val;
for (int i = 0; i < len; i++) {
if (c[i] == '>') {
if (val > v[i + 1]) i += 2;
else i = lower[i + 2];
}
if (c[i] == '<') {
if (val < v[i + 1]) i += 2;
else i = lower[i + 2];
}
if (c[i] == ' ') {
cout << v[i] << endl;
break;
}
}
}
return 0;
}
还有最后的#19~#25与#17~#18只有 m 的大小的不同,可是感觉我的时间复杂度也没有与 m 有关啊。