bzoj3714 [PA2014]Kuglarz 最小生成树

题面:

魔术师的桌子上有$n$个杯子排成一行,编号为$1,2,…,n$,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯子,你就可以获得奖品。

花费$c_ij$元,魔术师就会告诉你杯子$i,i+1,…,j$底下藏有球的总数的奇偶性。

采取最优的询问策略,你至少需要花费多少元,才能保证猜出哪些杯子底下藏着球?

我们可以把前$i$个杯子的球的奇偶关系看做一个点$S[i]$

那么,原题相当于最小生成树

使用$prim$算法可以做到$O(n^2)$

#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
namespace remoon {
    #define re register
    #define de double
    #define le long double
    #define ri register int
    #define ll long long
    #define sh short
    #define pii pair<int, int>
    #define mp make_pair
    #define pb push_back
    #define tpr template <typename ra>
    #define rep(iu, st, ed) for(ri iu = st; iu <= ed; iu ++)
    #define drep(iu, ed, st) for(ri iu = ed; iu >= st; iu --)
    extern inline char gc() {
        static char RR[23456], *S = RR + 23333, *T = RR + 23333;
        if(S == T) fread(RR, 1, 23333, stdin), S = RR;
        return *S ++;
    }
    inline int read() {
        int p = 0, w = 1; char c = gc();
        while(c > ‘9‘ || c < ‘0‘) { if(c == ‘-‘) w = -1; c = gc(); }
        while(c >= ‘0‘ && c <= ‘9‘) p = p * 10 + c - ‘0‘, c = gc();
        return p * w;
    }
    int wr[50], rw;
    #define pc(iw) putchar(iw)
    tpr inline void write(ra o, char c = ‘\n‘) {
        if(!o) pc(‘0‘);
        if(o < 0) o = -o, pc(‘-‘);
        while(o) wr[++ rw] = o % 10, o /= 10;
        while(rw) pc(wr[rw --] + ‘0‘);
        pc(c);
    }
    tpr inline void cmin(ra &a, ra b) { if(a > b) a = b; }
    tpr inline void cmax(ra &a, ra b) { if(a < b) a = b; }
    tpr inline bool ckmin(ra &a, ra b) { return (a > b) ? a = b, 1 : 0; }
    tpr inline bool ckmax(ra &a, ra b) { return (a < b) ? a = b, 1 : 0; }
}
using namespace std;
using namespace remoon;

#define sid 2005

int n;
ll ans;
int vis[sid], low[sid], who[sid];
int w[sid][sid];

inline void MST() {
    vis[1] = 1;
    rep(i, 1, n + 1) low[i] = 1e9 + 5;
    rep(i, 2, n + 1)
    if(!vis[i] && ckmin(low[i], w[1][i])) who[i] = 1;
    rep(t, 1, n) {
        int nv = -1, dis = 1e9;
        rep(i, 1, n + 1)
        if(!vis[i] && ckmin(dis, low[i])) nv = i;
        ans += dis; vis[nv] = 1;
        rep(i, 1, n + 1)
        if(!vis[i] && ckmin(low[i], w[nv][i])) who[i] = nv;
    }
    write(ans);
}

int main() {
    n = read();
    memset(w, 127, sizeof(w));
    rep(i, 1, n) rep(j, i, n)
    w[j + 1][i] = w[i][j + 1] = read();
    MST();
    return 0;
}

原文地址:https://www.cnblogs.com/reverymoon/p/9778901.html

时间: 2024-10-12 04:43:20

bzoj3714 [PA2014]Kuglarz 最小生成树的相关文章

【BZOJ3714】[PA2014]Kuglarz 最小生成树

[BZOJ3714][PA2014]Kuglarz Description 魔术师的桌子上有n个杯子排成一行,编号为1,2,…,n,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯子,你就可以获得奖品.花费c_ij元,魔术师就会告诉你杯子i,i+1,…,j底下藏有球的总数的奇偶性.采取最优的询问策略,你至少需要花费多少元,才能保证猜出哪些杯子底下藏着球? Input 第一行一个整数n(1<=n<=2000).第i+1行(1<=i<=n)有n+1-i个整数,表示每一种询问所需的

最小生成树 BZOJ3714 [PA2014]Kuglarz

3714: [PA2014]Kuglarz Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 701  Solved: 394[Submit][Status][Discuss] Description 魔术师的桌子上有n个杯子排成一行,编号为1,2,-,n,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯子,你就可以获得奖品.花费c_ij元,魔术师就会告诉你杯子i,i+1,-,j底下藏有球的总数的奇偶性.采取最优的询问策略,你至少需要花费多少元

bzoj 3714 [PA2014]Kuglarz 最小生成树

[PA2014]Kuglarz Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1335  Solved: 672[Submit][Status][Discuss] Description 魔术师的桌子上有n个杯子排成一行,编号为1,2,…,n,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯子,你就可以获得奖品.花费c_ij元,魔术师就会告诉你杯子i,i+1,…,j底下藏有球的总数的奇偶性.采取最优的询问策略,你至少需要花费多少元,才能保证

bzoj3714 [PA2014]Kuglarz

Description 魔术师的桌子上有n个杯子排成一行,编号为1,2,…,n,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯子,你就可以获得奖品.花费c_ij元,魔术师就会告诉你杯子i,i+1,…,j底下藏有球的总数的奇偶性.采取最优的询问策略,你至少需要花费多少元,才能保证猜出哪些杯子底下藏着球? Input 第一行一个整数n(1<=n<=2000).第i+1行(1<=i<=n)有n+1-i个整数,表示每一种询问所需的花费.其中c_ij(对区间[i,j]进行询问的费用,

[BZOJ3714][PA2014]Kuglarz(MST)

题目: Description 魔术师的桌子上有n个杯子排成一行,编号为1,2,…,n,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯子,你就可以获得奖品.花费c_ij元,魔术师就会告诉你杯子i,i+1,…,j底下藏有球的总数的奇偶性.采取最优的询问策略,你至少需要花费多少元,才能保证猜出哪些杯子底下藏着球? Input 第一行一个整数n(1<=n<=2000).第i+1行(1<=i<=n)有n+1-i个整数,表示每一种询问所需的花费.其中c_ij(对区间[i,j]进行询问

【BZOJ 3714】 [PA2014]Kuglarz

3714: [PA2014]Kuglarz Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 329  Solved: 198 [Submit][Status] Description 魔术师的桌子上有n个杯子排成一行,编号为1,2,-,n,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯子,你就可以获得奖品.花费c_ij元,魔术师就会告诉你杯子i,i+1,-,j底下藏有球的总数的奇偶性. 采取最优的询问策略,你至少需要花费多少元,才能保证猜

3714. [PA2014]Kuglarz【最小生成树】

Description 魔术师的桌子上有n个杯子排成一行,编号为1,2,…,n,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯子,你就可以获得奖品.花费c_ij元,魔术师就会告诉你杯子i,i+1,…,j底下藏有球的总数的奇偶性. 采取最优的询问策略,你至少需要花费多少元,才能保证猜出哪些杯子底下藏着球? Input 第一行一个整数n(1<=n<=2000). 第i+1行(1<=i<=n)有n+1-i个整数,表示每一种询问所需的花费.其中c_ij(对区间[i,j]进行询问的费

BZOJ 3714 PA 2014 Kuglarz 最小生成树

题目大意:桌面上倒扣着一些杯子,在这些杯子的有一些杯子底下有小球.可以询问i到j号杯子下面共有多少个小球的奇偶性,花费c[i][j],问至少花费多少可以得知杯子下面小球的存在情况. 思路:看这个题怎么看怎么想小胖的奇偶,其实是一样的,只不过这个题是利用了那个题的结论.没做过的可以先做做那个题,用并查集维护一下.那么这个题就很裸了,只是一个最小生成树的过程. CODE: #include <cstdio> #include <cstring> #include <iostrea

BZOJ 3714: [PA2014]Kuglarz

呃..好像弃坑了好久=v=..本来打算在bzoj每刷10题合起来写一份题解..但是1个月好像还刷不到10题的样子(水题除外),所以还是单独写一下题解.. Description 魔术师的桌子上有n个杯子排成一行,编号为1,2,-,n,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯子,你就可以获得奖品.花费c_ij元,魔术师就会告诉你杯子i,i+1,-,j底下藏有球的总数的奇偶性.采取最优的询问策略,你至少需要花费多少元,才能保证猜出哪些杯子底下藏着球? Input 第一行一个整数n(1<