4 条题解
-
2
ونحن ننظر في ثلاث نقاط

ثم نحن ننظر في هذه النقاط الثلاث ، المسافة بين ج \ \ \ \ \ مين { ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش \ \ } $ ب ، ب ، ج ، ثم الجواب هو بالتأكيد ليست سيئة . لأن الأسوأ هو مجرد كبيرة مثل $ أ . حتى نتمكن من ترتيب مبلغ س دولار محور محور ص دولار على التوالي ، ثم تشغيل ديكسترا على اثنين من النقاط المجاورة
-
1
-
0
我们考虑三个点

我们叫两边的两个点为 和 ,中间的点为
然后我们考虑这三个点,我们 和 的距离是 然后我们如果连上 和 、 和 ,那么答案一定不劣
因为最坏也会跟 直接和 连答案一样大
所以我们分别对 轴和 轴排序,然后对于相邻的两个点连边跑dijkstra即可
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<map> #define int long long using namespace std; bool Test_MLE_start; constexpr int N=4*1e5+10; int _=1,n,tot=0,head[N],dis[N]; bool vis[N]; struct node{int x,y,id;}p[N]; struct edge{int v,w,nxt;}a[N<<1]; priority_queue<pair<int,int> >q; inline int reads(){ char c=getchar(); int sum=0,f=1; while(!isdigit(c)){ if(c=='-') f=-1; c=getchar(); } while(isdigit(c)){ sum=(sum<<3)+(sum<<1)+(c^'0'); c=getchar(); } return sum*f; } inline void files(){ freopen("A.in","r",stdin); // freopen("std.out","w",stdout); } inline void clr(){ // Don't forget! } void add(int u,int v,int w){ a[++tot].v=v;a[tot].w=w; a[tot].nxt=head[u]; head[u]=tot; } bool cmp1(node a,node b){return a.x==b.x?a.y<b.y:a.x<b.x;} bool cmp2(node a,node b){return a.y==b.y?a.x<b.x:a.y<b.y;} void dijkstra(){ memset(dis,0x3f,sizeof(dis)); q.push(make_pair(0,1)),dis[1]=0; while(!q.empty()){ int u=q.top().second;q.pop(); if(vis[u]) continue;vis[u]=1; for(int i=head[u];i;i=a[i].nxt){ int v=a[i].v; if(dis[v]>dis[u]+a[i].w) dis[v]=dis[u]+a[i].w,q.push(make_pair(-dis[v],v)); } } } bool Test_MLE_end; signed main(){ // printf("%lf Mb\n",(&Test_MLE_end-&Test_MLE_start-1)/1024.0/1024.0); // files(); // _=reads(); while(_--){ clr();n=reads();for(int i=1;i<=n;i++) p[i].x=reads(),p[i].y=reads(),p[i].id=i;sort(p+1,p+n+1,cmp1); for(int i=1;i<n;i++) add(p[i].id,p[i+1].id,abs(p[i].x-p[i+1].x)),add(p[i+1].id,p[i].id,abs(p[i].x-p[i+1].x));sort(p+1,p+n+1,cmp2); for(int i=1;i<n;i++) add(p[i].id,p[i+1].id,abs(p[i].y-p[i+1].y)),add(p[i+1].id,p[i].id,abs(p[i+1].y-p[i].y));dijkstra(); printf("%lld\n",dis[n]); } return 0; } -
-1

#include<bits/stdc++.h> #define int long long #define R(x) x=read() using namespace std; inline int read() { int x=0,y=1; char e=getchar(); while(e<'0'||e>'9') { if(e=='-')y=-1; e=getchar(); } while(e>='0'&&e<='9') { x=(x<<1)+(x<<3)+(e^'0'); e=getchar(); } return x*y; } const int N=200005; int n; struct node { int x,y,id; } a[N]; bool cmp1(node A,node B) { return A.x<B.x; } bool cmp2(node A,node B) { return A.y<B.y; } vector<pair<int,int> >G[N]; void add(int x,int y,int z){ G[x].push_back({y,z}); G[y].push_back({x,z}); } int dis[N]; bool vis[N]; priority_queue<pair<int,int> ,vector<pair<int,int> >,greater<pair<int,int> > >q; void dijkstra(){ memset(dis,0x3f,sizeof dis); q.push({0,1}),dis[1]=0; while(!q.empty()){ int u=q.top().second; q.pop(); if(vis[u])continue; vis[u]=1; for(auto pii:G[u]){ int v=pii.first,w=pii.second; if(dis[v]>dis[u]+w){ dis[v]=dis[u]+w; q.push({dis[v],v}); } } } } signed main() { R(n); for(int i=1; i<=n; ++i) { R(a[i].x),R(a[i].y); a[i].id=i; } sort(a+1,a+1+n,cmp1); for(int i=2;i<=n;++i){ add(a[i].id,a[i-1].id,a[i].x-a[i-1].x); } sort(a+1,a+1+n,cmp2); for(int i=2;i<=n;++i){ add(a[i].id,a[i-1].id,a[i].y-a[i-1].y); } dijkstra(); cout<<dis[n]; return 0; }
- 1
信息
- ID
- 364
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- (无)
- 递交数
- 25
- 已通过
- 14
- 上传者