Guest User

Untitled

a guest
Dec 10th, 2024
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.70 KB | Source Code | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct Node {
  5.     struct Node *prev;
  6.     struct Node *next;
  7.     int id;
  8.     int blocks;
  9.     int hasMoved;
  10. };
  11.  
  12. struct Node* createNode(struct Node *prev, struct Node *next, int id, int blocks, int hasMoved) {
  13.     struct Node *node = malloc(sizeof(struct Node));
  14.     node->prev = prev;
  15.     node->next = next;
  16.     node->id = id;
  17.     node->blocks = blocks;
  18.     node->hasMoved = hasMoved;
  19.     return node;
  20. }
  21.  
  22. int main(int argc, char **argv) {
  23.     FILE *fptr = fopen(argv[1], "r");
  24.     struct Node *head = createNode(NULL, NULL, 0, fgetc(fptr)-0x30, 0);
  25.     struct Node *tail = head;
  26.     int i, j, currChar;
  27.  
  28.     for (i = 1; (currChar = fgetc(fptr)) != EOF; i++) {
  29.         if (currChar != '0') {
  30.             tail->next = createNode(tail, NULL, i % 2 == 0 ? i / 2 : -1, currChar - 0x30, 0);
  31.             tail = tail->next;
  32.         }
  33.     }
  34.     fclose(fptr);
  35.  
  36.     struct Node *curr, *tmp;
  37.     while (1) {
  38.         while (tail->id == -1 || tail->hasMoved) {
  39.             tail = tail->prev;
  40.         }
  41.         if (tail == head) {
  42.             break;
  43.         }
  44.  
  45.         curr = head;
  46.         while (curr != tail && (curr->id != -1 || curr->blocks < tail->blocks)) {
  47.             curr = curr->next;
  48.         }
  49.  
  50.         if (curr != tail) {
  51.             curr->prev = createNode(curr->prev, curr, tail->id, tail->blocks, 1);
  52.             curr->prev->prev->next = curr->prev;
  53.             tail->id = -1;
  54.             curr->blocks -= tail->blocks;
  55.  
  56.             // Dealloc zero blocks
  57.             if (curr->blocks == 0) {
  58.                 curr->prev->next = curr->next;
  59.                 curr->next->prev = curr->prev;
  60.                 free(curr);
  61.             }
  62.  
  63.             // Merge free blocks
  64.             if (tail->next && tail->next->id == -1) {
  65.                 tmp = tail->next;
  66.                 tail->blocks += tail->next->blocks;
  67.                 tail->next = tail->next->next;
  68.                 if (tail->next) {
  69.                     tail->next->prev = tail;
  70.                 }
  71.                 free(tmp);
  72.             }
  73.             if (tail->prev && tail->prev->id == -1) {
  74.                 tmp = tail->prev;
  75.                 tail->blocks += tail->prev->blocks;
  76.                 tail->prev = tail->prev->prev;
  77.                 if (tail->prev) {
  78.                     tail->prev->next = tail;
  79.                 }
  80.                 free(tmp);
  81.             }
  82.         }
  83.  
  84.         tail = tail->prev;
  85.     }
  86.  
  87.     unsigned long long sum = 0;
  88.     i = 0;
  89.     curr = head;
  90.     while (curr) {
  91.         for (j = 0; j < curr->blocks; i++, j++) {
  92.             sum += (curr->id == -1 ? 0 : curr->id) * i;
  93.         }
  94.         curr = curr->next;
  95.     }
  96.     printf("%lld\n", sum);
  97.     return 0;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment