bzoj 3714 [PA2014]Kuglarz 最小生成树

[PA2014]Kuglarz

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 1335  Solved: 672
[Submit][Status][Discuss]

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]进行询问的费用,1<=i<=j<=n,1<=c_ij<=10^9)为第i+1行第j+1-i个数。

Output

输出一个整数,表示最少花费。

Sample Input

5
1 2 3 4 5
4 3 2 1
3 4 5
2 1
5

Sample Output

7

HINT

需要猜出所有球的的奇偶性,必须知道互相关联的n-1

条信息。所以是不是想到了最小生成树。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<queue>
 8 #include<set>
 9 #include<map>
10 #include<ext/pb_ds/priority_queue.hpp>
11 #define pa pair<int,int>
12 #define inf 1000000000
13 #define ll long long
14 using namespace std;
15 using namespace __gnu_pbds;
16 inline int read()
17 {
18     int x=0,f=1;char ch=getchar();
19     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
20     while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
21     return x*f;
22 }
23 int n;
24 ll ans;
25 int a[2005][2005],dis[2005];
26 bool vis[2005];
27 __gnu_pbds::priority_queue<pa,greater<pa> >::point_iterator id[2005];
28 void prim()
29 {
30     __gnu_pbds::priority_queue<pa,greater<pa> >q;
31     for(int i=1;i<=n;i++)dis[i]=inf;
32     dis[0]=0;
33     id[0]=q.push(make_pair(0,0));
34     while(!q.empty())
35     {
36         int now=q.top().second;q.pop();
37         ans+=dis[now];vis[now]=1;
38         for(int i=1;i<=n;i++)
39             if(a[now][i]<dis[i]&&!vis[i])
40             {
41                 dis[i]=a[now][i];
42                 if(id[i]==0)id[i]=q.push(make_pair(dis[i],i));
43                 else q.modify(id[i],make_pair(dis[i],i));
44             }
45     }
46 }
47 int main()
48 {
49     n=read();
50     for(int i=1;i<=n;i++)
51         for(int j=i;j<=n;j++)
52             a[i-1][j]=a[j][i-1]=read();
53     prim();
54     printf("%lld",ans);
55 }

原文地址:https://www.cnblogs.com/fengzhiyuan/p/8759155.html

时间: 2024-11-06 15:54:30

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

BZOJ 3714: [PA2014]Kuglarz

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

【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个整数,表示每一种询问所需的

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]进行询问的费

bzoj3714 [PA2014]Kuglarz 最小生成树

题面: 魔术师的桌子上有$n$个杯子排成一行,编号为$1,2,…,n$,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯子,你就可以获得奖品. 花费$c_ij$元,魔术师就会告诉你杯子$i,i+1,…,j$底下藏有球的总数的奇偶性. 采取最优的询问策略,你至少需要花费多少元,才能保证猜出哪些杯子底下藏着球? 我们可以把前$i$个杯子的球的奇偶关系看做一个点$S[i]$ 那么,原题相当于最小生成树 使用$prim$算法可以做到$O(n^2)$ #include <vector> #incl

【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底下藏有球的总数的奇偶性. 采取最优的询问策略,你至少需要花费多少元,才能保证猜

最小生成树 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 PA 2014 Kuglarz 最小生成树

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

BZOJ 3709: [PA2014]Bohater

题目 3709: [PA2014]Bohater Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 507  Solved: 163[Submit][Status] Description 在一款电脑游戏中,你需要打败n只怪物(从1到n编号).为了打败第i只怪物,你需要消耗d[i]点生命值,但怪物死后会掉落血药,使你恢复a[i]点生命值.任何时候你的生命值都不能降到0(或0以下).请问是否存在一种打怪顺序,使得你可以

BZOJ 1937: [Shoi2004]Mst 最小生成树 [二分图最大权匹配]

传送门 题意: 给一张无向图和一棵生成树,改变一些边的权值使生成树为最小生成树,代价为改变权值和的绝对值,求最小代价 线性规划的形式: $Min\quad \sum\limits_{i=1}^{m} \delta_i$ $Sat\quad $非树边边权$\ge$生成树上路径任何一条边的边权 $i$非树边$j$树边 $w_i+\delta_i \ge w_j-\delta_j$ 然后可以转化成二分图最小顶标和来求解 这里需要求二分图最大权非完美匹配,我的做法是遇到$d[t] < 0$就退出,反正这