Luogu P1160 佇列安排

2021-08-03 17:23:17 字數 2993 閱讀 3406

其實鍊錶很早就學過了,但我當時的寫法侷限於陣列模擬,沒有考慮過指標實現(好吧其實當時也就不知道指標這個玩意)但今天突然有人在qq上問我:為什麼用指標實現的鍊錶居然會超時(luogu p1160 佇列安排)!!!然而這個題用陣列模擬就可以過了。

於是我copy了一下她的源**

hljs haskell">#include

#include

using namespace std;

int n,m,p,k,x;

bool b[100001]=;

struct lian;

void show(lian * head)

coutcoutelse

}else

else

}//show(head);

}cin>>m;

for(int i=1;i<=m;i++)

else

else}}

//show(head);

}show(head);

return 0;

}

看完我就震驚了 100多行的 list .

於是就有了乙個指標新手除錯程式的過程。

其實指標還是挺好理解的,大致可以理解為你在乙個變數裡存了乙個位址,這個位址指向了乙個準確的數值,當然也可以指向另乙個指標。通過指標與指標之間的相互操作,我們可以優化很多**。

指標在定義時一般為

hljs cpp">int *x;//定義了乙個int值的指標

/* 其實也可以對結構體定義指標;

*/struct node*list[100],a;//可以定義指標指向結構體

首先,根據題目要求,我需要乙個雙端鍊錶;

而我特別鍾愛於使用結構體

於是就有了先前的定義

hljs perl">struct node

}*list[100100];

然後便開始了模擬的過程,不管三七二十八,先寫了 main 函式。

hljs cpp">int main()

cin>>m;

for(int i=1;i<=m;i++)

outputans();

return

0;}

這裡還差了三樣東西

然後便開始了思考的過程

首先解決插入

由於往乙個數左邊加數和右邊加數完全等價(或者說是逆向操作)

所以只要做出向左邊加數的情況

然後向右加數的時候便可以複製貼上了

重點看**吧,自認為比較易懂

void insert(int num,int i,int op)

list[num]->r=list[i];

list[i]->l=list[num];

}//下面的**是複製過去的,吧 l 和 r 換了一下

if(!op)

list[num]->l=list[i];

list[i]->r=list[num];

}}

這個其實寫過陣列模擬的應該都會

只是稍微注意一下用指標找值的時候用的是「->」

(用慣了結構體的我不知道多少次寫成「.」qaq)

然後是刪除(其實和插入也差不多,每個操作反向來一遍)

hljs cpp">void erase(int num)

if(list[num]->r)

list[num]->l=list[num]->r=null;//刪掉這個點的指標

}

至於輸出時的思路就不在說啦

迴圈跑一邊就過去了

#include

#include

using

namespace

std;

bool b[100100];

struct node

}*list[100100],*temp;

/*用乙個 *list 來存列表

list[1]表示數字1的位置

list[2]表示數字2的位置

以此類推

這樣在 n 左邊或右邊修改時;

直接訪問 list[n] 就好了

少了掃一遍鍊錶的時間

*/int n,m,start;

void insert(int num,int i,int op)

list[num]->r=list[i];

list[i]->l=list[num];

}if(!op)

list[num]->l=list[i];

list[i]->r=list[num];

if(num==start)start=i;

}}void erase(int num)

if(list[num]->r)

list[num]->l=list[num]->r=null;

}int main()

cin>>m;

for(int i=1;i<=m;i++)

node *s=list[start];

while(s)

}

#include

#include

#include

#include

#include

using

namespace

std;

struct nodelist[500500];

int n,m,k,p;

int u;

void output()

cout

void rightadd(int k,int i)

int main()

cin>>m;

for(int i=1;i<=m;i++)

output();

return

0;}

由於是新手,所以指標的**寫的很醜也很長……..

luogu p1160 佇列安排

傳送門 乙個學校裡老師要將班上 n 個同學排成一列,同學被編號為 1 sim n 他採取如下的方法 先將 1 號同學安排進佇列,這時佇列中只有他乙個人 2 n 號同學依次入列,編號為i的同學入列方式為 老師指定編號為i的同學站在編號為 1 sim i 1 中某位同學 即之前已經入列的同學 的左邊或右...

P1160 佇列安排

乙個學校裡老師要將班上n個同學排成一列,同學被編號為1 n,他採取如下的方法 先將1 11號同學安排進佇列,這時佇列中只有他乙個人 2 n 2 n2 n號同學依次入列,編號為i的同學入列方式為 老師指定編號為i的同學站在編號為1 i 1 1 sim i 1 1 i 1 中某位同學 即之前已經入列的同...

P1160 佇列安排

p1160 佇列安排 昨天下午看了一下,感覺肯定要用vector或者佇列,想著自己用的不怎麼好,就沒寫,然後晚上睡不著的時候想到了這題,突然就想到解題辦法了,要不是太晚了我就起床寫了,今天寫了一遍就ac了,哈哈哈 這題比較好玩吧。定義乙個二維陣列,每個數的左右兩個數分別用第二維的陣列0和1存,進行操...