BZOJ3714: [PA2014]Kuglarz

Posted mt-li

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ3714: [PA2014]Kuglarz相关的知识,希望对你有一定的参考价值。

[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
 
 
吃着吃着课间餐,Star_Feel突然跑过来和我讲这道题
我咬着鸡扒,就只听到了最小生成树这个东西
正解也的确是,至于为什么,是要想上几分钟
利用前缀和的思想,那么其实有三种关系,知道其中两个就可以知道另一个
而最小生成树kruskal又把它们拉到了同一个家族里,所以跑出来的结果肯定是最小的正解
但是为什么Star_Feel的kruskal跑过去了我T了???
果然是人丑自带大常数
 
我的超时代码如下:
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
struct node{
    int x,y,next;
    ll d;
}a[4100000];int len;
bool cmp(node a,node b){return a.d<b.d;}
int fa[2100];
int findfa(int x)
{
    if(fa[x]!=x)fa[x]=findfa(fa[x]);
    return fa[x];
}
int main()
{
    int n;
    scanf("%d",&n);len=0;
    for(int i=1;i<=n;i++)
        for(int j=i;j<=n;j++)
        {
            ll x;
            scanf("%lld",&x);len++;
            a[len].x=i-1,a[len].y=j,a[len].d=x;
        }
    ll ans=0;
    sort(a+1,a+1+len,cmp);
    for(int i=0;i<=n;i++)fa[i]=i;
    for(int i=1;i<=len;i++)
    {
        int x=a[i].x,y=a[i].y;
        int fx=findfa(x),fy=findfa(y);
        if(fx!=fy)
        {
            ans+=a[i].d;
            fa[fx]=fy;
        }
    }
    printf("%lld\n",ans);
    return 0;
}

 

Star_Feel的AC代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std;
typedef long long LL;
LL c[2100][2100];
struct node
{
    int x,y;LL d;
}a[4100000];int len;
int fa[2100];
int findfa(int x)
{
    if(x!=fa[x]) fa[x]=findfa(fa[x]);
    return fa[x];
}
bool cmp(node n1,node n2)
{
    return n1.d<n2.d;
}
int main()
{
    int n;
    scanf("%d",&n);
    len=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=i;j<=n;j++)
        {
            len++;
            a[len].x=i-1;a[len].y=j;
            scanf("%lld",&a[len].d);
        }
    }
    for(int i=0;i<=n;i++) fa[i]=i;
    sort(a+1,a+len+1,cmp);
    LL ans=0;
    for(int i=1;i<=len;i++)
    {
        int fx=findfa(a[i].x),fy=findfa(a[i].y);
        if(fx!=fy)
        {
            fa[fx]=fy;
            ans+=a[i].d;
        }
    }
    printf("%lld\n",ans);
    return 0;
}

这tm哪有区别啊。。。。。

 

by_lmy

以上是关于BZOJ3714: [PA2014]Kuglarz的主要内容,如果未能解决你的问题,请参考以下文章

bzoj3714[PA2014]Kuglarz*

最小生成树 BZOJ3714 [PA2014]Kuglarz

bzoj 3714 [PA2014]Kuglarz 最小生成树

BZOJ3714[PA2014]Kuglarz 最小生成树

BZOJ3714: [PA2014]Kuglarz

BZOJ 3714: [PA2014]Kuglarz(最小生成树)