【bzoj4061】[Cerc2012]Farm and factory

原创 2015年11月19日 22:17:11

  这题不错
  反正我想了一天是没想出来hhhh
  后来看了糖老师的题解 恍然大悟
  设dis[i][j],dis[i][j]分别为原图和新图中i到j的最短路径。
  设新加的一个点为x
  若要使在新图中最短路不经过x,应要满足
  u,dis[u][x]>=max{dis[u][1]dis[x][1],dis[u][2]dis[x][2]}
  这个还是能想得到的
  得到了这个以后,因为要使dis[u][x]最小,故应该取等号。把这个式子写出来,就会是
  max{dis[u][1]dis[x][1],dis[u][2]dis[x][2]}
  如果把每个(dis[u][1],dis[u][2])看做一个点,答案就是是这些点到点(dis[x][1],dis[x][2])的切比雪夫距离和的最小值。
  于是就乱搞咯2333
  用dijkstra,时间复杂度O(m+nlogn)。亲测SPFA会TLE,不知道是不是姿势问题。

#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
#define fore(i,u)  for(int i=head[u];i;i=nxt[i])
#define cr(x) memset(x , 0 , sizeof x)
#define pii pair<ll , int>
#define mp make_pair
#define maxn 100003
#define maxm 600007

inline int rd() {
    char c = getchar();
    while (!isdigit(c)) c = getchar() ; int x = c - '0';
    while (isdigit(c = getchar())) x = x * 10 + c - '0';
    return x;
}

typedef long long ll;
typedef int arr_int[maxn];
typedef ll  arr_ll [maxn];
typedef int adj[maxm];

const ll inf = 1e12;

arr_int head , vis;
arr_ll  dis[2] , x , y;
adj to , val , nxt;
int n , m , ett;

priority_queue<pii , vector<pii> , greater<pii> > Q;

inline void ins(int u , int v , int w) {
    to[++ ett] = v , val[ett] = w , nxt[ett] = head[u] , head[u] = ett;
}

void input() {
    n = rd() , m = rd();
    cr(head) , ett = 0;
    rep (i , 1 , m) {
        int u = rd() , v = rd() , w = rd();
        ins(u , v , w) , ins(v , u , w);
    }
}

void dijk(int s) {
    int c = s - 1;
    rep (i , 1 , n) dis[c][i] = inf;
    cr(vis);
    dis[c][s] = 0;
    Q.push(mp(0 , s));
    while (!Q.empty()) {
        int u = Q.top().second ; Q.pop();
        if (vis[u]) continue;
        vis[u] = 1;
        fore (i , u) {
            int v = to[i] , w = val[i];
            if (dis[c][v] > dis[c][u] + w) {
                dis[c][v] = dis[c][u] + w;
                Q.push(mp(dis[c][v] , v));
            }
        }
    }
}

void solve() {
    dijk(1) , dijk(2);
    rep (i , 1 , n) {
        x[i] = dis[0][i] + dis[1][i];
        y[i] = dis[0][i] - dis[1][i];
    }
    sort(x + 1 , x + n + 1) , sort(y + 1 , y + n + 1);
    ll nx = x[(n + 1) / 2] , ny = y[(n + 1) / 2];
    double ans = 0;
    rep (i , 1 , n)
        ans += abs(x[i] - nx) + abs(y[i] - ny);
    printf("%.12lf\n" , ans / (2.0 * n));
}

int main() {
    #ifndef ONLINE_JUDGE
        freopen("data.txt" , "r" , stdin);
    #endif
    int T = rd();
    rep (i , 1 , T) {
        input();
        solve();
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

bzoj4059【Cerc2012】Non-boring sequences

分治好题

【CERC2012】【BZOJ4062】Jewel heist

Description擅长偷盗的卢平想要偷走邪恶的欧文收藏的珠宝。欧文在他的商店里放置了n个珠宝。每个珍贵的石头一定有着k种颜色之一的颜色。展览馆非常的大,我们可以将珠宝视为欧几里得平面上的一些互异的...

不无聊的序列(Non-boring sequences,Bzoj4059,CERC2012)

不无聊的序列分治解法

【CERC2012】【BZOJ4059】Non-boring sequences

Description我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短。一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子序列里至少存在一个数字只出现一次。给定一...

【CERC2012】【BZOJ4057】Kingdoms

Description有一些王国陷入了一系列的经济危机。在很多年以前,他们私底下互相借了许多钱。现在,随着他们的负债被揭发,王国的崩溃不可避免地发生了……现在有n个王国,对于每对王国A和B,A欠B的钱...

BZOJ 4059 Cerc2012 Non-boring sequences 线段树+扫描线

题目大意:定义一个序列为【不无聊的】当且仅当这个序列的任意一个区间都存在一个数只出现过一次,给定一个序列,要求判断这个序列是否是【不无聊的】 定义lastilast_i表示第ii个元素上一次出现的位...
  • PoPoQQQ
  • PoPoQQQ
  • 2015年06月05日 18:28
  • 1199

[BZOJ4422][Cerc2015]Cow Confinement(扫描线+线段树)

这篇题解ATP在APIO的时候就开始写写到现在终于写完了。。
  • FromATP
  • FromATP
  • 2017年05月28日 21:57
  • 288

BZOJ4052——[Cerc2013]Magical GCD

1、题意:给出一个长度在10510^5以内的正整数序列,大小不超过 101210^{12}。 求一个连续子序列,使得在所有的连续子序列中,它们的GCD值乘以它们的长度最大。 2、分析:对于一个右端点...

【CERC2015】【BZOJ4434】Ice Igloos

Description一个坐落在北极冰冻湖面上的渔村因全球变暖而面临危险——湖面开始破碎。村庄内有n座球形冰屋,每座冰屋在湖面上占据了一块圆形区域。 一座冰屋可以视为平面座标系中的一个圆:其圆心座标...

BZOJ4435——[Cerc2015]Juice Junctions

0、题目大意:求两点之间的最小割之和 1、分析:很明显,最小割树,我们发现这个题并不能用n^3的方法来求答案。。    所以我们记录下所有的边,然后把边从大到小排序,然后跑一边类似kruskal的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【bzoj4061】[Cerc2012]Farm and factory
举报原因:
原因补充:

(最多只允许输入30个字)