Untitled
unknown
c_cpp
3 years ago
2.1 kB
8
Indexable
#include <stdio.h>
#include <stdlib.h>
typedef struct _Node{
int number, age;
struct _Node* prev;
struct _Node* next;
}Node;
typedef struct sequence{
int index;
int age;
Node* pos;
}seq;
Node* head;
seq sorted[500005];
int compare(const void *a, const void *b){
seq A = *(seq*)a;
seq B = *(seq*)b;
if(A.age > B.age) return 1;
else if(A.age == B.age && A.index > B.index){
return 1;
}
else return -1;
}
Node* createList(int n){
Node* pre = NULL;
Node* init;
Node* nd;
for(int i = 0; i < n; i++){
nd = (Node*)malloc(sizeof(Node)*1);
if(i == 0) init = nd;
scanf("%d", &nd->age);
sorted[i].age = nd->age;
sorted[i].index = i;
sorted[i].pos = nd;
nd->number = i;
nd->prev = pre;
if(nd->prev != NULL) nd->prev->next = nd;
pre = nd;
}
nd->next = init;
init->prev = nd;
qsort(sorted, n, sizeof(seq), compare);
return init;
}
Node* solve(int n, int m){
int a, k;
char dir;
Node* init = head;
for(int i = 0; i < m; i++){
scanf("%d%d %c", &a, &k, &dir);
Node *find, *tmp;
find = sorted[a-1].pos;
k = k % (n-1);
if(k == 0) continue;
find->prev->next = find->next;
find->next->prev = find->prev;
tmp = find;
if(dir == 'R'){
for(int i = 0; i < k; i++){
tmp = tmp->next;//預計要換到的位置
}
}
else{
for(int i = 0; i <= k; i++){
tmp = tmp->prev;
}
}
find->next = tmp->next;
tmp->next = find;
find->prev = tmp;
find->next->prev = find;
}
init = sorted[0].pos;
return init;
}
int main(){
int n, k;
scanf("%d%d", &n, &k);
head = createList(n);
Node *p = solve(n, k);
for(int i = 0; i < n; i ++){
printf("%d ", p -> age);
p = p -> next;
}
printf("\n");
return 0;
}Editor is loading...