HDU 4334 Trouble

和POJ1840有点像,但这里只需判断有没有解,一个简单的hash就可以搞定,以后不能滥用vector,自己手写邻接表。

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#include<vector>



typedef __int64 LL;

const int MAXN = 205;

const LL prime = 1000007;

int head[prime + 3], e, next[MAXN * MAXN];

LL val[MAXN * MAXN];



LL s1[MAXN], s2[MAXN], s3[MAXN], s4[MAXN], s5[MAXN];



int hash(LL sum)

{

    int key;

    if(sum > 0)

        key = (int)(sum % prime);

    else

        key = (int)(-sum % prime);

    return key ;

}



void add(int key, LL sum)

{

    val[e] = sum;

    next[e] = head[key];

    head[key] = e ++;

}



int main(){

    int N, n, i, j, k, key;

    LL sum;

    scanf("%d", &N);

    while(N --)

    {

        scanf("%d", &n);

        for(i = 0; i < n; i ++) scanf("%I64d", &s1[i]);

        for(i = 0; i < n; i ++) scanf("%I64d", &s2[i]);

        for(i = 0; i < n; i ++) scanf("%I64d", &s3[i]);

        for(i = 0; i < n; i ++) scanf("%I64d", &s4[i]);

        for(i = 0; i < n; i ++) scanf("%I64d", &s5[i]);

        memset(head, -1, sizeof head);

        e = 0;

        for(i = 0; i < n; i ++)

            for(j = 0; j < n; j ++)

            {

                sum = s1[i] + s2[j];

                key = hash(sum);

                add(key, sum);

            }



        bool flag = false;

        for(i = 0; i < n && !flag; i ++)

            for(j = 0; j < n && !flag; j ++)

                for(k = 0; k < n; k ++)

                {

                    sum = s3[i] + s4[j] + s5[k];

                    int s = hash(-sum);

                    for(int x = head[s]; x != -1; x = next[x])

                    {

                        if(sum + val[x] == 0)

                            flag = true;

                        if(flag)

                            break ;

                    }

                }

        if(flag)

            printf("Yes\n") ;

        else

            printf("No\n") ;

    }

    return 0 ;

}

 

 

你可能感兴趣的:(HDU)