Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
终于AC, 0ms !!!#include <stdio.h> #include <stdlib.h> unsigned int width = 0, height = 0 ; unsigned int pointCnt = 0 ; struct { unsigned int val ; unsigned int cnt ; unsigned int idx ; }rle[1001] ; unsigned int rleCnt = 0; unsigned int edgePoints[9100] = {0} ; unsigned int edgePointCnt = 0 ; unsigned int max(unsigned int a, unsigned int b) { return a > b ? a: b ; } unsigned int diff(unsigned int a, unsigned int b) { return a > b ? (a - b) : (b - a) ; } void swap(unsigned int *a, unsigned int *b) { unsigned int tmp = *a ; *a = *b ; *b = tmp ; } /* 计算变化点周围需要计算的点 */ void egdePointSet(unsigned int changePoint) { if(changePoint >= width + 1) edgePoints[edgePointCnt++] = changePoint - width - 1 ; if(changePoint >= width) edgePoints[edgePointCnt++] = changePoint - width ; if(changePoint >= width - 1) edgePoints[edgePointCnt++] = changePoint - width + 1 ; if(changePoint > 0) edgePoints[edgePointCnt++] = changePoint - 1 ; edgePoints[edgePointCnt++] = changePoint ; if(changePoint + 1 < pointCnt) edgePoints[edgePointCnt++] = changePoint + 1 ; if(changePoint + width - 1 < pointCnt) edgePoints[edgePointCnt++] = changePoint + width - 1 ; if(changePoint + width < pointCnt) edgePoints[edgePointCnt++] = changePoint + width ; if(changePoint + width + 1 < pointCnt) edgePoints[edgePointCnt++] = changePoint + width + 1 ; } /* 获取指定点的边界值 */ unsigned int edgePointValGet(unsigned int point) { unsigned int row = point / width ; unsigned int col = point % width ; unsigned int pointIdx = 0 ; unsigned int maxAbs = 0 ; unsigned int arroundPoints[9] = {0} ; unsigned int arroundPointCnt = 0 ; unsigned int i, j ; if(row > 0) { if(col > 0) arroundPoints[arroundPointCnt++] = point - width - 1 ; arroundPoints[arroundPointCnt++] = point - width ; if(col + 1 < width) arroundPoints[arroundPointCnt++] = point - width + 1 ; } if(col > 0) arroundPoints[arroundPointCnt++] = point - 1 ; arroundPoints[arroundPointCnt++] = point ; pointIdx = arroundPointCnt - 1 ; if(col + 1 < width) arroundPoints[arroundPointCnt++] = point + 1 ; if(row < height - 1) { if(col > 0) arroundPoints[arroundPointCnt++] = point + width - 1 ; arroundPoints[arroundPointCnt++] = point + width ; if(col + 1 < width) arroundPoints[arroundPointCnt++] = point + width + 1 ; } j = 1 ; for(i = 0; i < arroundPointCnt; i++) { for(; j < rleCnt; j++) { if(rle[j].idx > arroundPoints[i]) break ; } arroundPoints[i] = rle[j - 1].val ; } for(i = 0; i < arroundPointCnt; i++) maxAbs = max(maxAbs, diff(arroundPoints[pointIdx], arroundPoints[i])) ; return maxAbs ; } void sort(unsigned int *pointArray, unsigned int size) { unsigned int i = 0, j = 0 ; if(size > 2) swap(&pointArray[0], &pointArray[rand() % size]) ; for(j = 1; j < size; j++) { if(pointArray[j] < pointArray[0]) { swap(&pointArray[j], &pointArray[i+1]) ; i++ ; } } swap(&pointArray[0], &pointArray[i]) ; if(i > 1) sort(&pointArray[0], i) ; if(size - i > 2) sort(&pointArray[i+1], size - i - 1) ; } int main(int argc, char *argv[]) { unsigned int i = 0 ; unsigned int lastVal = 0, lastIdx = 0 ; unsigned int tmpVal = 0, tmpIdx = 0 ; while(scanf("%d", &width) && width) { printf("%d\r\n", width) ; rleCnt = 0 ; pointCnt = 0 ; edgePointCnt = 0 ; while(1) { scanf("%d %d", &rle[rleCnt].val, &rle[rleCnt].cnt) ; if((0 == rle[rleCnt].val) && (0 == rle[rleCnt].cnt)) break ; rle[rleCnt].idx = pointCnt ; pointCnt += rle[rleCnt].cnt ; rleCnt++ ; } height = pointCnt / width ; for(i = 0; i < rleCnt; i++) egdePointSet(rle[i].idx) ; egdePointSet(pointCnt - 1) ; sort(edgePoints, edgePointCnt) ; lastVal = edgePointValGet(0) ; lastIdx = 0 ; tmpIdx = lastIdx ; for(i = 0; i < edgePointCnt; i++) { if(edgePoints[i] == tmpIdx) continue ; tmpIdx = edgePoints[i] ; tmpVal = edgePointValGet(edgePoints[i]) ; if(tmpVal != lastVal) { printf("%d %d\r\n", lastVal, edgePoints[i] - lastIdx) ; lastVal = tmpVal ; lastIdx = edgePoints[i] ; } } printf("%d %d\r\n", lastVal, pointCnt - lastIdx) ; printf("0 0\r\n") ; } printf("0\r\n") ; return 0 ; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator