4 条题解

  • 2
    @ 2025-8-29 13:58:00

    ونحن ننظر في ثلاث نقاط

    ثم نحن ننظر في هذه النقاط الثلاث ، المسافة بين و و ج \ \ \ \ \ مين { ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش ش \ \ } ،ثمإذاكناربط ، ثم إذا كنا ربط $ ب ، ب ، ج ، ثم الجواب هو بالتأكيد ليست سيئة . لأن الأسوأ هو مجرد كبيرة مثل $ أ ج ج . حتى نتمكن من ترتيب مبلغ س دولار محور محور ص دولار على التوالي ، ثم تشغيل ديكسترا على اثنين من النقاط المجاورة

    • 1
      @ 2025-8-29 13:55:31
      • 0
        @ 2025-8-29 13:56:53

        我们考虑三个点

        我们叫两边的两个点为 AACC ,中间的点为 BB

        然后我们考虑这三个点,我们 AACC 的距离是 min{xAxC,yAyC}\min \{ |x_A-x_C|,|y_A-y_C| \} 然后我们如果连上 AABBBBCC ,那么答案一定不劣

        因为最坏也会跟 AA 直接和 CC 连答案一样大

        所以我们分别对 xx 轴和 yy 轴排序,然后对于相邻的两个点连边跑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
          @ 2025-8-29 13:58:51

          #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
        上传者