Untitled
unknown
c_cpp
2 years ago
2.1 kB
6
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...