HDU-6437 Videos
题意:一天有n个小时,现在有m场电影,每场电影有一个愉悦值,有k个人,电影分2种类型A, B, 并且每一场电影只能一个人看, 一个人可以看无数次电影, 只要时间足够, 但是连续看同一种电影会减少愉悦值W点。现在要求所有人总的愉悦值加起来最大。
题解:
网络流建图,先把每个点拆成2个点, u 和 u‘ , 在u和u’中间连一条流量为1,费用为0的边, 现在我们规定 一个点的 复制点只能和本体链接, 只能由复制点往外流, 然后别的点流入只能留到本体。
也就是 假设 存在 u, v2个点, 这2个点之间可以存在边且为u->v 那么连线方式就为 u -> u' -> v -> v'。
因为每个电影看的人最多是1, 所以 u - > u' 的流量为1。
s -> s'的流量为k。
然后我们把s‘和所有的电影建边 流量为1, 花费为电影获得的愉悦值
然后把所有电影与t建边 流量为1,花费为0
然后我们把看完一场电影之后可以去看另一场电影的2个点建边,花费为下一次电影的愉悦值 - (是否为同一种类电影)* W。
由于是需要最大的愉悦值, 我们把花费取反, 然后跑费用流。 最后把答案取反。
代码:
- #include<bits/stdc++.h>
- using namespace std;
- #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
- #define LL long long
- #define ULL unsigned LL
- #define fi first
- #define se second
- #define pb push_back
- #define lson l,m,rt<<1
- #define rson m+1,r,rt<<1|1
- #define max3(a,b,c) max(a,max(b,c))
- #define min3(a,b,c) min(a,min(b,c))
- typedef pair<int,int> pll;
- const int INF = 0x3f3f3f3f;
- const LL mod = (int)1e9+;
- const int N = 1e5;
- const int M = ;
- int head[M], to[N], ct[N], w[N], nt[N];
- int d[M], vis[M];
- int pre[M], id[N];
- int n, m, s, t, tot;
- void add(int u, int v, int val, int cost){
- to[tot] = v;
- ct[tot] = -cost;
- w[tot] = val;
- nt[tot] = head[u];
- head[u] = tot++;
- to[tot] = u;
- ct[tot] = cost;
- w[tot] = ;
- nt[tot] = head[v];
- head[v] = tot++;
- }
- void init(){
- memset(head,-,sizeof(head));
- tot = ;
- }
- int spfa(){
- queue<int> q;
- memset(d, INF, sizeof(d));
- memset(vis, , sizeof(vis));
- memset(pre, -, sizeof(vis));
- d[s] = ;
- q.push(s);
- while(!q.empty()){
- int u = q.front(); q.pop();
- vis[u] = ;
- for(int i = head[u]; ~i; i = nt[i]){
- if(w[i] > && d[to[i]] > d[u] + ct[i]){
- d[to[i]] = d[u] + ct[i];
- pre[to[i]] = u;
- id[to[i]] = i;
- if(!vis[to[i]]){
- vis[to[i]] = ;
- q.push(to[i]);
- }
- }
- }
- }
- return d[t] < INF;
- }
- int MaxFlow(){
- int Mi = INF;
- int sum = ;
- while(spfa()){
- Mi = INF;
- for(int i = t; i != s; i = pre[i])
- Mi = min(Mi, w[id[i]]);
- for(int i = t; i != s; i = pre[i]){
- w[id[i]] -= Mi;
- w[id[i]^] += Mi;
- }
- sum += d[t];
- }
- return sum;
- }
- struct Node{
- int l, r, t, op;
- bool operator < (const Node & x) const {
- return l < x.l;
- }
- }A[N];
- int main(){
- int T, n, m, k, lost;
- scanf("%d", &T);
- while(T--){
- scanf("%d%d%d%d", &n, &m, &k, &lost);
- init();
- for(int i = ; i <= m; i++)
- scanf("%d%d%d%d", &A[i].l, &A[i].r, &A[i].t, &A[i].op);
- sort(A+, A++m);
- s = , t = * m+;
- for(int i = ; i <= m; i++){
- for(int j = i+; j <= m; j++){
- if(A[i].r <= A[j].l){
- add(m + i, j, , A[j].t - lost*(A[i].op == A[j].op));
- }
- }
- }
- add(s, * m + , k, );
- for(int i = ; i <= m; i++){
- add( * m + , i, , A[i].t);
- add(i, m + i, , );
- add(m + i, t, , );
- }
- printf("%d\n", -MaxFlow());
- }
- return ;
- }
HDU-6437 Videos的更多相关文章
- HDU 6437 Problem L.Videos (最大费用)【费用流】
<题目链接> 题目大意: 一天有N个小时,有m个节目(每种节目都有类型),有k个人,连续看相同类型的节目会扣w快乐值.每一种节目有都一个播放区间[l,r].每个人同一时间只能看一个节目,看 ...
- HDU - 6437:Videos (裸的费用流)
...懒得说什么了 #include<bits/stdc++.h> using namespace std; ; <<;int To[maxn],Laxt[maxn],Next ...
- HDU - 6437 Problem L.Videos 2018 Multi-University Training Contest 10 (最小费用最大流)
题意:M个影片,其属性有开始时间S,结束时间T,类型op和权值val.有K个人,每个人可以看若干个时间不相交的影片,其获得的收益是这个影片的权值val,但如果观看的影片相邻为相同的属性,那么收益要减少 ...
- HDU 6437 最(大) 小费用最大流
Problem L.Videos Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Other ...
- hdu 6437 /// 最小费用最大流 负花费 SPFA模板
题目大意: 给定n,m,K,W 表示n个小时 m场电影(分为类型A.B) K个人 若某个人连续看了两场相同类型的电影则失去W 电影时间不能重叠 接下来给定m场电影的 s t w op 表示电影的 开始 ...
- 【杂题总汇】HDU多校赛第十场 Videos
[HDU2018多校赛第十场]Videos 最后一场比赛也结束了…… +HDU传送门+ ◇ 题目 <简要翻译> 有n个人以及m部电影,每个人都有一个快乐值.每场电影都有它的开始.结束时间和 ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
- HDU 4569 Special equations(取模)
Special equations Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
随机推荐
- ElasticSearch6.x版本聚合分析整理
ElasticSearch6.x版本聚合分析整理 ES将聚合分析主要分为如下4类 Bucket,分桶类型,类似SQL中的GROUP BY语法 Metric,指标分析类型,如计算最大值 , 最小值,平均 ...
- java中System.out.println()打印输出结果
疑点:syso()是打印输出语句,打印的是什么? syso()不同情况下打印输出的结果不一样: 1. package com.briup; public class Syso { public sta ...
- Oracle_InstantClient 及PL/SQL Developer工具的安装
一.下载 InstantClient 地址: http://www.oracle.com/technology/software/tech/oci/instantclient/index.html i ...
- 使用 Docker 生成 Let’s Encrypt 证书
概念 什么是 Container ? https://www.docker.com/resources/what-container https://www.docker.com/why-docker ...
- Java中只有值传递,(及值传递与引用传递详解)
首先呢,我们来说一下值传递与引用传递的区别(这两个玩意儿实在调用函数的时候提到的) 比如说 code( a) code( int a ) code(a)是调用函数,a是我们原本函数的一个值类型,然后使 ...
- NAS
NAS, Network Attached Storage, 网络附属存储, 简单来说就是连接在网络上, 可以存储资料的装置.可以用来做私有网盘,同步各种设备的照片.视频.音频和文件. 常见的 NAS ...
- android——实现跨程序访问数据
使用之前的SQLite存储的应用程序.首先需要在这个应用程序中创建内容提供器,右击com.example.administrator.exp7包→New→Other→Content Provider, ...
- pycharm的安装配置及思维导图
1.1 计算机基础知识 主板:人的骨架,用于扩展设备的 cpu:人的大脑,用于计算和逻辑处理的 硬盘:存储数据(永久存储) 电源:人的心脏 内存:存储数据(临时存储) 断电即消失 操作系统 xp wi ...
- python 之 前端开发(基本选择器、组合选择器、 交集与并集选择器、序列选择器、属性选择器、伪类选择器、伪元素选择器)
11.3 css 11.31 基本选择器 11.311 id选择器 根据指定的id名称,在当前界面中找到对应的唯一一个的标签,然后设置属性 <!DOCTYPE html> <html ...
- Flutter学习笔记(15)--MaterialApp应用组件及routes路由详解
如需转载,请注明出处:Flutter学习笔记(15)--MaterialApp应用组件及routes路由详解 最近一段时间生病了,整天往医院跑,也没状态学东西了,现在是好了不少了,也该继续学习啦!!! ...