SenseTime Ace Coder Challenge 暨 商汤在线编程挑战赛* G题 危险路径

标签: 信息学 启发式并查集
64人阅读 评论(0) 收藏 举报
分类:

题目链接.

弱鸡选手表示只会做这种水题了。

首先mst。

之后问题转化为在一棵树上,求每个点到其它点的路径的最大值的和。

当然可以点剖什么的,也可以换根+线段树合并什么的,常数有点小炸。

我的想法是用启发式并查集。

mst要合并两个并查集时,设它们的根为x,y

siz[x] > siz[y], 将把y的父亲设为x。

显然未合并前的x的整个子树答案+z(当前边权)*siz[y],而y的子树答案+z*siz[x]。

处理一下x的标记,y的标记减去x的标记再加上自己应有的那一部分。

这样的话,最后就按照并查集的顺序从上到下遍历一遍传个标记就好了。

时间复杂度O((n+m) log n)

Code:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define ul unsigned long long
#define fo(i, x, y) for(ll i = x; i <= y; i ++)
using namespace std;

const ll N = 1e6 + 5;

ll T, n, m, x, y;
ll f[N];
ll sum[N], ans, siz[N];

ll find(ll x) {return f[x] == x ? x : find(f[x]);}

struct edge {
    ll x, y, z;
} e[N];

bool cmp(edge a, edge b) {
    return a.z < b.z;
}

ll final[N], to[N], nxt[N], tot;

void link(ll x, ll y) {
    nxt[++ tot] = final[x], to[tot] = y, final[x] = tot;
}

ll d[N];

int main() {
    ll num = 1;
    for(scanf("%lld", &T); T; T --, num ++) {
        scanf("%lld %lld", &n, &m);
        fo(i, 1, n) f[i] = i, siz[i] = 1, sum[i] = 0, final[i] = 0;
        fo(i, 1, tot) nxt[i] = to[i] = 0; tot = 0;
        fo(i, 1, m) scanf("%lld %lld %lld", &e[i].x, &e[i].y, &e[i].z);
        sort(e + 1, e + m + 1, cmp);
        fo(i, 1, m) {
            ll x = e[i].x, y = e[i].y, z = e[i].z;
            if(find(x) != find(y)) {
                x = find(x), y = find(y);
                if(siz[x] < siz[y]) swap(x, y);
                sum[x] += z * siz[y];
                sum[y] -= sum[x] -  z * siz[x];
                f[y] = x; siz[x] += siz[y];
                link(x, y);
            }
        }
        ll g = find(1); ul ss = 0;
        d[d[0] = 1] = g;
        fo(i, 1, d[0]) {
            ll x = d[i]; ss ^= (ul) sum[x] * x;
            for(ll j = final[x]; j; j = nxt[j])
                sum[to[j]] += sum[x], d[++ d[0]] = to[j];
        }
        printf("Case #%lld: %llu\n", num, ss);
    }
}
查看评论

在XSLT实现按日期排序

在XSLT实现按日期排序 作者:孟宪会 出自:【孟宪会之精彩世界】 发布日期:2004年2月21日 11点47分56秒     我们在使用XSLT进行XML转换的时候,经常遇到按XML日期类型的数据进...
  • net_lover
  • net_lover
  • 2004-02-26 14:49:00
  • 3916

2018 SenseTime Ace Coder Challenge 暨 商汤在线编程挑战赛 总结

ACM赛制让我癫狂。第一场:做了的人都知道第一场的题全部都有问题。具体过程的话可以去知乎上看看。我来讲一下我的做题过程。首先点开了第一题。错把欧氏距离看成了曼哈顿距离,于是像个SB一样开打,过了10m...
  • Cold_Chair
  • Cold_Chair
  • 2018-04-15 19:43:50
  • 110

【NOI2018模拟4.2】program

Description:题解:做法真的很巧。假设在开头加了无数个‘>’。一直走,直到出了右边界。记录f,g分别表示第一次从i-1到i的时间,和第一次i到i-1的时间。这样对于一个区间[l..r]就可以...
  • Cold_Chair
  • Cold_Chair
  • 2018-04-15 19:53:53
  • 20

2017商汤科技春招实习笔试题总结

本人申请的岗位是见习算法研究员,笔试1个小时,20道选择填空题,3道编程题。时间略紧。涉及面也非常广,数学,智力,概率统计,线代矩阵,图形学,机器学习,神经网络,C++,均有涉及。 一、选择填空题(部...
  • smallplum123
  • smallplum123
  • 2017-04-09 22:57:59
  • 4536

SenseTime Ace Coder Challenge 暨 商汤在线编程挑战赛* G题 危险路径

题目链接.弱鸡选手表示只会做这种水题了。首先mst。之后问题转化为在一棵树上,求每个点到其它点的路径的最大值的和。当然可以点剖什么的,也可以换根+线段树合并什么的,常数有点小炸。我的想法是用启发式并查...
  • Cold_Chair
  • Cold_Chair
  • 2018-04-16 19:30:39
  • 64

[堆] hihoCoder Challenge 29 D. 不上升序列

出烂了的原题,有可并堆的做法 然而昨晚翻原题的时候发现了精妙的做法看这里 令fi(x)f_i(x)为前ii个数,调整出最大值不超过xx的最小代价 那么fif_i是一条不升的折线 考虑转移 fi...
  • u014609452
  • u014609452
  • 2017-06-26 15:54:44
  • 710

hihocoder Challenge 29 A.序列的值

我现在就感觉我这人现在真的没有dp的意识 其实真写起来也不难,但是把就是练的少思维跟不上,dp从根本上就是一种状态的提炼和聚集。按照题解的意思来,dp[i][j]dp[i][j]表示二进制第i位的值...
  • basasuya
  • basasuya
  • 2017-07-03 23:20:39
  • 171

hihocoder Challenge 29 D. 不上升序列

这场爆零比赛题目还是要补的这道题据说是出烂掉的原题,我找了下CF13.C/ CF371 div1 C,一模一样 我服这群原题大佬Fi[x]F_{i}[x]为 当A[i]...
  • basasuya
  • basasuya
  • 2017-06-29 17:32:46
  • 239

机器学习面试问题

链接:https://www.nowcoder.com/discuss/48981?type=0&order=4&pos=10&page=2 阿里巴巴 - 2017.3.23 - 实习生 - ids...
  • happyorg
  • happyorg
  • 2017-10-02 20:01:21
  • 188

Segmentation

总结很全面的博客: https://handong1587.github.io/deep_learning/2015/10/09/segmentation.htmlPapersDeep Joint ...
  • u010069760
  • u010069760
  • 2017-09-21 09:58:19
  • 1906
    个人资料
    持之以恒
    等级:
    访问量: 7万+
    积分: 3154
    排名: 1万+
    友情链接
    文章分类
    最新评论