SRM671 BearDarts

思路:
由条件 ac=bd a ∗ c = b ∗ d 不难看出,要将其转化成 ab=dc a b = d c
那么就先预处理出 w[i]w[j] w [ i ] w [ j ] 的最简比,并记录。
这里运用lower_bound就可以轻松愉快的求出符合位置关系的相同最简比的个数,那么将答案累加即可。虽然感觉跟DP没有半毛钱关系

code:

#include<bits/stdc++.h>
using namespace std;
#define REP(i,f,t)for(int i=(f),i##_end_=(t);i<=i##_end_;i++)
#define SREP(i,f,t)for(int i=(f),i##_end_=(t);i<i##_end_;i++)
#define DREP(i,f,t)for(int i=(f),i##_end_=(t);i>=i##_end_;i--)
#define db double
#define LL long long 
#define INF 0x3f3f3f3f
#define Sz(a) sizeof(a)
#define mcl(a,b) memset(a,b,Sz(a))
#define mcp(a,b) memcpy(a,b,Sz(b))
#define pb push_back
template<class T>inline bool chkmin(T &x,T y){return y<x?x=y,1:0;}
template<class T>inline bool chkmax(T &x,T y){return x<y?x=y,1:0;}
inline LL Max(LL &x,LL y){return x>y?x:y;}
inline LL Min(LL &x,LL y){return x<y?x:y;}

#define N 1005

#define pi pair<int,int>

int gcd(int a,int b){return !b?a:gcd(b,a%b);} 
pi cmp(int a,int b){
    int d=gcd(a,b);
    a/=d;b/=d;
    return make_pair(a,b);
}

class BearDarts {
public:
    long long count(vector <int> w) {
        LL ans=0,x,y;
        int n=w.size();
        map<pi,vector<int> >dp;
        SREP(i,0,n) SREP(j,0,i) dp[cmp(w[j],w[i])].pb(i);
        SREP(i,0,n) SREP(j,0,i){
            pi x=cmp(w[i],w[j]);
            if(!dp.count(x))continue;
            vector<int> &V=dp[x];
            ans+=lower_bound(V.begin(),V.end(),j)-V.begin(); 
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值