QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#36994 | #3236. Hills And Valleys | jiaangk | AC ✓ | 279ms | 17776kb | C++ | 4.5kb | 2022-06-29 21:25:11 | 2022-06-29 21:25:12 |
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;
}
详细
Test #1:
score: 100
Accepted
time: 279ms
memory: 17776kb
input:
100 564 3348010339062339968164170543732424036101480063385567796871300633327190066610177797479597931706239956680908434521050648311220502482402268964497684451036156162125014743550622955579737715237323508714467463047351532756224409691528642332476831673220319724437158730801472447651264708417183934709815...
output:
108 78 493 296 760 1295 1419 1 1585 92 46 404 888 745 1073 262 626 1239 338 190 986 258 950 1740 848 2 399 1804 43 1417 102 2 533 103 11 422 99 16 505 263 375 1198 1306 441 489 301 113 853 100 4 199 107 177 471 362 28 290 1108 1 1778 96 293 488 1094 538 1098 1039 63 200 706 533 1340 573 186 1383 91 ...
result:
ok correct answer! (100 test cases)