摘要:中途相遇。对比map,快排+二分查找,Hash效率。

n是4000的级别,直接O(n^4)肯定超,所以中途相遇法,O(n^2)的时间枚举其中两个的和,O(n^2)的时间枚举其他两个的和的相反数,然后O(logN)的时间查询是否存在。

首先试了下map,果断TLE

//TLE
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;

;
][maxn];

map<int,int> cnt;

int main()
{

    int T ; scanf("%d",&T);
    ], *B = data[], *C = data[],*D = data[];
    map<int,int>::iterator it;
    while(T--){
        int n; scanf("%d",&n);
        ; i < n; i++){
            scanf("%d%d%d%d",A+i,B+i,C+i,D+i);
        }

        ; i < n; i++)
        ; j < n; j++){
            cnt[A[i]+B[j]]++;
        }

        ;
        ; i < n; i++)
        ; j < n; j++){
            int tmp = -C[i]-D[j];
            it = cnt.find(tmp);
            if(it!=cnt.end()) ans += it->second;
        }
        printf("%d\n",ans);
        if(T) putchar('\n');
    }

    ;
}

map,TLE

然后改成了快排+二分查找,4920ms

// runtime 4920ms
#include<cstdio>
#include<algorithm>
using namespace std;

;
][maxn];
int vec[maxn*maxn];

int _lower_bound(int *A,int L,int R,int v)
{
    int m;
    while(L<R){
        m = (L+R)>>;
        if(A[m]>=v) R = m;
        ;
    }
    return L;
}

int _upper_bound(int *A,int L,int R,int v)
{
    int m;
    while(L<R){
        m = (L+R)>>;
        if(A[m]>v) R = m;
        ;
    }
    return L;
}

int main()
{

    int T ; scanf("%d",&T);
    ], *B = data[], *C = data[],*D = data[];
    while(T--){
        int n; scanf("%d",&n);
        ; i < n; i++){
            scanf("%d%d%d%d",A+i,B+i,C+i,D+i);
        }

        ;
        ; i < n; i++)
        ; j < n; j++){
            vec[sz++] = A[i]+B[j];
        }
        sort(vec,vec+sz);

        ;
        ; i < n; i++)
        ; j < n; j++){
            int tmp = -(C[i]+D[j]);
            ans +=  _upper_bound(vec,,sz,tmp) - _lower_bound(vec,,sz,tmp);
        }
        printf("%d\n",ans);
        if(T) putchar('\n');
    }

    ;
}

快拍+二分,4920ms

实际上没有必要每次二分查找,用两个指针,两边都从最小的数开始比较。

快排+计数,2832ms

#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
typedef pair<int,int> pii;
#define fi first
#define se second
;
][maxn];

pii cnt1[maxn*maxn];
pii cnt2[maxn*maxn];
int vec[maxn*maxn];

int main()
{
    int T ; scanf("%d",&T);
    ], *B = data[], *C = data[],*D = data[];
    while(T--){
        int n; scanf("%d",&n);
        ; i < n; i++){
            scanf("%d%d%d%d",A+i,B+i,C+i,D+i);
        }
        ;
        ; i < n; i++)
        ; j < n; j++){
            vec[sz++] = A[i]+B[j];
        }
        sort(vec,vec+sz);
        ;
        cnt1[len1] = pii(vec[len1],);
        ; i < sz; i++){
            if(vec[i] == cnt1[len1].fi) cnt1[len1].se++;
            ; }
        }
        sz = ;
        ; i < n; i++)
        ; j < n; j++){
            vec[sz++] = -C[i]-D[j];
        }
        sort(vec,vec+sz);
        ;
        cnt2[len2] = pii(vec[len2],);
        ; i < sz; i++){
            if(vec[i] == cnt2[len2].fi) cnt2[len2].se++;
            ; }
        }

        ,q = ,ans = ;
        while(p<=len1&&q<=len2){
            if(cnt1[p].fi == cnt2[q].fi){
                ans += cnt1[p++].se*cnt2[q++].se;
            }else if(cnt1[p].fi>cnt2[q].fi) q++;
                  else p++;
        }
        printf("%d\n",ans);
        if(T) putchar('\n');
    }

    ;
}

快排+计数

还有Hash表,写挂了,待补。。。

UVA 1152 4 Values Whose Sum is Zero 和为0的4个值 (中途相遇)的更多相关文章

  1. UVA 1152 4 Values whose Sum is 0 (枚举+中途相遇法)(+Java版)(Java手撕快排+二分)

    4 Values whose Sum is 0 题目链接:https://cn.vjudge.net/problem/UVA-1152 ——每天在线,欢迎留言谈论. 题目大意: 给定4个n(1< ...

  2. uva 1152 4 values whose sum is zero ——yhx

    The SUM problem can be formulated as follows: given four lists A;B;C;D of integer values, computehow ...

  3. UVa 1152 4 Values whose Sum is 0

    题意:给出n,四个集合a,b,c,d每个集合分别有n个数,分别从a,b,c,d中选取一个数相加,问使得a+b+c+d=0的选法有多少种 看的紫书,先试着用hash写了一下, 是用hash[]记录下来a ...

  4. UVA - 1152 4 Values whose Sum is 0问题分解,二分查找

    题目:点击打开题目链接 思路:暴力循环显然会超时,根据紫书提示,采取问题分解的方法,分成A+B与C+D,然后采取二分查找,复杂度降为O(n2logn) AC代码: #include <bits/ ...

  5. 8-3 4Values Whose Sum is Zero 和为0的四个值

    给定四个n元素集合 ABCD   要求分别从中取一个元素 abcd   使得他们的合为0   问有多少中取法 map果然炸了 #include<bits/stdc++.h> using n ...

  6. K - 4 Values whose Sum is 0(中途相遇法)

    K - 4 Values whose Sum is 0 Crawling in process... Crawling failed Time Limit:9000MS     Memory Limi ...

  7. POJ 2785 4 Values whose Sum is 0(想法题)

    传送门 4 Values whose Sum is 0 Time Limit: 15000MS   Memory Limit: 228000K Total Submissions: 20334   A ...

  8. POJ 2785 4 Values whose Sum is 0

    4 Values whose Sum is 0 Time Limit: 15000MS   Memory Limit: 228000K Total Submissions: 13069   Accep ...

  9. 哈希-4 Values whose Sum is 0 分类: POJ 哈希 2015-08-07 09:51 3人阅读 评论(0) 收藏

    4 Values whose Sum is 0 Time Limit: 15000MS Memory Limit: 228000K Total Submissions: 17875 Accepted: ...

随机推荐

  1. Gradle使用小结

    Gradle是CI过程工具,而不是系统.持续集成过程中的构建.自动化测试.打包.发布都可以使用Gradle来完成.而持续进程过程为我们降低各方面成本,提高产品信心,提高产品质量有着非常重要的作用(不要 ...

  2. require.js 的使用

    一.为什么要用require.js 在同一个页面要加载多个js文件时,浏览器会停止网页渲染,加载文件越多,网页失去响应的时间就会越长: 其次,由于js文件之间存在依赖关系,因此必须严格保证加载顺序(比 ...

  3. 【tips】判断两个整数是否是同一个数量级

    leetcode刷题的时候,需要用到,已知整数A,B,且A>B,判断AB是否是同一数量级的. 第一想到的是不停地除以10,得到每个数字的数量级再进行比较,太麻烦: 转而向转化成字符串比较,还是麻 ...

  4. 费用提前计算相关的DP(BZOJ2037,POJ3042,ZOJ3469)

    在刷ZeroClock大神的区间DP专辑,遇见了ZOJ3469,完全不无从下手,然后有人说是论问题,推荐看徐源盛<对一类动态规划问题的研究>这篇论文,果断得膜拜了下,感觉好神奇,可以把未来 ...

  5. 全表扫描出现db file sequential read

    SESSION 1执行 SQL> update test1 set id=1000; SESSION 2 : select * from test1 如果表上面有大量的行迁链接,会是单块读等待事 ...

  6. HDU_2058——等差数列,子集,集合长度判断

    Problem Description Given a sequence 1,2,3,......N, your job is to calculate all the possible sub-se ...

  7. 放大倍数超5万倍的Memcached DDoS反射攻击,怎么破?

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯游戏云 背景:Memcached攻击创造DDoS攻击流量纪录 近日,利用Memcached服务器实施反射DDoS攻击的事件呈大幅上 ...

  8. git 解决授权失败的方法

    git 提示  fatal: Authentication failed for 'http://***********‘’得解决方法 首先用 git config --list 查看一下 如果不对, ...

  9. Paper | 多任务学习的鼻祖

    目录 1. MTL的定义 2. MTL的机制 2.1. Representation Bias 2.2. Uncorrelated Tasks May Help? 3. MTL的用途 3.1. Usi ...

  10. Java反射+简单工厂模式总结

    除了 new 之外的创建对象的方法 通过 new 创建对象,会使得程序面向实现编程,先举个例子,某个果园里现在有两种水果,一种是苹果,一种是香蕉,有客户想采摘园子里的水果,要求用get()方法表示即可 ...