QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#36992 | #3236. Hills And Valleys | jiaangk | WA | 252ms | 17860kb | C++ | 4.5kb | 2022-06-29 21:19:52 | 2022-06-29 21:19:53 |
Judging History
answer
#include <bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define pb push_back
#define st first
#define nd second
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
template <class T> void read(T &a) {
a=0;char x=getchar();bool f=0;
for(;x<'0'||x>'9';x=getchar())f|=x=='-';
for(;x>='0'&&x<='9';x=getchar())a=(a<<3)+(a<<1)+x-'0';
if(f)a=-a;
}
template <class T, class... Args> void read(T &a, Args&...args) {
read(a);
read(args...);
}
using namespace std;
const int N = 1e5 + 5;
char d[N];
int dp[N][12];
typedef pair<int, int> tp;
tp res[N][12];
int n;
int _X, _Y;
int ff(int x, int y, int id) {
return y - id + x + 1;
}
int fun(int x, int y) {
for (int i = 0; i <= n; ++i) {
for (int j = 0; j <= 11; ++j) {
dp[i][j] = 0;
res[i][j] = tp(1, 1);
}
}
for (int i = 1; i <= n; ++i) {
if (d[i] < x) {
int maxn = -1;
for (int j = 0; j <= d[i]; ++j) {
dp[i][j] = dp[i - 1][j];
if (dp[i][j] > maxn) {
maxn = dp[i][j];
}
}
dp[i][d[i]] = maxn + 1;
for (int j = d[i] + 1; j <= 11; ++j) {
dp[i][j] = dp[i - 1][j];
res[i][j] = res[i - 1][j];
}
} else
if (d[i] > y) {
int maxn = -1, maxp;
for (int j = 0; j <= d[i] + 2; ++j) {
dp[i][j] = dp[i - 1][j];
res[i][j] = res[i - 1][j];
if (dp[i][j] > maxn) {
maxn = dp[i][j];
maxp = j;
}
}
dp[i][d[i] + 2] = maxn + 1;
if (maxp <= x) res[i][d[i] + 2] = tp(i, i);
if (maxp > x && maxp < y + 2) res[i][d[i] + 2] = tp(res[i - 1][maxp].st, i - 1);
if (maxp >= y + 2) res[i][d[i] + 2] = res[i - 1][maxp];
for (int j = d[i] + 3; j <= 11; ++j) {
dp[i][j] = dp[i - 1][j];
res[i][j] = res[i - 1][j];
}
} else {
int maxn = -1, maxp;
int id = ff(x, y, d[i]);
for (int j = 0; j <= id; ++j) {
dp[i][j] = dp[i - 1][j];
res[i][j] = res[i - 1][j];
if (dp[i][j] > maxn) {
maxn = dp[i][j];
maxp = j;
}
}
dp[i][id] = maxn + 1;
if (maxp <= x) res[i][id] = tp(i, n);
if (maxp > x) res[i][id] = res[i - 1][maxp];
for (int j = id + 1; j <= 11; ++j) {
dp[i][j] = dp[i - 1][j];
res[i][j] = res[i - 1][j];
}
if (d[i] == x) {
maxn = -1;
for (int j = 0; j < x; ++j) {
if (dp[i - 1][j] > maxn) {
maxn = dp[i - 1][j];
maxp = j;
}
}
dp[i][d[i]] = maxn + 1;
}
if (d[i] == y) {
maxn = -1;
for (int j = 0; j < y + 2; ++j) {
if (dp[i - 1][j] > maxn) {
maxn = dp[i - 1][j];
maxp = j;
}
}
dp[i][d[i] + 2] = maxn + 1;
if (maxp <= x) res[i][d[i] + 2] = tp(i, i);
if (maxp > x && maxp < y + 2) res[i][d[i] + 2] = tp(res[i - 1][maxp].st, i - 1);
if (maxp >= y + 2) res[i][d[i] + 2] = res[i - 1][maxp];
}
}
}
int ans = 0;
for (int i = 0; i <= 11; ++i) {
if (dp[n][i] >= ans) {
ans = dp[n][i];
_X = res[n][i].st;
_Y = res[n][i].nd;
}
}
return ans;
}
int main() {
int T;
read(T);
while (T--) {
read(n);
scanf("%s", d + 1);
for (int i = 1; i <= n; ++i) {
d[i] -= '0';
}
int ans = 0, ansl, ansr;
for (int i = 0; i <= 9; ++i) {
for (int j = i; j <= 9; ++j) {
int y = fun(i, j);
if (y == 5) {
fun(i, j);
}
if (y > ans) {
ans = y;
ansl = _X;
ansr = _Y;
}
}
}
printf("%d %d %d\n", ans, ansl, ansr);
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 252ms
memory: 17860kb
input:
100 564 3348010339062339968164170543732424036101480063385567796871300633327190066610177797479597931706239956680908434521050648311220502482402268964497684451036156162125014743550622955579737715237323508714467463047351532756224409691528642332476831673220319724437158730801472447651264708417183934709815...
output:
106 78 493 292 14 1749 1419 1 1585 89 4 406 868 4 1073 258 3 1236 324 205 1439 254 1086 1766 848 2 399 1294 479 1417 100 13 505 102 1 422 98 7 497 249 1 1326 1304 1 108 292 11 853 99 4 199 100 203 471 349 285 1018 1108 1 1778 93 1 140 854 538 1194 1038 1 13 684 1 1449 548 2 1383 89 176 496 94 4 270 ...
result:
wrong answer read m = 106 but expected m = 108 (test case 1)