刷题总结——分糖果(bzoj2330)
题目:
Description
幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果。但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候,lxhgww需要满足小朋友们的K个要求。幼儿园的糖果总是有限的,lxhgww想知道他至少需要准备多少个糖果,才能使得每个小朋友都能够分到糖果,并且满足小朋友们所有的要求。
Input
输入的第一行是两个整数N,K。
接下来K行,表示这些点需要满足的关系,每行3个数字,X,A,B。
如果X=1, 表示第A个小朋友分到的糖果必须和第B个小朋友分到的糖果一样多;
如果X=2, 表示第A个小朋友分到的糖果必须少于第B个小朋友分到的糖果;
如果X=3, 表示第A个小朋友分到的糖果必须不少于第B个小朋友分到的糖果;
如果X=4, 表示第A个小朋友分到的糖果必须多于第B个小朋友分到的糖果;
如果X=5, 表示第A个小朋友分到的糖果必须不多于第B个小朋友分到的糖果;
Output
输出一行,表示lxhgww老师至少需要准备的糖果数,如果不能满足小朋友们的所有要求,就输出-1。
Sample Input
1 1 2
2 3 2
4 4 1
3 4 5
5 4 5
2 3 5
4 5 1
Sample Output
HINT
【数据范围】
对于30%的数据,保证 N<=100
对于100%的数据,保证 N<=100000
对于所有的数据,保证 K<=100000,1<=X<=5,1<=A, B<=N
题解:
差分约束模板题目·····只是注意怎样处理等于的情况就可以了
代码:
- #include<iostream>
- #include<cstdio>
- #include<cstdlib>
- #include<cmath>
- #include<ctime>
- #include<cctype>
- #include<cstring>
- #include<string>
- #include<algorithm>
- #include<queue>
- using namespace std;
- const int N=1e5+;
- queue<int>que;
- int first[N],next[N*],go[N*],val[N*],tot=;
- int cnt[N],n,k;
- long long dis[N];
- bool insta[N];
- inline void comb(int a,int b,int c)
- {
- next[++tot]=first[a],first[a]=tot,go[tot]=b,val[tot]=c;
- }
- inline bool spfa()
- {
- insta[]=true,cnt[]=;
- que.push();
- while(!que.empty())
- {
- int u=que.front();
- que.pop();
- insta[u]=false;
- for(int e=first[u];e;e=next[e])
- {
- int v=go[e];
- if(dis[v]<dis[u]+val[e])
- {
- dis[v]=dis[u]+val[e];
- if(!insta[v])
- {
- cnt[v]++;
- if(cnt[v]==n+) return false;
- insta[v]=true,que.push(v);
- }
- }
- }
- }
- return true;
- }
- int main()
- {
- //freopen("a.in","r",stdin);
- scanf("%d%d",&n,&k);
- int a,b,x;
- for(int i=;i<=k;i++)
- {
- scanf("%d%d%d",&x,&a,&b);
- if(x==)
- {
- comb(a,b,);
- comb(b,a,);
- continue;
- }
- if(x==)
- {
- if(a==b)
- {
- cout<<"-1"<<endl;
- return ;
- }
- comb(a,b,);
- continue;
- }
- if(x==)
- {
- comb(b,a,);
- continue;
- }
- if(x==)
- {
- if(a==b)
- {
- cout<<"-1"<<endl;
- return ;
- }
- comb(b,a,);
- continue;
- }
- if(x==)
- {
- comb(a,b,);
- continue;
- }
- }
- for(int i=n;i>=;i--)
- comb(,i,);
- if(spfa())
- {
- long long ans=;
- for(int i=;i<=n;i++)
- ans+=dis[i];
- cout<<ans<<endl;
- }
- else
- cout<<"-1"<<endl;
- return ;
- }
刷题总结——分糖果(bzoj2330)的更多相关文章
- 刷题总结——分糖(ssoj 容斥原理+逆元+快速幂+组合数求插板)
题目: 题目描述 有 N 个(相同的)糖果,M 个(不同的)小朋友.M 和 N 满足:1≤M≤N≤100000(105).要求:1.每个小朋友都至少有一个糖果.2.不存在正整数 X(X>=2), ...
- C#LeetCode刷题之#575-分糖果(Distribute Candies)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3798 访问. 给定一个偶数长度的数组,其中不同的数字代表着不同种 ...
- C#LeetCode刷题-哈希表
哈希表篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 42.8% 简单 3 无重复字符的最长子串 24.2% 中等 18 四数之和 ...
- LeetCode刷题总结-双指针、位运算和分治法篇
本文总结LeetCode上有关双指针.位运算和分治法的算法题,推荐刷题总数14道.具体考点分析如下图: 一.双指针 1.字符串和数组问题 题号:424. 替换后的最长重复字符,难度中等 题号:828. ...
- NOI题库分治算法刷题记录
今天晚自习机房刷题,有一道题最终WA掉两组,极其不爽,晚上回家补完作业欣然搞定它,特意来写篇博文来记录下 (最想吐槽的是这个叫做分治的分类,里面的题目真的需要分治吗...) 先来说下分治法 分治法的设 ...
- HDU 自动刷题机 Auto AC (轻轻松松进入HDU首页)
前言: 在写这篇文章之前,首先感谢给我思路以及帮助过我的学长们 以下4篇博客都是学长原创,其中有很多有用的,值得学习的东西,希望能够帮到大家! 1.手把手教你用C++ 写ACM自动刷题神器(冲入HDU ...
- P1707 刷题比赛
P1707 刷题比赛 10通过 38提交 题目提供者nodgd 标签倍增递推矩阵洛谷原创 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 不科学 题目背景 nodgd是一个喜欢写程序的同学, ...
- leetcode 算法刷题(一)
今天开始刷Leetcode上面的算法题.我会更新我刷题过程中提交的代码(成功和不成功的都有)和比较好的解法 第二题 Add Two Numbers 题目的意思:输入两个链表,这两个链表都是倒序的数字, ...
- 教你用python写:HDU刷题神器
声明:本文以学习为目的,请不要影响他人正常判题 HDU刷题神器,早已被前辈们做出来了,不过没有见过用python写的.大一的时候见识了学长写这个,当时还是一脸懵逼,只知道这玩意儿好屌-.时隔一年,决定 ...
随机推荐
- Does Little'law really applicable to apply performance model now?
上次提到Little定律, 我也解释过它跟另外一个公式有一些内在的关系,但是其实我自己对LL在当前复杂架构系统中到底是怎么应用的也没有完整的想法,于是我在Linkedin上把这个问题抛了出来,没有想到 ...
- PG extract 函数示例
pg 对时间的处理还是很灵活的, + - * / 都有支持 期间有个extract 函数还是很有用的,我们先来看看几个例子:[code] postgres=# select extract(epoc ...
- 宠溺旧习,win10清单-配置与软件
从win98到win7塑就的旧“习 不是一两天能随了win10的任性 输入法反win X的头疼与苦恼 开机总要输密码的麻烦与滋扰 还有着一些莫名其妙的问题, 在过往与如今的交织间错乱. -序 好吧,其 ...
- Windows 8.1 explorer.exe 出错 “Application Hang”
不知道为什么explorer常常会卡一下 看系统日志发现有来源于“Application Hang”的错误 部分常规信息: 程序 explorer.exe 版本 6.3.9600.17415 停止与 ...
- (五)mybatis之下载与基本构成
1. 下载MyBatis. 输入网址:https://github.com/mybatis/mybatis-3/releases 进入Mybatis下载页面,选择第一个选项,然后就可以加载到myba ...
- NSCopying协议和copy方法
不是所有的对象都支持 copy需要继承NSCopying 协议(实现 copyWithZone: 方法)同样,需要继承NSMutableCopying 协议才可以使用mutableCopy(实现 mu ...
- .net MVC下跨域Ajax请求(CORS)
二.CROS (Cross-origin Resource Sharing) CROS相当于一种协议,由浏览器.服务端共同完成安全验证,进行安全的跨域资源共享.对于开发人员来说就跟在本站AJAX请求一 ...
- RLock(递归锁)
import threading, time def run1(): print("grab the first part data") lock.acquire()#进入大门后的 ...
- python之文件读写操作(r/r+/rb/w/w+/wb/a/a+/ab)的作用
'r':只读.该文件必须已存在. 'r+':可读可写.该文件必须已存在,写为追加在文件内容末尾. 'rb':表示以二进制方式读取文件.该文件必须已存在. 'w':只写.打开即默认创建一个新文件,如果文 ...
- 关于“xx.xx已被OS X使用,无法打开”的问题
Mac电脑上的文件拷贝到移动硬盘,有时候会出现“xx.xx已被OS X使用,无法打开”的问题. 解决办法: 1.打开终端(或在Mac搜索里面输入Terminal); 2.在终端里输入 xattr -l ...