HDU 4631 set維護
題意:給出n有n個點,每次插入計算最小點對距離,然後把距離和求出來。
用multiset按x坐標大小維護就行了。14s
#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<set> using namespace std; struct point { long long x,y; bool operator < (const point &m) const { if(x==m.x) return y<m.y; return x<m.x; } }; multiset<point> myset; multiset<point>::iterator it,i1,i2; long long dis(point a,point b) { return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); } long long getmin(long long m,point a) { long long ans=m; it=myset.lower_bound(a); for(i1=it; i1!=myset.end(); i1++) { long long dx=a.x-i1->x; if(dx*dx>=ans) break; long long dy=a.y-i1->y; ans=min(ans,dx*dx+dy*dy); } for(i1=it; i1!=myset.begin();) { i1--; long long dx=a.x-i1->x; if(dx*dx>=ans) break; long long dy=a.y-i1->y; ans=min(ans,dx*dx+dy*dy); } myset.insert(a); return ans; } int main() { int t,n; long long ax,ay,bx,by,cx,cy,ans,m; scanf("%d",&t); while(t--) { myset.clear(); scanf("%d%I64d%I64d%I64d%I64d%I64d%I64d",&n,&ax,&bx,&cx,&ay,&by,&cy); point a; a.x=bx%cx,a.y=by%cy,ans=0; m=1e18; myset.insert(a); for(int i=1; i<n; i++) { a.x=(a.x*ax+bx)%cx,a.y=(a.y*ay+by)%cy; m=getmin(m,a); ans+=m; } printf("%I64d\n",ans); } return 0; }
最後更新:2017-04-03 16:48:47
上一篇:
C# 網絡編程之網頁簡單下載實現
下一篇:
android 滑動菜單SlidingMenu的實現
Android內存優化的兩個類:SoftReference 和 WeakReference
win7網絡文件共享
Google和Udacity為75000名有抱負的開發人員提供獎學金
6倍性能差100TB容量,阿裏雲POLARDB如何實現?
Android開發12——Andorid中操作數據庫的insert的兩種方法以及nullColumnHack
九度題目1088:剩下的樹
java SpringMVC mybatis 多數據源 代碼生成器 SSM java redis shiro ehcache
eclipse部署web項目至本地的tomcat但在webapps中找不到
sql語句判斷範圍區間
Java中路徑的獲取總結以及URL和URI的區別