| ||||||||||
| 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 | |||||||||
Re:过了。。。贴代码得瑟一下~~欢迎提出修改建议!In Reply To:过了。。。贴代码得瑟一下~~欢迎提出修改建议! Posted by:zhangjixyz at 2010-01-13 21:44:17 > #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
>
> typedef struct d{
>
> int value;
>
> long int start_loc;
>
> long int end_loc;
>
> }DATA;
>
> int get_value(DATA data[] , int loc){
>
> int i;
>
> for (i = 0 ; data[i].value != -1 ; i++){
>
> if(loc >= data[i].start_loc && loc <= data[i].end_loc) break;
>
> }
>
> return data[i].value;
>
> }
>
> int calculate(int val1 , int val2 , int result){
>
> int x;
>
> if (val1 >= val2) x = val1 - val2;
>
> else x = val2 - val1;
>
> if (x > result) return x;
>
> else return result;
>
> }
>
> int get_det(DATA data[] , long int n , long int loc , long int len){
>
> int result = 0 , loc_val = get_value(data,loc);
>
> if (loc - n >= 0) result = calculate(get_value(data,loc - n) , loc_val , result);
>
> if (loc + n <= len) result = calculate(get_value(data,loc + n) , loc_val , result);
>
> if (loc % n != 0){
>
> if (loc - 1 >= 0) result = calculate(get_value(data,loc - 1) , loc_val , result);
>
> if (loc - n - 1 >= 0) result = calculate(get_value(data,loc - n - 1) , loc_val , result);
>
> if (loc + n - 1 <= len) result = calculate(get_value(data,loc + n - 1) , loc_val , result);
>
> }
>
> if ((loc + 1) % n != 0){
>
> if (loc + 1 <= len) result = calculate(get_value(data,loc + 1) , loc_val , result);
>
> if (loc - n + 1 >= 0) result = calculate(get_value(data,loc - n + 1) , loc_val , result);
>
> if (loc + n + 1 <= len) result = calculate(get_value(data,loc + n + 1) , loc_val , result);
>
> }
>
> return result;
>
> }
>
> void sift(long int endpoint[] , int low , int high){
>
> int i = low , j = 2 * i;
>
> long int tmp = endpoint[i];
>
> while (j <= high){
>
> if (j < high && endpoint[j] > endpoint[j + 1]) j++;
>
> if (tmp > endpoint[j]){
>
> endpoint[i] = endpoint[j];
>
> i = j;
>
> j = 2 * i;
>
> }
>
> else break;
>
> }
>
> endpoint[i] = tmp;
>
> }
>
> void Heapsort(long int endpoint[] , long int sorted_ep[] , int n){
>
> long int tmp;
>
> int i , se_top = 0;
>
> for (i = n / 2 ; i >= 1 ; i--) sift(endpoint , i , n);
>
> for (i = n ; i >= 2 ; i--){
>
> tmp = endpoint[1];
>
> endpoint[1] = endpoint[i];
>
> endpoint[i] = tmp;
>
> sift(endpoint , 1 , i - 1);
>
> if (se_top == 0) sorted_ep[se_top++] = tmp;
>
> else if (tmp != sorted_ep[se_top - 1]) sorted_ep[se_top++] = tmp;
>
> }
>
> if (endpoint[1] != sorted_ep[se_top - 1]) sorted_ep[se_top++] = endpoint[1];
>
> }
>
> int main(){
>
> DATA data[1005];
>
> int count , ep_top , i , value , det_value;
>
> long int n , len , m , endpoint[6000] , sorted_ep[6000] , num;
>
> while (1){
>
> scanf("%ld",&n);
>
> if (n == 0) break;
>
> len = -1;
>
> count = -1;
>
> memset(data,-1,sizeof(data));
>
> memset(endpoint,-1,sizeof(endpoint));
>
> memset(sorted_ep,-1,sizeof(sorted_ep));
>
> while (1){
>
> scanf("%d %ld",&value,&m);
>
> if (value == 0 && m == 0) break;
>
> count++;
>
> data[count].value = value;
>
> len++;
>
> data[count].start_loc = len;
>
> len += (m - 1);
>
> data[count].end_loc = len;
>
> }
>
> for (i = 0 , ep_top = 1 ; data[i].value != -1 ; i++){
>
> endpoint[ep_top++] = data[i].start_loc;
>
> if (data[i].start_loc - n >= 0 && get_value(data,data[i].start_loc - n) != -1) endpoint[ep_top++] = data[i].start_loc - n;
>
> if (data[i].start_loc + n <= 1000000000 && get_value(data,data[i].start_loc + n) != -1) endpoint[ep_top++] = data[i].start_loc + n;
>
> endpoint[ep_top++] = data[i].end_loc;
>
> if (data[i].end_loc - n >= 0 && get_value(data,data[i].end_loc - n) != -1) endpoint[ep_top++] = data[i].end_loc - n;
>
> if (data[i].end_loc + n <= 1000000000 && get_value(data,data[i].end_loc + n) != -1) endpoint[ep_top++] = data[i].end_loc + n;
>
> }
>
> Heapsort(endpoint , sorted_ep , ep_top - 1);
>
> /*for (i = 1 ; endpoint[i] != -1 ; i++) printf(" %-ld",endpoint[i]);
>
> printf("\n");
>
> for (i = 0 ; sorted_ep[i] != -1 ; i++) printf(" %-ld",sorted_ep[i]);
>
> printf("\n");
>
> printf("%ld\n",len);*/
>
> printf("%ld\n",n);
>
> det_value = get_det(data , n , sorted_ep[0] , len);
>
> num = 1;
>
> for (i = 1 ; sorted_ep[i] != -1 ; i++){
>
> if (sorted_ep[i] - sorted_ep[i - 1] > 1){
>
> if (det_value != get_det(data , n , sorted_ep[i] - 1 , len)){
>
> printf("%d %ld\n",det_value,num);
>
> det_value = get_det(data , n , sorted_ep[i] - 1 , len);
>
> num = sorted_ep[i] - sorted_ep[i - 1] - 1;
>
> }
>
> else{
>
> num += (sorted_ep[i] - sorted_ep[i - 1] - 1);
>
> }
>
> }
>
> if (det_value != get_det(data , n , sorted_ep[i] , len)){
>
> printf("%d %ld\n",det_value,num);
>
> det_value = get_det(data , n , sorted_ep[i] , len);
>
> num = 1;
>
> }
>
> else{
>
> num++;
>
> }
>
> }
>
> printf("%d %ld\n",det_value,num);
>
> printf("0 0\n");
>
> }
>
> printf("0\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