#include #include #include #include #define NAME_LEN 508 typedef struct { long tag1; long tag2; char name1[NAME_LEN]; char name2[NAME_LEN]; } CacheHog; int main(int argc) { int i, j, numHogs, numInv1 = 0, numInv2 = 0; int tileSize, iBase, iLim, jBase, jLim; CacheHog *vals; scanf("%d %d", &numHogs, &tileSize); vals = calloc(sizeof(CacheHog), numHogs); for (i = 0; i < numHogs; i++) { vals[i].tag1 = numHogs - i; vals[i].tag2 = numHogs + i; } for (iBase = 0; iBase < numHogs; iBase = iLim) { iLim = iBase + tileSize < numHogs ? iBase + tileSize : numHogs; // Check within the tile for (i = iBase; i < iLim; i++) for (j = i+1; j < iLim; j++) { if (vals[i].tag1 > vals[j].tag1) numInv1++; if (vals[i].tag2 > vals[j].tag2) numInv2++; } // Check all following tiles, exhausting each completely wrt tile i for (jBase = iLim; jBase < numHogs; jBase = jLim) { jLim = jBase + tileSize < numHogs ? jBase + tileSize : numHogs; for (i = iBase; i < iLim; i++) for (j = jBase; j < jLim; j++) { if (vals[i].tag1 > vals[j].tag1) numInv1++; if (vals[i].tag2 > vals[j].tag2) numInv2++; } } } printf("Inversion counts: %d %d \n", numInv1, numInv2); free(vals); return 0; }