CSAcademy Beta Round #5 Force Graph

时间:2022-02-19 10:54:36

题目链接:https://csacademy.com/contest/arhiva/#task/force_graph/

大意是有若干个节点,每个节点对应一个二维坐标,节点之间相互有斥力存在。同时有些节点之间有变存在。对于有边存在的节点,他们互相的斥力大小为F1*dis值,否则则为F2*dis值,其中dis值为节点之间的欧氏距离。问每个节点受到的斥力大小。

这个其实就是很简单的数学推一下:先假设所有的点都受到F2*dis值,然后再加上所有有边的其他节点的斥力修正。

 

CSAcademy Beta Round #5 Force GraphCSAcademy Beta Round #5 Force Graph
 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 #include <string>
 5 #include <cstring>
 6 #include <cstdio>
 7 #include <math.h>
 8 #include <queue>
 9 #include <stack>
10 #include <map>
11 #include <cassert>
12 #include <set>
13 using namespace std;
14 
15 
16 const int N=323456;
17 
18 
19 struct Edge {
20     int to,next;
21     Edge() {}
22     Edge(int _to,int _next):to(_to),next(_next) {}
23 } edge[N<<2];
24 int idx=1,head[N];
25 inline void addedge(int u,int v) {
26     edge[++idx]=Edge(v,head[u]);
27     head[u]=idx;
28 }
29 
30 long long x[N],y[N];
31 int main () {
32     int n,m;
33     long long f1,f2;
34     while (scanf("%d %d %lld %lld",&n,&m,&f1,&f2)==4) {
35         idx=1;memset(head,0,sizeof head);
36         for (int i=1;i<=m;i++) {
37             int u,v;
38             scanf("%d %d",&u,&v);
39             addedge(u,v);
40             addedge(v,u);
41         }
42         long long sx=0,sy=0;
43         for (int i=1;i<=n;i++) {
44             scanf("%lld %lld",x+i,y+i);
45             sx+=x[i];sy+=y[i];
46         }
47         for (int i=1;i<=n;i++) {
48             long long rx=(x[i]*n-sx)*f2;
49             long long ry=(y[i]*n-sy)*f2;
50             for (int k=head[i];k;k=edge[k].next) {
51                 int j=edge[k].to;
52                 long long dx=x[i]-x[j],dy=y[i]-y[j];
53                 rx+=dx*(f1-f2);ry+=dy*(f1-f2);
54             }
55             cout<<rx<<" "<<ry<<endl;
56         }
57     }
58     return 0;
59 }
View Code