傳送門
文章目錄
題意:
n≤200n\le200n≤200
思路:
首先關注到rrr從[2,n][2,n][2,n]都出現一次,所以很明顯最后一個位置只出現一次,但是這樣倒著來不是很好做考慮正著來。
我們可以枚舉111位置填什么,讓后再將所有qqq數組中的當前位置要填的數去掉,之后如果數組中元素只有一個的時候就說明他是下一位,依次這么加入即可,如果都能加入,再判斷一下整個序列是否合法。
每次添加的都是rrr位置的數,所以正確性是可以保證的。
由于n≤200n\le200n≤200,所以隨便亂搞搞就過啦。
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std
;
typedef long long LL
;
typedef unsigned long long ULL
;
typedef pair
<int,int> PII
;const int N
=210,mod
=1e9+7,INF
=0x3f3f3f3f;
const double eps
=1e-6;int n
;
set
<int>s
[N
],ps
[N
];
int ans
[N
],pos
[N
];bool check() {for(int i
=1;i
<=n
;i
++) {for(int j
=1;j
<=n
;j
++) if(ans
[j
]==i
) { pos
[i
]=j
; break; }}vector
<int>v
;for(int i
=1;i
<=n
-1;i
++) {v
.clear();for(auto x
:s
[i
]) v
.pb(pos
[x
]);sort(v
.begin(),v
.end());for(int i
=1;i
<v
.size();i
++) if(v
[i
]-v
[i
-1]!=1) return false;}return true;
}bool check(int ed
) {int pos
=n
;for(int i
=1;i
<=n
-1;i
++) ps
[i
]=s
[i
];ans
[pos
--]=ed
;for(int i
=1;i
<=n
-1;i
++) if(ps
[i
].count(ed
)!=0) ps
[i
].erase(ed
); while(pos
>=1) {int id
=-1;for(int i
=1;i
<=n
-1;i
++) if(ps
[i
].size()==1) {if(id
==-1) id
=i
;else return false;}if(id
==-1) return false;int val
=*ps
[id
].begin();ans
[pos
--]=*ps
[id
].begin();for(int i
=1;i
<=n
-1;i
++) if(ps
[i
].count(val
)!=0) ps
[i
].erase(val
);}if(!check()) return false;for(int i
=n
;i
>=1;i
--) printf("%d ",ans
[i
]);puts("");return true;
}int main()
{
int _
; scanf("%d",&_
);while(_
--) {scanf("%d",&n
);for(int i
=1;i
<=n
-1;i
++) {int k
; scanf("%d",&k
);while(k
--) {int x
; scanf("%d",&x
);s
[i
].insert(x
);}}for(int i
=1;i
<=n
;i
++) if(check(i
)) break;for(int i
=1;i
<=n
;i
++) s
[i
].clear();}return 0;
}
總結
以上是生活随笔為你收集整理的Codeforces Round #636 (Div. 3) F. Restore the Permutation by Sorted Segments 思维 + 暴力的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。