• BZOJ4152 [AMPPZ2014]The Captain


    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

    本文作者:ljh2000
    作者博客:http://www.cnblogs.com/ljh2000-jump/
    转载请注明出处,侵权必究,保留最终解释权!

    题目链接:BZOJ4152

    正解:贪心+$dijkstra$

    解题报告:

      显然不能把所有的边都连出来,那么可不可以少连一点呢。

      事实上,我们考虑对于$x$坐标连续的两个点$A$、$B$,他们之间显然没有别的点了,那么从$A$直接走到$B$必然不差于找一个中转点再走,这个画画图很容易发现。

      这启示我们,可能连边只要连坐标相邻的边?

      我们同时会发现如果两个点之间还有一个点,那么很有可能直接走过去不如中转点更优,而分别连向中转点再走显然会更优。

      这样一来,大致思路也就清晰了,分别按$x$、$y$排序,相邻点连边(权值为$x$或者$y$的差值,根据按哪一维排序),最后跑一遍最短路就好了。

    //It is made by ljh2000
    //有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <vector>
    #include <cstdio>
    #include <string>
    #include <queue>
    #include <cmath>
    #include <ctime>
    #define lc root<<1
    #define rc root<<1|1
    #define reg(i,x) for(int i=first[x];i;i=next[i])
    using namespace std;
    typedef long long LL;
    const int MAXN = 200011;
    const LL inf = (1LL<<60);
    const int MAXM = 800011;
    int n,ecnt,first[MAXN],nxt[MAXM],to[MAXM],w[MAXM];
    LL dis[MAXN];
    struct node{ int x,y,id; }a[MAXN];
    inline bool cmpx(node q,node qq){ return q.x<qq.x; }
    inline bool cmpy(node q,node qq){ return q.y<qq.y; }
    struct Val{ LL dis; int x; inline bool operator < (const Val &a) const { return a.dis<dis; } }tmp;
    priority_queue<Val>Q;
    inline int getint(){
        int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();
        if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
    }
    
    inline void link(int x,int y,int z){ 
    	nxt[++ecnt]=first[x]; first[x]=ecnt; to[ecnt]=y; w[ecnt]=z;
    	nxt[++ecnt]=first[y]; first[y]=ecnt; to[ecnt]=x; w[ecnt]=z;
    }
    
    inline void work(){
    	n=getint(); for(int i=1;i<=n;i++) a[i].x=getint(),a[i].y=getint(),a[i].id=i/*!!!*/;
    	for(int i=1;i<=n;i++) dis[i]=inf; dis[1]=0;
    
    	sort(a+1,a+n+1,cmpx); for(int i=1;i<n;i++) link(a[i].id,a[i+1].id,a[i+1].x-a[i].x);
    	sort(a+1,a+n+1,cmpy); for(int i=1;i<n;i++) link(a[i].id,a[i+1].id,a[i+1].y-a[i].y);
    
    	tmp.dis=0; tmp.x=1; Q.push(tmp); int x;
    	while(!Q.empty()) {
    		tmp=Q.top(); Q.pop();
    		x=tmp.x; if(dis[x]!=tmp.dis) continue;
    		for(int i=first[x];i;i=nxt[i]) {
    			int v=to[i]; 
    			if(dis[v]>dis[x]+w[i]) {
    				dis[v]=dis[x]+w[i];
    				tmp.x=v; tmp.dis=dis[v];
    				Q.push(tmp);
    			}
    		}
    	}
    	printf("%lld",dis[n]);
    }
    
    int main()
    {
    #ifndef ONLINE_JUDGE
    	freopen("4152.in","r",stdin);
    	freopen("4152.out","w",stdout);
    #endif
        work();
        return 0;
    }
    //有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
    

      

  • 相关阅读:
    Druid 使用 Kafka 将数据载入到 Kafka
    Druid 使用 Kafka 数据加载教程——下载和启动 Kafka
    Druid 集群方式部署 —— 启动服务
    Druid 集群方式部署 —— 端口调整
    Druid 集群方式部署 —— 配置调整
    Druid 集群方式部署 —— 配置 Zookeeper 连接
    Druid 集群方式部署 —— 元数据和深度存储
    Druid 集群方式部署 —— 从独立服务器部署上合并到集群的硬件配置
    Druid 集群方式部署 —— 选择硬件
    Druid 独立服务器方式部署文档
  • 原文地址:https://www.cnblogs.com/ljh2000-jump/p/6815726.html
Copyright © 2020-2023  润新知