Codeforces Round #597 (Div. 2) D. Shichikuji and Power Grid

  • 题意: 二维平面上n个点,每个点可以建厂,也可以与其他点连边,建厂花费为ci,与j连边花费为(ki+kj)dis(i,j),dis为两点之间的欧式距离,求让每个点都通电的最小花费与方案
  • 思路: 维护使这个点通电的花费的优先队列,一开始先把建厂放进去,然后每次拿出最小花费的点i,再用i去更新与i建路的花费(有点像最小生成树).
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
using namespace std;

const int N = 1e4+10;
pii pos[N]; 
ll c[N],k[N],vis[N],cnt;

struct node{
    ll type,val,id;    // 0: 建厂, !0:建路
    bool operator <(const node oth)const {
        if(val == oth.val) return type > oth.type;
        return val > oth.val;
    }   // 最小花费,如果花费相同,则优先建路
};
vector<pii> road; // 建路
vector<int> chang; // 建厂
int dis(int i,int j){
    return abs(pos[i].first - pos[j].first) + abs(pos[i].second - pos[j].second);
}
int main(){
    priority_queue<node> que;
    int n;
    ll ans = 0;
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%d%d",&pos[i].first,&pos[i].second);
    }
    for(int i=1;i<=n;++i)   scanf("%d",&k[i]);
    for(int i=1;i<=n;++i)   scanf("%d",&c[i]),que.push((node){0,k[i],i});
    while(cnt<n && que.size()){
        node tp = que.top();    que.pop();
        if(vis[tp.id])  continue;
        ans+=tp.val;    vis[tp.id] = 1;
        if(tp.type==0){
            chang.push_back(tp.id);
        }else{
            road.push_back((pii){tp.id,tp.type});   
        }
        for(int i=1;i<=n;++i){
            ll val = dis(i,tp.id);
            if(!vis[i] && val<=k[i])
                que.push((node){tp.id,val*1LL*(c[i]+c[tp.id]),i});
        }
    }
    printf("%lld\n%d\n",ans,chang.size());
    for(auto ch:chang){
        printf("%d ",ch);
    }
    printf("\n%d\n",road.size());
    for(auto ro:road){
        printf("%d %d\n",ro.first,ro.second);
    }

    return 0;
}

n2log(n)水过

posted @   新新人類  阅读(168)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示