并查集和二分查找

2021寒假集训Day 2-3

昨天忘写博客了,今天就一块写了吧。
昨天学了并查集,一个第一次接触让我头皮发麻的东西。中文看得懂,一看代码直接倒下。但是经过网上资料的搜索,我对并查集有了初步的了解。emmmm直接放个例题吧。
在这里插入图片描述

#include<bits/stdc++.h>
#pragma warning(disable:4996)
using namespace std;
const int MAXN = 1e5 + 10;
const int inf = 0x3f3f3f3f;
int fa[MAXN],sum;
int find(int x)
{
    if (fa[x] != x)
        fa[x] = find(fa[x]);
    return fa[x];
}
void hb(int a, int b) {
    int r1 = find(a);
    int r2 = find(b);
    if (r1 != r2) {
        fa[r2] = r1;
        sum--;
    }
}
int main()
{
    int t;
    int n, m, i;
    scanf("%d", &t);
    while (t--) {
        scanf("%d %d", &n, &m);
        for (i = 1; i <= n; i++)
            fa[i] = i;
        sum = n;
        for (i = 1; i <= m; i++)
        {
            int k, j;
            scanf("%d %d", &k,&j);
            hb(k, j);
        }
        printf("%d\n",sum);
    }
 }

然后今天是学了二分查找,因为有高中的基础在,相对比较轻松,但是被一道题目折磨了很久。
在这里插入图片描述
错误总结:1.数组开太小。2.数字太大爆int。3.二分查找条件判断错误。
最后的代码:

#include<algorithm>
#include<iostream>
#include<math.h>
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
using namespace std;
const int MAXN = 1e5 + 10;
const int inf = 0x3f3f3f3f;
const double eps = 1e-6;
int n;
long long a[MAXN], b[MAXN], c[MAXN],d[MAXN];
long long ab[20000009], cd[20000009];
long long h=0;
int  main()
{
    int t, i, j, l, r, mid,ans=0;
    scanf("%d",&n);
    for (i = 0; i < n;i++) {
        scanf("%lld %lld %lld %lld",&a[i], &b[i], &c[i], &d[i]);
    }
    for (i = 0; i < n; i++){
        for (j = 0; j < n; j++) {
            ab[h] = a[i] + b[j];
            cd[h] = c[i] + d[j];
            h++;
        }
    }
    sort(ab, ab + h);
    sort(cd, cd + h);
    for (i = 0;i<h; i++) {
        l = 0;
        r = h - 1;
        while(l <=r) {
            mid = (l + r)/ 2;
            if (cd[mid] == -ab[i]) {
                ans++;
                for (j = mid-1; j >=l;j--) {
                    if (cd[j] == -ab[i])
                        ans++;
                    else
                        break;
                }
                for (j = mid + 1; j <=r; j++) {
                    if (cd[j] == -ab[i])
                        ans++;
                    else
                        break;
                }
                break;
            }
            else if (cd[mid] >-ab[i])
                r = mid - 1;
            else
                l = mid+1;
        }
    }
    printf("%d",ans);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值