首页 > 其他分享 >P5867 [SEERC2018] Fishermen(暂无评定) 题解

P5867 [SEERC2018] Fishermen(暂无评定) 题解

时间:2023-11-25 22:12:56浏览次数:28  
标签:tmp ma int 题解 P5867 leq 渔夫 Fishermen

题意

有 \(n\) 条鱼,\(m\) 个渔夫,且这 \(m\) 个渔夫都在横坐标轴上,每个渔夫都有一个长度为 \(l\) 的鱼竿,当鱼和渔夫距离小于或等于 \(l\) 时,鱼能被钓到。

并且渔夫 \((x,0)\) 与鱼 \((a,b)\) 的距离(假设为 \(L\) )满足如下公式 \(|a − x| + b\) 式子中 \(x\) 为渔夫的横坐标,\((a,b)\) 为鱼的坐标。

求解思路

这道题肯定以鱼为考虑的对象。先对公式 \(|a - x| + b\) 入手。设 \(l ≤ |a - x| + b\)。

可求出鱼能被钓到时渔夫 \(x\) 的一个范围 \(a+l-b \leq x \leq a-l+b\)。

然后把渔夫的位置排个序,遍历所有的鱼,每一条鱼能够被可以被抓都在 \(x\) 轴有一个范围 \((a+l-b \leq x \leq a-l+b)\)。

通过二分,在渔夫中找到最左的和最右的,然后差分一下,最后求个前缀和就可以得出答案。

代码

#include <bits/stdc++.h>
using namespace std;
typedef  long long ll;
const int maxn = 2e5 + 7;
struct fish {
	int x, y;
} f[maxn];
struct yufu {
	int x, id, idd; ///id表示输入时的序号。idd表示排序之后的序号
	bool operator <(const yufu  &bb)const { ///重载<运算符 为了能够用sort进行排序
		return x < bb.x;
	}
} ma[maxn];
int sum[maxn], ans[maxn];
int main() {
	int n, m, l;
	scanf("%d %d %d", &n, &m, &l);
	memset(sum, 0, sizeof(sum));
	for (int i = 1; i <= n; i++)
		scanf("%d %d", &f[i].x, &f[i].y);
	for (int i = 1; i <= m; i++) {
		scanf("%d", &ma[i].x);
		ma[i].id = i;
	}
	sort(ma + 1, ma + m + 1); ///排序
	for (int i = 1; i <= m; i++)
		ma[i].idd = i;
	for (int i = 1; i <= n; i++) {
		if (f[i].y - l > 0) continue; ///当距离超过l时continue掉
		yufu  tmp;
		tmp.x = f[i].x - l + f[i].y; ///二分法
		int xx = lower_bound(ma + 1, ma + m + 1, tmp) - ma; ///注意一点用这两个函数时,tmp和ma必须是同类型的
		tmp.x = f[i].x + l - f[i].y;
		int yy = upper_bound(ma + 1, ma + m + 1, tmp) - ma;
		sum[xx]++;
		sum[yy]--;
	}
	for (int i = 1; i <= m; i++) { ///用差分法求前缀和
		sum[i] += sum[i - 1];
		ans[ma[i].id] = sum[ma[i].idd];
	}
	for (int i = 1; i <= m; i++) printf("%d\n", ans[i]);
	return 0;
}

标签:tmp,ma,int,题解,P5867,leq,渔夫,Fishermen
From: https://www.cnblogs.com/BadBadBad/p/P5867.html

相关文章

  • AT_pakencamp_2020_day1_f Fibonaccyan(暂无评定) 题解
    题目链接题目大意:给定数\(P\),寻找能把\(P\)整除的最小的斐波那契数,然后输出它是斐波那契数列中的第几个,找不到输出的话就输出-1。分析:主要代码:a[i]=(a[i-1]+a[i-2])%p思路:先将\(a\)数组的第一项和第二项都初始化为1,然后判断是不是能整除\(p\)就行了Code:#incl......
  • P1029 最大公约数和最小公倍数问题(普及−) 题解
    题目传送门想要做这题,我们要先了解一下最大公约数。最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。求最大公约数有多种方法,常见的有质因数分解法、短......
  • Win10无法访问linux上的samba服务问题解决
    转自https://blog.csdn.net/u014635079/article/details/124703840服务端:Ubuntu20.04, samba版本4.13.17-Ubuntu客户端:Win10 问题1:按照教程搭建好samba服务之后,从windows可以ping通linux的情况下,从windows端无法连接samba服务器。 解决:通过打开Lanman工作站的启用不......
  • P8543 「Wdoi-2」纯粹的复仇女神 题解
    自己的套路还是见少了。思路考虑扫描线。每一个颜色的\(\min\)具有单调性,这个很好看出来。可以使用一个单调栈来维护。这里都是朴素的。考虑如何维护。我们发现在通过单调栈维护的时候。需要支持撤销上一个元素对区间的影响。我就在这里卡了很久。我们有一个很暴力的......
  • 14:苏格拉底问答、实践过程截图、遇到问题解决问题截图,代码链接、
    ......
  • 苏格拉底问答、实践过程截图、遇到问题解决问题截图,代码链接
    include<stdio.h>include<stdlib.h>include<sys/types.h>include<sys/socket.h>include<netinet/in.h>include<arpa/inet.h>include<time.h>include<string.h>include<unistd.h>defineMAXLINE256......
  • 两道题解决滑动窗口问题
    定长567.字符串的排列-力扣(LeetCode)给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。换句话说,s1 的排列之一是 s2 的 子串 。解题思路1°传统套路就是定义两个哈希表,一个存储s1中每个字符的出现次数,记s1......
  • P1002题解
    思路设\(dp_{i,j}\)表示第\(i\)行\(j\)列卒走到这里有多少种方式。卒是可以向右和下走,所以到这个点只能从左或上来,不难得出转移公式:\(dp_{i,j}=dp_{i-1,j}+dp_{i,j-1}\)。如果马在这个点上或者说马能到这个点上,那么卒不能到这个点,也就是卒到这个点的方式为\(0\)。如......
  • P1135题解
    思路我写的好像是动规的做法。设\(f_{i,j}\)表示第\(i\)步\(j\)个点是否可以走到,值要么为\(1\),要么为\(0\)。最多走\(n\)步,因为总共只有\(n\)个点,每一步都肯定会多延伸出一个点,要不然就重复计算。不难得出转移公式:\(f_{i+1,j+k_j}=f_{i,j}\)\(f_{i+1,j-k_j}=f_{......
  • P1003题解
    简单模拟题。思路枚举每一个地毯,因为后面的会覆盖前面的,所以从正序枚举。如果要求的点的坐标在当前地毯上,则将答案赋值为当前地毯编号。最后输出答案。那如果这个点没有地毯呢?答案初始设为\(-1\),这样没有地毯覆盖的话,答案不会改变,这样输出答案就会是\(-1\)。注意:记得赋初......