Cod sursa(job #3353401)

Utilizator AndreiNicolaescuEric Paturan AndreiNicolaescu Data 6 mai 2026 21:02:53
Problema Generare de permutari Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <bits/stdc++.h>
#define cin ci
#define cout co
using namespace std;
ifstream cin("permutare.in");
ofstream cout("permutare.out");
const int Nmax = 1001;
const int Max= 1e9;
int c, n, p;
int dp[Nmax][Nmax];
void solve1()
{
    int lin = n, col = n, fh = 1, sh = n + 1, pos = p;
    vector<int> ans;
    ans.resize(2 * n + 2);
    for(int i=1; i<=2*n; i++)
    {
        if(col == 0)
        {
            ans[sh++] = i;
            lin--;
        }
        else
        if(pos <= dp[lin][col - 1])
        {
            ans[fh++] = i;
            col--;
        }
        else
        {
            ans[sh++] = i;
            pos -= dp[lin][col - 1];
            lin--;
        }
    }
    for(int i=1; i<=2 * n; i++)
        cout << ans[i] << " ";
    cout << '\n';
}
int main()
{
    dp[0][0] = 1;
    for(int i=1; i<Nmax; i++)
        dp[i][0] = 1;
    for(int i=1; i<Nmax; i++)
        for(int j=1; j<=i; j++)
            dp[i][j] = min(dp[i-1][j] + dp[i][j-1], Max);
    while(cin >> c)
    {
        if(c == 1)
        {
            cin >> n >> p;

            /*for(int i=1; i<=n; i++, cout << '\n')
                for(int j=1; j<=i; j++)
                    cout << dp[i][j] << " ";*/
                solve1();

        }
        else
        {
            cin >> n;

            int lin = n, col = n;
            vector<int> v;
            v.resize(2 * n + 2, 0);
            for(int i=1; i<=2*n; i++)
                cin >> v[i];
            int fh = 1, sh = n + 1, pos = 1;
            for(int i=1; i<=2 * n; i++)
            {
                if(v[fh] == i)
                {
                    col--;
                    fh++;
                }
                else
                    if(v[sh] == i)
                    {
                        pos += dp[lin][col - 1];
                        lin--;
                        sh++;
                    }
            }

            cout << pos << '\n';
        }
    }
    return 0;
}