摘要:中途相遇。对比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. Linux下搭建VPN服务器(CentOS、pptp)转

    先说我搭建过程中出现的问题吧: 按照 教程搭建好之后出现了619错误,查看日志:/var/log/messages: Nov 20 09:46:20 localhost pptpd[7498]: GR ...

  2. 入门:PHP:hello world!

    <?php echo 'hello'."\n"." world!"."good night!";//2016.09.18 22:57? ...

  3. Opencv step by step - 鼠标事件

    鼠标事件有下面几种(没有滚轮事件,比较遗憾): #define CV_EVENT_MOUSEMOVE 0 滑动 #define CV_EVENT_LBUTTONDOWN 1 左键点击 #define ...

  4. Python脚本传參和Python中调用mysqldump

    Python脚本传參和Python中调用mysqldump<pre name="code" class="python">#coding=utf-8 ...

  5. LeetCode之Min Stack

    1.原文问题描述: Design a stack that supports push, pop, top, and retrieving the minimum element in constan ...

  6. Linux命令 文件的建立移动删除

    cat [功能说明] 建立文件  #cat命令用来串接文件或显示文件内容的但是如果从标准输入设备中读入数据并将结果重定向到一个新的文件中,则可以到达建立新文件的目的.Cat命令只能在编辑新的文件时只能 ...

  7. C++ list forward_list

    list,forward_list list:双向链表 forward_list:单向链表 在任何位置添加元素,删除元素都很快,但随机访问元素则很慢 声明和初始化 list<T> l; l ...

  8. Win7 VS2017 NASM编译FFMPEG(2018.12.22)

    今天无意中在gayhub发现个牛逼工程,全VS工程编译FFMPEG库,包括依赖库全是VS生成的,无需Mingw等Linux环境. 简单记录下过程,以防将来重装系统等情况,备忘. https://git ...

  9. POJ1275 Cashier Employment(差分约束)

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9078   Accepted: 3515 Description A sup ...

  10. K均值

    K-means算法的工作流程 首先,随机确定k个初始点的质心:然后将数据集中的每一个点分配到一个簇中,即为每一个点找到距其最近的质心,并将其分配给该质心所对应的簇:该步完成后,每一个簇的质心更新为该簇 ...