您的位置:首页 > 其它

Codeforces:Dreamplay and Stars

2017-02-26 22:55 281 查看
[b]Codeforces:Dreamplay and Stars[/b]

题目链接:http://codeforces.com/group/gRkn7bDfsN/contest/212150/problem/C

题目大意:以(ax+by+c=0)形式给出n条线,问能形成多少个三角形。

组合数学

将同一斜率的直线划分为一组,每组的直线数为tot[i].

用num维护前i组的总直线数,num=num+tot[i].

若以两条斜率不同的直线为一对,times维护在前i组中所有直线对数,故times=times+num*tot[i].

ans维护前i组所有直线构造出的三角形数,故ans=ans+times*tot[i].

代码如下:

#include <iostream>
#include <map>
#include <algorithm>
#define mk(x,y) make_pair(x,y)
using namespace std;
typedef pair<int,int> P;
map<P,int>mp;
int tot[300005];
int gcd(int x,int y){
return y==0?x:gcd(y,x%y);
}
int main(void){
std::ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=0;i<n;++i){
int x,y,z;
cin>>x>>y>>z;
if(x==0||y==0)mp[mk(x,y)]++;
else{
int t=gcd(x,y);
mp[mk(x/t,y/t)]++;
}
}
long long ans=0,k=0,num=0,times=0;
for(map<P,int>::iterator it=mp.begin();it!=mp.end();++it)
tot[k++]=it->second;
sort(tot,tot+k);
for(int i=0;i<k;++i){
if(i>=2)ans+=times*tot[i];
times+=num*tot[i];
num+=tot[i];
}
cout<<ans;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: