和集
2006-11-08 12:20 老博客哈 阅读(655) 评论(0) 收藏 举报 /*
/* http://acm.hnu.cn:8080/online/?action=problem&type=show&id=10181
http://acm.hnu.cn:8080/online/?action=problem&type=show&id=10181 */
*/ #include <cstdio>
#include <cstdio> #include <cstdlib>
#include <cstdlib>
 using namespace std;
using namespace std;
 struct s
struct s {
{ int a;        //前一个操作数的下标
    int a;        //前一个操作数的下标 int b;        //后一个操作数的下标
    int b;        //后一个操作数的下标 int value;    //存储操作后的值
    int value;    //存储操作后的值 };
};
 int n;
int n; s sub1[499501];
s sub1[499501]; s sub2[499501];
s sub2[499501]; int data[1001];
int data[1001]; int num = 0;
int num = 0;
 int comp(const void* aa, const void* bb) {
int comp(const void* aa, const void* bb) { struct s* a= (s*)aa;
    struct s* a= (s*)aa; struct s* b = (s*)bb;
    struct s* b = (s*)bb; return a->value - b->value;
    return a->value - b->value; }
}
 int FindSub2(int start, int end, int value)
int FindSub2(int start, int end, int value) {
{ int left = start;
    int left = start;  int right = end - 1;
    int right = end - 1; int mid;
    int mid; while( left <= right )
    while( left <= right ) {
    { mid = (left + right) / 2;
        mid = (left + right) / 2; if( sub2[mid].value == value )
        if( sub2[mid].value == value ) return mid;
            return mid; else if( sub2[mid].value > value )
        else if( sub2[mid].value > value ) right = mid - 1;
            right = mid - 1; else
        else  left = mid + 1;
            left = mid + 1; }
    } return -1;
    return -1; }
}

 void ReadInfo()
void ReadInfo() {
{ for(int i = 0; i < n; i++)
    for(int i = 0; i < n; i++) {
    { scanf("%d",&data[i]);
        scanf("%d",&data[i]); }
    } }
}
 //存储+, -的值
//存储+, -的值  void StoreValue()
void StoreValue() {
{ int i, j;
    int i, j; num = 0;
    num = 0; for(i = 0; i < n; i++)
    for(i = 0; i < n; i++) {
    { for(j = i + 1; j < n; j++)
        for(j = i + 1; j < n; j++) {
        { sub1[num].a = i;
            sub1[num].a = i; sub1[num].b = j;
            sub1[num].b = j; sub1[num].value = data[i] + data[j];
            sub1[num].value = data[i] + data[j]; int tmpi, tmpj;
            int tmpi, tmpj; if(data[i] > data[j])
            if(data[i] > data[j]) tmpi = i, tmpj = j;
                tmpi = i, tmpj = j; else
            else tmpi = j, tmpj = i;
                tmpi = j, tmpj = i; sub2[num].a = tmpi;
            sub2[num].a = tmpi; sub2[num].b = tmpj;
            sub2[num].b = tmpj; sub2[num].value = data[tmpi] - data[tmpj];
            sub2[num].value = data[tmpi] - data[tmpj]; num++;
            num++; }
        } }
    } }
}
 int FindD()
int FindD() {
{ int i, j;
    int i, j; int max = -0x7FFFFFFF;
    int max = -0x7FFFFFFF;
 qsort(sub1,num,sizeof(struct s),comp);
    qsort(sub1,num,sizeof(struct s),comp); qsort(sub2, num, sizeof(struct s),comp);
    qsort(sub2, num, sizeof(struct s),comp); int start = 0;
    int start = 0; for(i = 0; i < num; i++)
    for(i = 0; i < num; i++) {
    { while(start < num && sub2[start].value < sub1[i].value)
        while(start < num && sub2[start].value < sub1[i].value)  start++;
            start++; if(start >= num)
        if(start >= num) break;
            break; int index = FindSub2(start, num, sub1[i].value);
        int index = FindSub2(start, num, sub1[i].value); if(index == -1)
        if(index == -1) continue;
            continue; if(sub2[index].a == sub1[i].a || sub2[index].a == sub1[i].b
        if(sub2[index].a == sub1[i].a || sub2[index].a == sub1[i].b  || sub2[index].b == sub1[i].a ||sub2[index].b == sub1[i].b)
            || sub2[index].b == sub1[i].a ||sub2[index].b == sub1[i].b) continue;
            continue; if(max < data[ sub2[index].a ])
        if(max < data[ sub2[index].a ]) max = data[ sub2[index].a ];
            max = data[ sub2[index].a ]; }
    }
 return max;
    return max; }
}
 int main()
int main() {
{ int i, j;
    int i, j; while( scanf("%d",&n) != EOF && n)
    while( scanf("%d",&n) != EOF && n) {
    { ReadInfo();
        ReadInfo(); StoreValue();
        StoreValue(); int d = FindD();
        int d = FindD(); if( d == -0x7FFFFFFF )
        if( d == -0x7FFFFFFF ) printf( "no solution\n");
            printf( "no solution\n"); else
        else printf("%d\n",d);
            printf("%d\n",d); }
    }
 return 0;
    return 0; }
}刚开始使用的是lower_bound,目测大约有10秒以上,自己写了一个二分,一下快多了。听kaikai说,STL在debug和release相差的很多,汗。。。
 
                    
                     
                    
                 
                    
                

 
     
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号