题目链接:点击打开链接
题目大意:
这个题目的题面真的坑,个人感觉其实不是很难,但是我当时做完3题之后完全看不懂D题的题意,又感觉是个计算几何就直接扔那没管了。唉,其实知道题意之后蛮简单的,题意就是给你n个点,只给你x坐标,y坐标利用题目给你的a,b推出来即可,还有每个点运动的方向(以向量的方式给出)即给出vx和vy,每个点和其他点相遇一次,ans++,差不多就这个意思。
解题思路:
其实首先要带一下公式 对于点 x0 y0 x1 y1 如果某个点可以相遇,那么可以得到公式
x0+t*vx0=x1+t*vx1
y0+t*vy0=y1+t*vy1
然后把y=a*x+b带入消去t得到,vy1-a*vx1=vy0-a*vx0n
即只要符合这个公式的两点都可相遇。但是这个时候要考虑他们向量完全相同的情况,最后计算答案的时候减去这个值就可以,用map的话比较好实现。
Ac代码:
#include<bits/stdc++.h>
#define lson rt<<1
#define rson rt<<1|1
using namespace std;
typedef long long ll;
const int maxn=2e5+5;
const int INF=1e9+7;
const int mod=998244353;
int n;
ll a,b,sum;
struct node
{ll x,vx,vy;
}d[maxn];
map<pair<ll,ll>,int> mp;
map<ll,int> ma;
int main()
{scanf("%d%lld%lld",&n,&a,&b);for(int i=1;i<=n;i++){scanf("%lld%lld%lld",&d[i].x,&d[i].vx,&d[i].vy);mp[make_pair(d[i].vx,d[i].vy)]++; //统计个数ma[d[i].vy-a*d[i].vx]++;}for(int i=1;i<=n;i++)sum+=(ma[d[i].vy-a*d[i].vx]-mp[make_pair(d[i].vx,d[i].vy)]); //计算贡献printf("%lld\n",sum);//system("pause");
}