時間限制: 2 sec 記憶體限制: 32 mb
題目描述
在東秦綜合樓的深處,有實驗室檢查各種材料的機械和電學效能。你受蔡老闆所託為乙個在實驗室中處理樣品的機械人編寫軟體。在傳送帶上有材料樣本,樣品有不同的高度,可能給下乙個處理單元帶來麻煩。為了消除這些麻煩,我們需要把樣品按高度排序到公升序。重新排序是由乙個機械機械臂完成的,它能夠拾取任意數量的連續樣本,並將它們旋轉,使它們的相互次序顛倒。換句話說就是,每次找到最小樣品的位置 p,將 1~p 所有樣品顛倒,然後往下處理,直到排好序。圖為 6 個樣品的簡單示例。最小的是在第 4 個位置,因此,機械人手臂顛倒前 4 個樣本。第二個最小的樣本是最後乙個,所以下乙個機械人操作將顛倒 2~5,第三步是顛倒 3~4,以此類推。你的任務是找到正確的反轉操作序列,用上述演算法對樣本進行排序。如果有相同高度的樣品,它們的相互次序必須保持。
輸入多組資料輸入。每組輸入資料報括兩行,第一行為乙個整數 n(1<=n<=100000),表示樣本的數量,第二行為 n 個整數,表示樣本的高度和他們的初始順序,用空格分隔。輸入結束於 0(自成一行)。
輸出對每組輸入資料,輸出一行 n 個整數 p1,p2,p3,...,pn,用空格分隔。每個 pi 表示在第 i 次顛倒操作之前第 i 小的樣品的位置。
第四屆「圖靈杯」neuq-acm 程式設計競賽(團隊賽)
樣例輸入
3 4 5 1 6 2
3 3 2 1
樣例輸出
4 6 4 5 6 6
4 2 4 4
spaly翻轉題,首先記錄id並排序,每次把最小的數的id提到根節點。若此id的無左子樹,直接刪除此結點,並把右兒子做為新根結點;若有,選此id的左子樹的最右結點作為新的根結點。
**:#include#include#include#includeusing namespace std;
const int inf=0x5f5f5f5f;
const int n=100005;
int root,tot;
int sz[n],pre[n],ch[n][2],rev[n];
bool which_son(int o)
void update_rev(int o)
void push_up(int o)
void push_down(int o)
}void build(int &o,int l,int r,int fa)
void init(int n)
void rotate(int o,int d)
void splay(int o,int goal)
else
else
}} push_up(o);
if(goal==0)
root=o;
}int get_max(int o)
return o;
}void remove()
else
}struct node{
int v,id;
bool operator<(const node rhs) const{
if (v==rhs.v) return id
排序機械臂 splay
給定乙個長度為n的序列,需要進行n次交換操作.第i次操作需要將區間 i,pi 進行翻轉,其中pi表示序列第i小的數字的下標.特別的,如果序列中有重複的元素,則認為在初始序列中下標小的數字更小.題目中由於涉及到了區間翻轉,我們應當聯想到是否可以採用 平衡樹 解決該問題.首先有個疑問,我們應當如何維護序...
編寫簡單的六軸機械臂
二 步驟 1.在ros工作空間中,建立乙個包。catkin create pkg myurdf controller manager joint state controller robot state publisher 2.在包裡新建乙個資料夾儲存urdf檔案。mkdir robot 3.建立u...
Splay樹簡單操作
前幾天剛剛自學了一下splay,發現思路真簡單實現起來好麻煩 先貼一下頭檔案 include include include include define ll long long define rg register 卡常 define il inline 再卡常 define un unsign...