PAT(B級)1015反転チェーンテーブル(25)(ちょっと問題あり)

2641 ワード

テーマの出所:http://www.nowcoder.com/pat/6/problem/4051
タイトルの説明
      K       L,      L  K     。  :  L 1→2→3→4→5→6,K 3,      

3→2→1→6→5→4;  K 4,      4→3→2→1→5→6,     K      。

説明を入力:
      1     。       1    1      、        N(<= 105)、     K(<=N),      

       。      5     ,NULL   -1  。



    N ,     :



Address Data Next



  Address     ,Data           ,Next        。

出力の説明:
       ,          ,         ,       。

入力例:
00100 6 4

00000 4 99999

00100 1 12309

68237 6 -1

33218 3 00000

99999 5 68237

12309 2 33218

出力例:
00000 4 33218

33218 3 12309

12309 2 00100

00100 1 99999

99999 5 68237

68237 6 -1
アルゴリズムの考え方ははっきりしています.
1:構造体配列を用いて初めて情報を格納し、その後、アドレス情報に基づいて双方向チェーンテーブルのチェーンテーブル形式に直列に接続し、最後に反転長値に基づいて対応情報を出力する.しかし明らかにタイムアウトしており、構造体チェーンテーブルに直列する際の時間的複雑度O(n^2)である.
2:次に検索方法を修正し,Mapを用いて保存し,アドレス順に別の構造体配列に格納し,反転長さに応じて情報を出力する.
結局タイムアウトです.
3:ネット上の考えを参考にして、3組の1次元int配列を使用して保存し、アドレスは5ビットであるため、アドレス情報は単独で保存する必要はなく、変更アドレスに対応する情報を直接そのアドレスとしてマークされた配列位置に存在させ、その後、ヘッダheadとnext配列に基づいてリスト配列にアドレス情報を順次保存し、その後、反転長さに基づいて情報を出力する.今回はタイムアウトしていませんが、2つのテストポイントが合格していません.長い間変更しても合格していません.大神たちに見てもらいたいのですが、どこの問題ですか.
#include
#include
using namespace std;
int main()
{
        int head,N,len,n;
        int i,j;
        int val[100001]={0};
        int next[100001]={0};
        int list[100001]={0};
        int final[100001]={0};
        cin>>head>>N>>len;
        for(i=1;i<=N;i++)
        {
                int link;
                cin>>link;
                cin>>val[link]>>next[link];
        }
        n=1;
        while(head!=-1)
        {
                list[n]=head;
                head=next[head];
                n++;
        }
        int low=0;
        n--;
        while(low+len<=n)
        {
                for(j=low+len;j>low+1;j--)
                {
                      printf("%05d %d %05d
",list[j],val[list[j]],list[j-1]); } printf("%05d %d ",list[j],val[list[j]]); low+=len; if(low==n) { printf("%d
",-1); break; } else if(low+len>n) { printf("%05d
",list[low+1]); for(j=low+1;j