Codeforces737E. Tanya is 5!
$n \leq 40$个人玩$m \leq 10$台游戏机,每台游戏机一秒内只能一人玩,每人一秒内只能玩一台。每台游戏机有个价格,在规定总价格内可以把一部分游戏机复制一次,每台只能复制一次。给每个人对在每台游戏机上的需求时间,求一种方案使得所有玩游戏结束的时间尽量早。每个人每台游戏需求时间$\leq 2500$。
先不考虑复制。$R_i$表示人$i$玩游戏总时间,$C_j$表示机器$j$被玩总时间。可以发现答案的下界是$max(max(R_i),max(C_j))$,叫$T$。然后把人和机器建一个二分图,保证每个点的度数为$T$,就能在上面不停地做最大匹配,就可以把答案定为$T$。这里这么搞:左边$n$个人和$m$个假人,右边$m$台机器和$n$个假机器,假的东西用来补度数。然后,两边会连四种边:(1)真人真机器,连很多条边,边数为对应时间(其实可以连一条边记一个边权);(2)假人真机器,如果那个机器的度数不到$T$,那它肯定有一段空闲时间为$T-C_j$,这么多条边连向他对应的假人;(3)真人假机器,同(2);(4)假人假机器,这时假人和假机器的度数不到$T$,可以把真人真机器的图复制一遍把每个点度数补到$T$。把“连很多条边”搞成“连一条边,记个边权”,每次做完最大匹配后把所有边权减去匹配边中最小的那一个,然后把边权为0的边删掉。此时如果一条匹配边左右两边都是真人真机器,把这个操作记录下来,以此输出方案。
然后是钱的问题。当$T$为某个$C_j$时钱有用,此时若有钱就复制他,把机器的被玩时间均分成两份,使得$T$变小。
//#include<iostream>
#include<cstring>
#include<cstdio>
//#include<time.h>
//#include<complex>
//#include<set>
//#include<queue>
//#include<vector>
#include<algorithm>
#include<stdlib.h>
using namespace std; #define LL long long
int qread()
{
char c; int s=,f=; while ((c=getchar())<'' || c>'') (c=='-') && (f=-);
do s=s*+c-''; while ((c=getchar())>='' && c<=''); return s*f;
} //Pay attention to '-' , LL and double of qread!!!! int n,m,B;
int a[],t[][],R[],C[]; bool co[];
struct Node{int a,b,c,d;}ans[]; int lans=; struct BG
{
int mp[][],p[],q[],n; bool vis[];
void clear(int N) {n=N;}
bool Pei(int x)
{
vis[x]=;
for (int i=;i<=n;i++) if (mp[x][i] && !q[i])
{
p[x]=i; q[i]=x;
return ;
}
for (int i=;i<=n;i++) if (mp[x][i] && q[i] && !vis[q[i]] && Pei(q[i]))
{
p[x]=i; q[i]=x;
return ;
}
return ;
}
void pei(int x) {memset(vis,,sizeof(vis)); Pei(x);}
}g; int main()
{
n=qread(); m=qread(); B=qread();
for (int i=;i<=m;i++) a[i]=qread();
for (int i=,x;i<=n;i++)
{
x=qread();
for (int j=,u,v;j<=x;j++)
{
u=qread(); v=qread();
t[i][u]=v;
}
} for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
R[i]+=t[i][j],C[j]+=t[i][j];
int T=,maxr=;
for (int i=;i<=n;i++) maxr=max(maxr,R[i]);
for (int j=;j<=m;j++) T=max(T,C[j]); T=max(T,maxr);
while (B)
{
int id=;
for (int j=;j<=m;j++) if (T==C[j] && co[j]) {id=-; break;}
if (id==-) break;
for (int j=;j<=m;j++) if (T==C[j]) {id=j; break;}
if (!id) break;
if (a[id]>B) break; int tot=T>>;
for (int i=;i<=n;i++)
{
if (tot<t[i][id]) {t[i][id+m]=tot; t[i][id]-=tot; break;}
else {tot-=t[i][id]; t[i][id+m]=t[i][id]; t[i][id]=;}
} co[id]=; B-=a[id];
C[id]=; for (int i=;i<=n;i++) C[id]+=t[i][id];
C[id+m]=; for (int i=;i<=n;i++) C[id+m]+=t[i][id+m];
T=; for (int j=;j<=m;j++) T=max(T,C[j]); T=max(T,maxr);
} g.clear(n+m+m);
for (int i=;i<=n;i++)
for (int j=;j<=m+m;j++) if (t[i][j])
g.mp[i][j]=g.mp[j+n][i+m+m]=t[i][j];
for (int i=;i<=n;i++) if (R[i]<T) g.mp[i][i+m+m]=T-R[i];
for (int j=;j<=m+m;j++) if (C[j]<T) g.mp[j+n][j]=T-C[j]; printf("%d\n",T);
for (int j=;j<=m;j++) printf("%d",co[j]); puts("");
lans=;
for (int i=;i<=n+m+m;i++) g.pei(i);
while (T)
{
int tmp=0x3f3f3f3f;
for (int i=;i<=n+m+m;i++) tmp=min(tmp,g.mp[i][g.p[i]]);
for (int i=;i<=n;i++) if (g.p[i]<=m+m)
ans[++lans]=(Node){i,g.p[i]<=m?g.p[i]:g.p[i]-m,T-tmp,tmp};
for (int i=;i<=n+m+m;i++) g.mp[i][g.p[i]]-=tmp;
for (int i=;i<=n+m+m;i++) if (g.mp[i][g.p[i]]==) {g.q[g.p[i]]=; g.p[i]=; g.pei(i);}
T-=tmp;
} printf("%d\n",lans);
for (int i=;i<=lans;i++) printf("%d %d %d %d\n",ans[i].a,ans[i].b,ans[i].c,ans[i].d);
return ;
}
Codeforces737E. Tanya is 5!的更多相关文章
- CodeForces 518B. Tanya and Postcard
B. Tanya and Postcard time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- codeforces 518B. Tanya and Postcard 解题报告
题目链接:http://codeforces.com/problemset/problem/518/B 题目意思:给出字符串 s 和 t,如果 t 中有跟 s 完全相同的字母,数量等于或者多过 s,就 ...
- Codeforces Round #288 (Div. 2)D. Tanya and Password 欧拉通路
D. Tanya and Password Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/508 ...
- CF Tanya and Postcard
Tanya and Postcard time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces Round #324 (Div. 2) B. Kolya and Tanya 快速幂
B. Kolya and Tanya Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/584/pro ...
- CodeForces - 508D Tanya and Password(欧拉通路)
Description While dad was at work, a little girl Tanya decided to play with dad characters. She has ...
- Codeforces Round #346 (Div. 2) C Tanya and Toys
C. Tanya and Toys 题目链接http://codeforces.com/contest/659/problem/C Description In Berland recently a ...
- 2016NEFU集训第n+3场 G - Tanya and Toys
Description In Berland recently a new collection of toys went on sale. This collection consists of 1 ...
- codeforce round#466(div.2) B. Our Tanya is Crying Out Loud
B. Our Tanya is Crying Out Loud time limit per test1 second memory limit per test256 megabytes input ...
随机推荐
- Mybatis-Generator逆向生成Po,Mapper,XMLMAPPER(idea)
前文有一篇手工生成的说明,地址: http://www.cnblogs.com/xiaolive/p/4874605.html, 现在这个补充一下在idea里面的自动版本的数据库逆向生成工具: 一.g ...
- Higher level thinking
「Higher level thinking」-- 出自 Ray Dalio 的<Principles>(PDF 原文:Principles by Ray Dalio) Higher le ...
- 讲课笔记3——CSS
背景常见样式: width:600px; height:800px; background: url(bg.jpg) no-repeat 40px 20px fixed gray ; * ...
- python基础一 day10(1)
要背的:
- BZOJ1009: [HNOI2008]GT考试 (矩阵快速幂 + DP)
题意:求一个长度为n的数字字符串 (n <= 1e9) 不出现子串s的方案数 题解:用f i,j表示长度为i匹配到在子串j的答案 用kmp的失配函数预处理一下 然后这个转移每一个都是一样的 所以 ...
- 给 MSYS2 添加国内源
https://wiki.qt.io/MSYS2pacman -S base-devel git mercurial svn wget p7zip软件包 开发包 http://mirrors.ustc ...
- css3中animation属性animation-timing-function知识点以及其属性值steps()
在animation中最重要的其实就是时间函数(animation-timing-function)这个属性,他决定了你的动画将以什么样的速度执行,所以最关键的属性值也就是cubic-bezier(n ...
- x220 OS X 10.10.4安装
变色龙安装过程: 1.使用磁盘助手将按照盘写入独立的磁盘分区(AF格式,就是Apple的HPS格式): 2.安装启动时,用-v -f -x参数,分别为显示信息.重新build系统驱动.安全模式: 3. ...
- (29)zabbix执行远程命令
概述 监控,有的人只把他当做报警使用,出现问题之后打开跑回家打开电脑,巴拉巴拉的处理掉,大多数时候都是一些小问题,为何不让zabbix帮你把这些事情处理掉呢?和朋友具体,收到xx硬盘空间慢了.xx服务 ...
- 组队赛Day1第一场 GYM 101350 F. Monkeying Around(线段树)
[题目大意] 有n只猴子坐在树上,m个笑话. 给出每个讲这个笑话的猴子的编号,笑话的编号,和笑话的影响半径. 如果一个树上的猴子听了没听过的笑话,会掉到树下.如果听过并且在树下,就会爬到树上. 问最后 ...