做游戲視頻網(wǎng)站要批證嗎牛奶推廣軟文文章
E.雪中樓
如果算出按南北的序列,再轉(zhuǎn)成從低到高的編號序列,豈不是太麻煩了,幸好,沒有在這方面費(fèi)長時間,而是意識到,本質(zhì)就是要從低到高的編號序列,所以我就按樣例模擬了一下,當(dāng)a[i]=0時說明編號為i的樓,是前面所有樓中最低的,這時i就該放前面,如果為j,說明它比j高,這時i就該放到j(luò)后面。
答案上是用的鏈表,這樣就可以實(shí)現(xiàn),不斷插入合適的位置。而我起初用的定義find和insert,查找位置,再插入,果不其然,時間超限。
如果不太會鏈表,可以看看下面的方法:
既然a[i]=0,就放前面,那我可以從后往前遍歷,遇到0,就把i輸出,這樣就直接放前面了。而遇到其他值就先存起來,存的時候,存兩個a[i]和i,也就是i你要放到a[i]后邊。當(dāng)你輸出a[i]的時候,就將存儲里邊接到他后邊也輸出。記住,先存先出。
代碼
#include<bits/stdc++.h>
using namespace std;
map<int,int> q[200005];
void print(int i)
{for(auto it:q[i]){cout<<it.second<<' '; if(q[it.second].size()!=0) print(it.second);這里要遞歸,把接在輸出后面的值,也輸出}
}
int main()
{int n,k=0,a[200005];cin>>n; for(int i=1;i<=n;i++){cin>>a[i];}for(int i=n;i>=1;i--){if(a[i]==0) {cout<<i<<" ";print(i);}elseq[a[i]][k++]+=i; }
}