1. 实战7.4HDU1710-由先序和中序序列产生后序序列
希冀平台:
代码:
#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<sstream>
#include<string>
#include<string.h>
#include<iomanip>
#include<stdlib.h>
#include<map>
#include<queue>
#include<cmath>
#include<limits.h>
#include<climits>
#include<fstream>
#include<stack>
#include<set>
typedef long long ll;
using namespace std;
const int N = 2e5 + 10;
int alst[N], blst[N];
void gj(int l, int r,int lnow,int rnow, map<int, int>hxid)
//l:alst的左边界,r:alst的右边界
//lnow:blst的左边界,rnow:blst的右边界,hxid:查找
{
if (l >= r) { cout << alst[l] << ' '; return; }
if(lnow < hxid[alst[l]] and hxid[alst[l]]<rnow)//既有左子树又有右子树
{
gj(l + 1, l + hxid[alst[l]] - lnow, lnow, hxid[alst[l]] - 1, hxid);
gj(l + hxid[alst[l]] - lnow + 1, r, hxid[alst[l]] + 1, rnow, hxid);
}
else if (hxid[alst[l]] >= rnow)//只有左子树
{
gj(l + 1, l + hxid[alst[l]] - lnow, lnow, hxid[alst[l]] - 1, hxid);
}
else if (hxid[alst[l]] <= lnow)//只有右子树
{
gj(l + hxid[alst[l]] - lnow + 1, r, hxid[alst[l]] + 1, rnow, hxid);
}
cout << alst[l] << ' ';
return;
}
int main()
{
freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int n; cin >> n;
for (int i = 0; i < n; i++)cin >> alst[i];
map<int, int>hxid;
for (int i = 0; i < n; i++) { cin >> blst[i]; hxid[blst[i]] = i; }
gj(0, n - 1, 0, n - 1, hxid);
return 0;
}