hdu 4334 Trouble

这题比赛的时候不是TLE就是是MLE,各种蛋疼……尝试了hash , 二分查找,map都TLE了


比完赛,发现时我们的hash有一点写错了,改完就ac了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>


using namespace std;

typedef long long ll;

ll set[5][210];
ll tab[400010];
const int mm=1000007;

struct HashTbale
{
    int size,h[mm],p[44444];
    ll s[44444];
    void insert(ll x)
    {
        int i,id=(x%mm+mm)%mm;  // 比赛的后就错在这了,写成了 id=x%mm 万一x为负数,那么id也为负数了
        for(i=h[id];i>=0;i=p[i])
            if(s[i]==x)return;
        s[size]=x,p[size]=h[id],h[id]=size++;
        return ;
    }
    int find(ll x)
    {
        int i,id=(x%mm+mm)%mm;
        for(i=h[id];i>=0;i=p[i])
            if(s[i]==x)return 1;
        return 0;
    }
    void clear()
    {
        size=0;
        memset(h,-1,sizeof(h));
    }
}g;

int main()
{
    int ca,n,cas=1;
    scanf("%d",&ca);
    while(ca--)
    {
        scanf("%d",&n);

        for(int i=0;i<5;i++)
        for(int j=0;j<n;j++)
        {
            scanf("%I64d",&set[i][j]);
            if(i>=2) set[i][j]=-set[i][j];
        }
        g.clear();
        int cnt=0;
        for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        {
            tab[cnt++]=set[0][i]+set[1][j];
            g.insert(set[0][i]+set[1][j]);
        }

        sort(tab,tab+cnt);
        int k=1;
        for(int i=1;i<cnt;i++)
         if(tab[i]!=tab[k-1]) tab[k++]=tab[i];

        sort(set[2],set[2]+n);
        sort(set[3],set[3]+n);
        sort(set[4],set[4]+n);

        bool ok=1;

        for(int i=0;i<n&&ok;i++)
        {
          if(set[2][i]+set[3][n-1]+set[4][n-1]>=tab[0]&&set[2][i]+set[3][0]+set[4][0]<=tab[k-1])
           for(int j=0;j<n&&ok;j++)
            if(set[2][i]+set[3][j]+set[4][n-1]>=tab[0]&&set[2][i]+set[3][j]+set[4][0]<=tab[k-1])
             for(int r=0;r<n&&ok&&(set[2][i]+set[3][j]+set[4][r])<=tab[k-1];r++)
              if((set[2][i]+set[3][j]+set[4][r])>=tab[0]&&g.find(set[2][i]+set[3][j]+set[4][r])) ok=0;
        }
        puts(ok?"No":"Yes");

    }
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值