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
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
#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 y1:0;}
template<class T>inline bool chkmax(T &x,T y){return x1:0;}
inline LL Max(LL &x,LL y){return x>y?x:y;}
inline LL Min(LL &x,LL y){return x#define N 1005

#define pi pair

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();
        mapvector<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;
    }
};

你可能感兴趣的:(SRM,Div1,Medium)