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;
}