[POI] II. Trees
題目連結: http://main.edu.pl/en/archive/oi/2/drz 不難發現其實就照著他說的插入就好,不過因為我寫不太出來該如何判斷往哪邊插跟何時要開點,所以我用另外一種寫法。每次都把最大且相鄰的兩個點合併起來成為一個新節點,而當有人找不到人配時就是不合法的。構造完完整的樹後就直接DFS輸出他要的結果即可。 #include <bits/stdc++.h>
using namespace std;
#define N 2500
struct lNode{
lNode *l, *r;
int next, dep;
lNode(){l=NULL;r=NULL;}
};
lNode *List[N+5], __nn[4*N];
lNode* nNode(){
static int __cnt=0;
return &__nn[__cnt++];
}
void dfs2(lNode*);
int id=0;
void dfs1(lNode*);
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);
int n;cin>>n;
for(int i=0;i<n;i++)List[i]=nNode();
for(int i=0;i<n;i++)List[i]->next=i+1;
List[n-1]->next=n-1;
int mx=-1;
for(int i=0;i<n;i++){
cin>>(List[i]->dep);
mx=max(mx, List[i]->dep);
}
bool flag=1;
for(int i=mx;i>=1;i--){
if(!flag)break;
...