QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#36992#3236. Hills And ValleysjiaangkWA 252ms17860kbC++4.5kb2022-06-29 21:19:522022-06-29 21:19:53

Judging History

This is the latest submission verdict.

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-06-29 21:19:53]
  • Judged
  • Verdict: WA
  • Time: 252ms
  • Memory: 17860kb
  • [2022-06-29 21:19:52]
  • Submitted

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: 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)