题目链接:点击打开链接
题目大意:
这个题目的题面真的坑,个人感觉其实不是很难,但是我当时做完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"); }
