Untitled

 avatar
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...