提出 #69536700


ソースコード 拡げる

#include <iostream>
#include <string>
#include <algorithm>
#include <functional>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <tuple>
#include <cstdio>
#include <cmath>
#include <cassert>
#include <atcoder/all>
#define rep(i, n) for(i = 0; i < n; i++)
#define int long long
using namespace std;
using namespace atcoder;
typedef vector<int> Vec;

void printVec(Vec p, int baius) {
    int i;
    rep(i, p.size()) {
        cout << p[i] + baius;
        if (i + 1 < p.size()) cout << " ";
    }
    cout << endl;
}

int calc(Vec p) {
    int i, j, n = p.size();
    
    const int INF = 1e+9;
    Vec dp1(n + 1, INF), dp2(n + 1, INF);

    dp1[0] = -INF;
    dp2[0] = -INF;
    rep(i, n) {
        int it1 = lower_bound(dp1.begin(), dp1.end(), p[i]) - dp1.begin();
        int it2 = lower_bound(dp2.begin(), dp2.end(), -p[i]) - dp2.begin();
        dp1[it1] = p[i];
        dp2[it2] = -p[i];
    }
    
    int len1 = 0, len2 = 0;
    for (i = n; i >= 0; i--) if (dp1[i] < INF) { len1 = i; break; }
    for (i = n; i >= 0; i--) if (dp2[i] < INF) { len2 = i; break; }

    vector<bool> used_lis(n), used_lds(n); //value -> include?

    rep(i, (1 << n)) {
        Vec v;
        rep(j, n) {
            if ((i >> j) % 2) {
                v.push_back(p[j]);
            }
        }

        bool is_lis = true, is_lds = true;
        rep(j, ((int)v.size()) - 1) {
            if (v[j] > v[j + 1]) is_lis = false;
            if (v[j] < v[j + 1]) is_lds = false;    
        }

        if (is_lis && v.size() >= len1) {
            assert(v.size() == len1);
            rep(j, v.size()) used_lis[v[j]] = true;
        }

        if (is_lds && v.size() >= len2) {
            assert(v.size() == len2);
            rep(j, v.size()) used_lds[v[j]] = true;
        }
    }

    int cnt = 0;
    rep(i, n) {
        if (used_lis[i] && used_lds[i]) cnt++;
    }
    return cnt;
}

Vec solve(int n, int K) {
    int i;

    if (n <= 7) {
        Vec p(n);
        int i; rep(i, n) p[i] = i;
        do {
            int cnt = calc(p);
            if (cnt == K) return p;
        } while (next_permutation(p.begin(), p.end()));
        return Vec();
    }

    if (K == 0) {
        Vec a = {2, 3, 7, 6, 1, 0, 4, 5};
        Vec p;
        rep(i, n - 8) p.push_back(i);
        for (i = n - 8; i < n; i++) {
            p.push_back(n - 8 + a[i - (n - 8)]);
        }
        return p;
    }

    if (K == 1) {
        Vec a = {1, 4, 2, 0, 3};
        Vec p;
        rep(i, n - 5) p.push_back(i);
        for (i = n - 5; i < n; i++) {
            p.push_back(n - 5 + a[i - (n - 5)]);
        }
        return p;
    }

    if (K == n) {
        Vec p(n);
        int i; rep(i, n) p[i] = i;
        return p;
    }

    Vec a;
    a.push_back(0);
    rep(i, K) {
        a.push_back(K - i);
    }

    Vec p;
    rep(i, n - K - 1) {
        p.push_back(i);
    }

    int cor = 0;
    for (i = n - K - 1; i < n; i++) {
        p.push_back(a[cor] + (n - K - 1));
        cor++;
    }
    return p;
}

signed main() {
    int T;
    cin >> T;
    while (T--) {
        int n, K;
        cin >> n >> K;
        Vec a = solve(n, K);
        if (a.size() == 0) cout << -1 << endl;
        else printVec(a, 1);
    }
    return 0;
}

提出情報

提出日時
問題 D - LIS ∩ LDS
ユーザ startcpp
言語 C++ 20 (gcc 12.2)
得点 700
コード長 3409 Byte
結果 AC
実行時間 267 ms
メモリ 6428 KiB

コンパイルエラー

Main.cpp: In function ‘void printVec(Vec, long long int)’:
Main.cpp:15:32: warning: comparison of integer expressions of different signedness: ‘long long int’ and ‘std::vector<long long int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
   15 | #define rep(i, n) for(i = 0; i < n; i++)
      |                                ^
Main.cpp:23:5: note: in expansion of macro ‘rep’
   23 |     rep(i, p.size()) {
      |     ^~~
Main.cpp:25:19: warning: comparison of integer expressions of different signedness: ‘long long int’ and ‘std::vector<long long int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
   25 |         if (i + 1 < p.size()) cout << " ";
      |             ~~~~~~^~~~~~~~~~
Main.cpp: In function ‘long long int calc(Vec)’:
Main.cpp:65:32: warning: comparison of integer expressions of different signedness: ‘std::vector<long long int>::size_type’ {aka ‘long unsigned int’} and ‘long long int’ [-Wsign-compare]
   65 |         if (is_lis && v.size() >= len1) {
      |                       ~~~~~~~~~^~~~~~~
In file included from /usr/include/c++/12/cassert:44,
                 from /opt/ac-library/atcoder/twosat.hpp:4,
                 from /opt/ac-library/atcoder/twosat:1,
                 from /opt/ac-library/atcoder/all:12,
                 from Main.cpp:14:
Main.cpp:66:29: warning: comparison of integer expressions of different signedness: ‘std::vector<long long int>::size_type’ {aka ‘long unsigned int’} and ‘long long int’ [-Wsign-compare]
   66 |             assert(v.size() == len1);
      |                    ~~~~~~~~~^~~~~~~
Main.cpp:15:32: warning: comparison of integer expressions of different signedness: ‘long long int’ and ‘std::vector<long long int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
   15 | #define rep(i, n) for(i = 0; i < n; i++)
      |                                ^
Main.cpp:67:13: note: in expansion of macro ‘rep’
   67 |             rep(j, v.size()) used_lis[v[j]] = true;
      |             ^~~
Main.cpp:70:32: warning: comparison of integer expressions of different signedness: ‘std::vector<long long int>::size_type’ {aka ‘long unsigned int’} and ‘long long int’ [-Wsign-compare]
   70 |         if (is_lds && v.size() >= len2) {
      |                       ~~~~~~~~~^~~~~~~
Main.cpp:71:29: warning: comparison of integer expressions of different signedness: ‘std::vector<long long int>::size_type’ {aka ‘long unsigned int’} and ‘long long int’ [-Wsign-compare]
   71 |             assert(v.size() == len2);
      |                    ~~~~~~~~~^~~~~~~
Main.cpp:15:32: warning: comparison of integer expressions of different signedness: ‘long long int’ and ‘std::vector<long long int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
   15 | #define rep(i, n) for(i = 0; i < n; i++)
      |                                ^
Main.cpp:72:13: note: in expansion of macro ‘rep’
   72 |             rep(j, v.size()) used_lds[v[j]] = true;
      |             ^~~

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 700 / 700
結果
AC × 1
AC × 24
セット名 テストケース
Sample 00_sample_00.txt
All 00_sample_00.txt, 01_random_00.txt, 01_random_01.txt, 01_random_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt, 01_random_10.txt, 01_random_11.txt, 01_random_12.txt, 01_random_13.txt, 01_random_14.txt, 01_random_15.txt, 02_max_00.txt, 02_max_01.txt, 02_max_02.txt, 02_max_03.txt, 02_max_04.txt, 02_max_05.txt, 03_small_00.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 1 ms 3652 KiB
01_random_00.txt AC 65 ms 4720 KiB
01_random_01.txt AC 65 ms 5888 KiB
01_random_02.txt AC 65 ms 4192 KiB
01_random_03.txt AC 65 ms 5572 KiB
01_random_04.txt AC 67 ms 4832 KiB
01_random_05.txt AC 65 ms 5504 KiB
01_random_06.txt AC 69 ms 6020 KiB
01_random_07.txt AC 66 ms 5488 KiB
01_random_08.txt AC 108 ms 5100 KiB
01_random_09.txt AC 65 ms 5564 KiB
01_random_10.txt AC 66 ms 6004 KiB
01_random_11.txt AC 65 ms 4956 KiB
01_random_12.txt AC 64 ms 4796 KiB
01_random_13.txt AC 66 ms 5076 KiB
01_random_14.txt AC 113 ms 6276 KiB
01_random_15.txt AC 68 ms 3604 KiB
02_max_00.txt AC 15 ms 6256 KiB
02_max_01.txt AC 15 ms 6364 KiB
02_max_02.txt AC 15 ms 6256 KiB
02_max_03.txt AC 15 ms 6300 KiB
02_max_04.txt AC 16 ms 6428 KiB
02_max_05.txt AC 267 ms 3572 KiB
03_small_00.txt AC 68 ms 3616 KiB