codeforce975D:Ghosts(思维)


题目链接:点击打开链接


题目大意:

这个题目的题面真的坑,个人感觉其实不是很难,但是我当时做完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

扫描二维码关注公众号,回复: 2322790 查看本文章

即只要符合这个公式的两点都可相遇。但是这个时候要考虑他们向量完全相同的情况,最后计算答案的时候减去这个值就可以,用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");
}




猜你喜欢

转载自blog.csdn.net/f2935552941/article/details/80172398