商汤科技近日推出的 SenseVideo 能够对视频监控中的对象进行识别与分析,包括行人检测等。在行人检测问题中,最重要的就是对行人移动的检测。由于往往是在视频监控数据中检测行人,我们将图像上的行人抽象为二维平面上若干个的点。那么,行人的移动就相当于二维平面上的变换。
在这道题中,我们将行人的移动过程抽象为 平移,有两个 移动参数:dxd_xdx 和 dyd_ydy。每次行人的移动过程会将行人对应的所有点全部平移,对于平移前的点 (x,y)(x, y)(x,y),平移后的坐标为 (x+dx,y+dy)(x + d_x, y + d_y)(x+dx,y+dy)。
我们现在已知一个行人对应着 nnn 个点,坐标分别为 (x1,y1),(x2,y2)…(xn,yn)(x_1,y_1),(x_2,y_2)\ldots (x_n,y_n)(x1,y1),(x2,y2)…(xn,yn),平移后的坐标分别为 (x1′,y1′),(x2′,y2′)…(xn′,yn′)(x_1',y_1'),(x_2',y_2')\ldots (x_n',y_n')(x1′,y1′),(x2′,y2′)…(xn′,yn′)。
很显然,通过平移前后的正确坐标,很容易算出行人的移动参数,但问题没有这么简单。由于行人实际的移动并不会完全按照我们预想的方式进行,因此,会有一部分平移后的坐标结果不正确,但可以确保 结果不正确的坐标数量严格不超过一半。
你现在作为商汤科技的实习生,接手了这个有趣的挑战:算出行人的移动参数。如果不存在一组合法的移动参数,则随意输出一组参数;如果有多种合法的移动参数,输出其中任意一组合法的即可。
输入格式
第一行输入一个整数 n(1≤n≤105)n(1 \le n \le 10^5)n(1≤n≤105),表示行人抽象出的点数。
接下来 nnn 行,每行 444 个 整数。前两个数表示平移前的坐标,后两个数表示平移后的坐标。
坐标范围在 −109-10^9−109 到 10910^9109 之间。
输出格式
一行两个整数,dxd_xdx 和 dyd_ydy,表示行人的移动参数。
样例输入
5 0 0 1 1 0 1 1 2 1 0 2 1 1 1 0 0 2 1 1 0
样例输出
1 1
只要结果的个数大于等于n/2就行
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; #define LL long long LL a[100050]; LL b[100500]; int main() { int n; while(cin>>n) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); int x,y,x1,y1; int p=0; int p1=0; for(int i=1;i<=n;i++) { cin>>x>>y>>x1>>y1; a[p++]=x1-x; b[p1++]=y1-y; } sort(a,a+p); sort(b,b+p1); int ha=0,haha=0; int we=a[0],ni=b[0]; for(int i=0;i<p;i++) { if(a[i]!=a[i+1]) { if(ha>=n/2) { we=a[i]; break; } else { ha=0; } } else { ha++; } } for(int j=0;j<p1;j++) { if(b[j]!=b[j+1]) { if(haha>=n/2) { ni=b[j]; break; } else { haha=0; } } else { haha++; } } printf("%d %d\n",we,ni); } }