蒟蒻又回来写题解了。。。

题面

幼儿园里有 N 个小朋友, lxhgww 老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果。
但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候, lxhgww 需要满足小朋友们的 K 个要求。
幼儿园的糖果总是有限的, lxhgww 想知道他至少需要准备多少个糖果,才能使得每个小朋友都能够分到糖果,并且满足小朋友们所有的要求。

输入格式

输入的第一行是两个整数 N, K 。
接下来 K 行,表示这些点需要满足的关系,每行 33 个数字, x , A , B 。
如果 X=1 .表示第 A 个小朋友分到的糖果必须和第 B 个小朋友分到的精果一样多。
如果 X=2 ,表示第 A 个小朋友分到的糖果必须少于第 B 个小朋友分到的糖果。
如果 X=3 ,表示第 A 个小朋友分到的糖果必须不少于第 B 个小朋友分到的糖果。
如果 X=4 ,表示第 A 个小朋友分到的糖果必须多于第 B 个小朋友分到的糖果。
如果 X=5 ,表示第 A 个小朋友分到的糖果必须不多于第 B 个小朋友分到的糖果。

输出格式

输出一行,表示 lxhgww 老师至少需要准备的糖果数,如果不能满足小朋友们的所有要求,就输出 -1。

思路

神仙题(不是思路,而是卡时神仙。。。)

不过还是先看思路。。。

由x==1时可得A==B,就是两边相等,建一条a到b权为0的双向边。

由x==2时可得A<B,所以要让A+x(x>=1)>B,建一条a到b权为1的单向边。

由x==3时可得A>=B,所以要让B+x(x>=0)>=A,建一条b到a权为0的单向边。

由x==4时可得A>B,所以要让B+x(x>=1)>A,建一条b到a权为1的单向边。

由x==5时可得A<=B,所以要让A+x(x>=0)>=B,建一条a到b权为0的单向边。

然后根据不等式同大取大,跑个SPFA最长路(顺便判个环)就行了(然后没A)。

???

万一x==2||x==4时A==B呢?你还要再跑一遍???直接特判cout<<-1<<endl;return 0;

万一爆int呢?开long long吧

万一。。。这个真没想到。。。

先看一下90分代码

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
];
],cnt=,N,K;
];
],tot[];
inline long long read() {
    ,f=;char ch=getchar();
    ') {if (ch=='-') f=-f;ch=getchar();}
    +ch-',ch=getchar();
    return ret*f;
}
void add(long long a,long long b,long long c)
{
    Edge[++cnt].next=head[a];
    Edge[cnt].to=b;
    Edge[cnt].dis=c;
    head[a]=cnt;
}
void SPFA(long long s)
{
    ;i<=N;i++) vis[i]=,dis[i]=-2e9,tot[i]=;
    queue<int> q;
    q.push(s); vis[s]=; dis[s]=; tot[s]++;
    while(!q.empty())
    {
        long long u=q.front();
        q.pop();
        vis[u]=;
        for (long long i=head[u];i;i=Edge[i].next)
        {
            long long v=Edge[i].to;
            if (dis[v]<dis[u]+Edge[i].dis)
            {
                dis[v]=dis[u]+Edge[i].dis;
                ;
                else if (tot[v]>=N)
                {
                cout<<-<<endl;
                exit();
                return;
                }
            }

        }
    }
}
int main()
{
    N=read();K=read();
    ;i<=K;i++)
    {
        long long X,A,B;
        X=read();A=read();B=read();
        ) add(A,B,),add(B,A,);
        )
        <<endl;;}
        );
        ) add(B,A,);
        )
        <<endl;;}
        );
        ) add(A,B,);
    }
    ;
    ;i<=N;i++) add(s,i,);
    SPFA(s);
    ;
    ;i<=N;i++) ans+=dis[i];
    cout<<ans<<endl;
    ;
}

再看一下100代码

#include<bits/stdc++.h>
using namespace std;
];
],cnt=,N,K;
];
],tot[];
inline long long read() {
    ,f=;char ch=getchar();
    ') {if (ch=='-') f=-f;ch=getchar();}
    +ch-',ch=getchar();
    return ret*f;
}
void add(long long a,long long b,long long c)
{
    Edge[++cnt].next=head[a];
    Edge[cnt].to=b;
    Edge[cnt].dis=c;
    head[a]=cnt;
}
void SPFA(long long s)
{
    ;i<=N;i++) vis[i]=,dis[i]=-,tot[i]=;
    queue<long long> q;
    q.push(s); vis[s]=; dis[s]=; tot[s]++;
    while(!q.empty())
    {
        long long u=q.front();
        q.pop();
        vis[u]=;
        for (long long i=head[u];i;i=Edge[i].next)
        {
            long long v=Edge[i].to;
            if (dis[v]<dis[u]+Edge[i].dis)
            {
                dis[v]=dis[u]+Edge[i].dis;
                ;
                else if (tot[v]>=N)
                {
                cout<<-<<endl;
                exit();
                return;
                }
            }

        }
    }
}
int main()
{
    N=read();K=read();
    ;i<=K;i++)
    {
        long long X,A,B;
        X=read();A=read();B=read();
        ) add(A,B,),add(B,A,);
        )
        {
        <<endl;;}
        );
        }
        ) add(B,A,);
        )
        {
        <<endl;;}
        );
        }
        ) add(A,B,);
    }
    ;
    ;i--) add(s,i,);//神仙优化,看到就是赚到
    SPFA(s);
    ;
    ;i<=N;i++) ans+=dis[i];
    cout<<ans<<endl;
    ;
}

。。。等待dalao解答

「SCOI2011」糖果的更多相关文章

  1. 「WC2013」糖果公园

    「WC2013」糖果公园 传送门 树上带修莫队板子题. 看懂题意后就是板子题了. 参考代码: #include <algorithm> #include <cstdio> #i ...

  2. LG2512/BZOJ1045 「HAOI2008」糖果传递 中位数

    问题描述 LG2512 BZOJ1045 题解 这是一个链状问题的环状版本. 问题最终变为给定数轴上的\(n\)个点,找出一个到他们的距离之和尽量小的点,而这个点就是这些数中的中位数. 网络流24题的 ...

  3. 「SCOI2011」棘手的操作

    传送门 Description 有\(N\)个节点,标号从\(1\)到\(N\),这\(N\)个节点一开始相互不连通.第$ i\(个节点的初始权值为\)a_i$ ,接下来有如下一些操作: U x y ...

  4. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  5. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  6. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  7. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

  8. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

  9. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

随机推荐

  1. MySQL : 数据库和表的基本操作总结

    针对database和table的操作大致可分为三类:创建,查询,修改,删除 1. 创建 create ①创建数据库 create database db_name; ②创建表 create tabl ...

  2. 【设计模式】—— 中介者模式Mediator

    前言:[模式总览]——————————by xingoo 模式意图 使用一个中介的对象,封装一组对象之间的交互,这样这些对象就可以不用彼此耦合. 这个中介者常常起着中间桥梁的作用,使其他的对象可以利用 ...

  3. 【设计模式】—— 职责链模式ChainOfResponsibility

    前言:[模式总览]——————————by xingoo 模式意图 避免请求的发送者,和接受者过度的耦合在一起.一个请求者只需要发送一个请求即可,它的请求具体由后面哪个对象进行响应,并不需要关心.而请 ...

  4. Antenna Placement POJ - 3020 (最小边集覆盖)

    Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10699   Accepted: 526 ...

  5. 解题:CF1130E Wrong Answer

    题面 巧妙构造题 这种题一定要限制一个条件,使得在这个条件下能推出要叉的代码的式子 令序列$a$的第一个元素为负,其余元素为正,且保证序列中至少有两个元素,那么Alice的代码将会从第二个元素开始计算 ...

  6. 洛谷P3721 单旋

    什么毒瘤...... 题意:模拟一棵单旋splay,求每次插入,splay最值,删除最值的操作次数. 解:乍一看感觉很神,又因为是LCT题单上的,然后就折磨了我好久,最后跑去看题解... 居然是手玩找 ...

  7. Delphi 的内存操作函数(5): 复制内存

    MoveMemory.CopyMemory 的功能类似, 都是复制内存, 都是调用 Move 过程; MoveMemory.CopyMemory 操作指针; Move 操作实体. 还要注意, 它们的参 ...

  8. oracle:delete和truncate

    oracle中清空表数据的两种方法 1.delete from t 2 .truncate table t 区别: 1.delete是dml操作:truncate是ddl操作,ddl隐式提交不能回滚 ...

  9. Excel:公式应用技巧汇总

    1.合并单元格添加序号:=MAX(A$1:A1)+1 不重复的个数: 公式1:{=SUM(1/COUNTIF(A2:A8,A2:A8))} 公式2:{=SUM(--(MATCH(A2:A8,A2:A8 ...

  10. Scala进阶之路-高级数据类型之数组的使用

    Scala进阶之路-高级数据类型之数组的使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组的初始化方式 1>.长度不可变数组Array 注意:顾名思义,长度不可变数 ...