跳舞鏈 nyist511 小球移動

2021-07-29 16:00:43 字數 743 閱讀 1708

題目傳送門:

跳舞鏈是帶哨兵節點的雙向迴圈鍊錶,更加優美的形式是將該鍊錶用靜態鍊錶的形式實現,使得查詢,刪除和恢復操作的時間複雜度均為o(1)

#include 

#include

using

namespace

std;

const

int max = 10010;

int data[max], left[max], right[max];

int t,n,m;

//初始化,下標為0的結點為哨兵結點

void init()

data[0] = 0; right[0] = 1; left[0] = n;

data[n] = n; right[n] = 0; left[n] = n - 1;

return ;

}void moveb(int a, int b, int tag)

else

// 「跳舞」,跳舞鏈因此得名

left[right[a]] = a;

right[left[a]] = a;

return ;

}inline

int query(int a, int tag)

else

}int main()

if (c == 'b')

if (c == 'q') }}

return

0;}

NYOJ 511 移動小球

這道題很容易想到要構建乙個迴圈鍊錶來確定每個球的相對位置,就是操作比較繁瑣,考慮情況較多。首先要建立節點node,每個節點都有乙個初始順序order,指向左邊的node 指標left,何指向右邊的node 指標right。cpp view plain copy print?struct node n...

ny511 移動小球

時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述給你n個小球,從左到右編號依次為1,2,3,4,5,6.n,並規定小球1的左邊的球號為n,小球n的右邊的球號為1.現在有以下3種操作 a x y表示把編號為x小球移動到編號為y的小球的左邊,b x y表示把編號為x小球移動到編號為...

NYOJ 511 移動小球 模擬

解題思路 先預處理一下左右陣列,使他們滿足初始時候的左右鄰居。然後模擬移動即可。這裡需要注意的就是移動時改變左右鄰居時,要防止覆蓋問題。就是我更改某個鄰居後,不能在以後的修改中影響這個值,所以順序需要注意。在這裡錯了,找了半個小時。悲劇。如下 include include include incl...