打了两次cf里的比赛,发现cf比较喜欢考数学题。一开始看到这道题没有思路,因为总想dp,图论,贪心这些东西。如果下次再没有思路,可以从数学的角度入手。
题解说的比较清楚:
1 #include<iostream> 2 #include<map> 3 #define ll long long 4 #define MAXN 200000 5 using namespace std; 6 7 ll n,a,b,ans,parallel; 8 map<long long,int> m; 9 map< pair<int,int>,int> p; 10 int main(){ 11 cin>>n>>a>>b; 12 for(int i=1;i<=n;i++){ 13 int x,Vx,Vy; scanf("%d%d%d",&x,&Vx,&Vy); 14 //每个维护出来a*Vx-Vy 15 ll key = a*Vx-Vy; 16 ans+=m[key];//相同key的能collide 17 m[a*Vx-Vy]++; 18 parallel+=p[ make_pair(Vx,Vy) ]; 19 p[ make_pair(Vx,Vy) ]++; 20 } 21 cout<<(ans-parallel)*2; 22 23 return 0; 24 }