QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#36994#3236. Hills And ValleysjiaangkAC ✓279ms17776kbC++4.5kb2022-06-29 21:25:112022-06-29 21:25:12

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:25:12]
  • Judged
  • Verdict: AC
  • Time: 279ms
  • Memory: 17776kb
  • [2022-06-29 21:25:11]
  • 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: 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)