(I2
I103
I6
(dp0
Vtable.%l
p1
(Vtable.cpp
p2
S'#include <bits/stdc++.h>\r\nusing namespace std;\r\n\r\nint n, m, k;\r\nvector<int> a, b, c;\r\nint row1Size, row2Size;\r\n\r\nstruct cell\r\n{\r\n    int value;\r\n    cell *right;\r\n    cell(int value)\r\n    {\r\n        this->value=value;\r\n        right=nullptr;\r\n    }\r\n};\r\n\r\nvoid read()\r\n{\r\n\r\n    cin>>n;\r\n    vector<bool> isC(n*2+1, true);\r\n\r\n    cin>>m;\r\n    a.resize(m);\r\n    for(int i=0;i<m;i++)\r\n    {\r\n        cin>>a[i];\r\n        isC[a[i]]=false;\r\n    }\r\n\r\n    cin>>k;\r\n    b.resize(k);\r\n    for(int i=0;i<k;i++)\r\n    {\r\n        cin>>b[i];\r\n        isC[b[i]]=false;\r\n    }\r\n\r\n    for(int i=1;i<=2*n;i++)\r\n    {\r\n        if(isC[i])c.push_back(i);\r\n    }\r\n}\r\n\r\ncell *row1=new cell(-1), *row2=new cell(-1);\r\n\r\nvoid build_cells()\r\n{\r\n    sort(a.begin(), a.end());\r\n    sort(b.begin(), b.end());\r\n\r\n    row1Size=m, row2Size=k;\r\n\r\n    cell *cell1=row1, *cell2=row2;\r\n    for(int i=0;i<a.size();i++)\r\n    {\r\n        cell1->right=new cell(a[i]);\r\n        cell1=cell1->right;\r\n    }\r\n\r\n    for(int i=0;i<b.size();i++)\r\n    {\r\n        cell2->right=new cell(b[i]);\r\n        cell2=cell2->right;\r\n    }\r\n\r\n}\r\n\r\nint answer=0;\r\n//set<pair<vector<int>, vector<int>>> answer;\r\nbool check()\r\n{\r\n    if(row1Size!=n||row2Size!=n)return false;\r\n\r\n    //vector<int> v1, v2;\r\n\r\n    for(cell *c1=row1->right, *c2=row2->right; c1!=nullptr; c1=c1->right, c2=c2->right)\r\n    {\r\n        if(c2->value<c1->value)return false;\r\n        //v1.push_back(c1->value);\r\n        //v2.push_back(c2->value);\r\n    }\r\n    //answer.insert({v1, v2});\r\n    answer++;\r\n    return true;\r\n}\r\n\r\nvoid print_rows()\r\n{\r\n    printf("%d %d\\n", row1Size, row2Size);\r\n    for(cell *c=row1->right;c!=nullptr;c=c->right)printf("%d ", c->value);\r\n    puts("");\r\n\r\n    for(cell *c=row2->right;c!=nullptr;c=c->right)printf("%d ", c->value);\r\n    puts("\\n");\r\n}\r\n\r\nvoid call_rec();\r\nvoid add_after(cell *current, int index, int &rowSize)\r\n{\r\n    static vector<bool> used(c.size(), false);\r\n\r\n    if(used[index])return;\r\n    if(current==nullptr || c[index] < current->value)return;\r\n    if(current->right!=nullptr && current->right->value<c[index])return;\r\n\r\n    cell *newCell=new cell(c[index]);\r\n\r\n    used[index]=true;\r\n    rowSize++;\r\n    newCell->right=current->right;\r\n    current->right=newCell;\r\n\r\n    if(check())\r\n    {\r\n        //print_rows();\r\n    }\r\n\r\n\r\n    call_rec();\r\n\r\n    rowSize--;\r\n    current->right=newCell->right;\r\n    used[index]=false;\r\n}\r\n\r\nvoid call_rec()\r\n{\r\n    stack<cell*> call1, call2;\r\n    cell *next1=row1, *next2=row2;\r\n\r\n    if(call1.size()!=0)\r\n    {\r\n        next1=call1.top()->right;\r\n    }\r\n\r\n    if(call2.size()!=0)\r\n    {\r\n        next2=call2.top()->right;\r\n    }\r\n\r\n    for(;next1!=nullptr;next1=next1->right)\r\n    {\r\n        call1.push(next1);\r\n        for(int i=0;i<c.size();i++)\r\n        {\r\n            add_after(next1, i, row1Size);\r\n        }\r\n        call1.pop();\r\n    }\r\n\r\n    for(;next2!=nullptr;next2=next2->right)\r\n    {\r\n        call2.push(next2);\r\n        for(int i=0;i<c.size();i++)\r\n        {\r\n            add_after(next2, i, row2Size);\r\n        }\r\n        call2.pop();\r\n    }\r\n}\r\n\r\nint main()\r\n{\r\n    ios::sync_with_stdio(false);\r\n    cin.tie(nullptr);\r\n    read();\r\n    build_cells();\r\n\r\n    //print_rows();\r\n    call_rec();\r\n    //printf("%d\\n", answer.size());\r\n    printf("%d\\n", answer);\r\n}\r\n/*\r\n4\r\n2 3 2\r\n3 4 8 7\r\n*/\r\n'
p3
tp4
stp5
.