Bubble Cup 8 finals C. Party (575C)
题意:
给定n个人,分两天晚上去夜总会开派对,要求每天恰好有n/2个人去,且每人去的夜总会各不相同。
每个人对不同的晚上不同的夜总会有不同的满意度,求一个方案使得所有人的满意度之和最大。
夜总会数量=人的数量=n,2<=n<=20,且n是偶数。
0<=每一项满意度<=10^6。
时间限制2s,空间限制4MB。
题解:
在这题上卡了很久…
初看这题觉得是费用流…写完发现图建错了…
然后改成暴力枚举哪些人在第一天晚上去再跑费用流…
每个人只和对应晚上的夜总会连边,然后两天晚上的夜总会再连到一个辅助点,再连到汇…
就避免了跑出来的东西有两人在不同的晚上去同一个夜总会…
理所当然地超时了…
后来换成比较擅长这种图的zkw费用流…快了很多,但还是严重超时…
然后开始怀疑自己的做法…试图写DP…很快放弃了…
然后突然发现自己之前建图时傻掉了,枚举夜总会在哪个晚上有人就可以把图变成二分图…
于是改改改…改成KM…还是严重超时…大数据跑100s…
于是弃疗了…去膜拜Tourist的代码…结果发现就是KM…只不过是非递归的KM…
都是KM…差距就是这么大…
主要原因就是点是一个个加进二分图的,如果在最后跑KM,就完全没有用到子图的信息…
用非递归KM的话…一层层下去,冗余运算就减少了很多。
简单来说这题的做法就是:
枚举夜总会,一边向图中加点一边跑KM,然后就可以了…(CF评测机快,2s可过…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 #include <cstdio>
#include <cstring>
#define mv(a,b) memcpy(a,b,(n<<2)+4)
inline int read()
{
int s = ; char c; while((c=getchar())<'0'||c>'9');
do{s=s*+c-'0';}while((c=getchar())>='0'&&c<='9');
return s;
}
const int N = , INF = 0x7f7f7f7f;
int n,n2,w1[N][N],w2[N][N],w[N][N],ans,tans,lx[N],ly[N],sl[N],lk[N],pat[N];
bool by[N];
void dfs(int nn,int d1,int d2)
{
if(nn>n){ if(ly[]>ans) ans = ly[]; return; }
int _lx[N],_ly[N],_lk[N],_a,i,cy,cx,ny;
for(int ch=;ch<;ch++)
{
if(d1==n2&&ch==) continue;
if(d2==n2&&ch==) continue;
mv(_lx,lx), mv(_ly,ly), mv(_lk,lk);
if(ch) mv(w[nn],w1[nn]); else mv(w[nn],w2[nn]);
memset(sl,0x7f,(n<<)+), memset(by,,n+);
cy = ; lk[] = nn;
while(lk[cy])
{
by[cy] = ; cx = lk[cy]; int tmp = INF;
for(i=;i<=n;i++)
if(!by[i])
{
int t = -lx[cx]-ly[i]-w[cx][i];
if(t<sl[i]) sl[i] = t, pat[i] = cy;
if(sl[i]<tmp) tmp = sl[i], ny = i;
}
for(i=;i<=n;i++)
{
if(by[i]) lx[lk[i]] += tmp, ly[i] -= tmp;
else sl[i] -= tmp;
}
cy = ny;
}
while(cy) lk[cy] = lk[pat[cy]], cy = pat[cy];
dfs(nn+,d1+(ch),d2+(ch^));
mv(lx,_lx), mv(ly,_ly), mv(lk,_lk);
}
}
int main()
{
int i,j;
n2 = (n = read())>>;
for(i=;i<=n;i++) for(j=;j<=n;j++) w1[i][j] = read();
for(i=;i<=n;i++) for(j=;j<=n;j++) w2[i][j] = read();
dfs(,,);
printf("%d\n",ans);
return ;
}
Bubble Cup 8 finals C. Party (575C)的更多相关文章
- Bubble Cup 12 - Finals Online Mirror, unrated, Div. 1
Bubble Cup 12 - Finals Online Mirror, unrated, Div. 1 C. Jumping Transformers 我会状压 DP! 用 \(dp[x][y][ ...
- Bubble Cup 11 - Finals [Online Mirror, Div. 1]题解 【待补】
Bubble Cup 11 - Finals [Online Mirror, Div. 1] 一场很好玩的题啊! I. Palindrome Pairs 枚举哪种字符出现奇数次. G. AI robo ...
- Bubble Cup 8 finals I. Robots protection (575I)
题意: 有一个正方形区域, 要求支持两个操作: 1.放置三角形,给定放置方向(有4个方向,直角边与坐标轴平行),直角顶点坐标,边长 2.查询一个点被覆盖了多少次 1<=正方形区域边长n<= ...
- Bubble Cup 8 finals H. Bots (575H)
题意: 简单来说就是生成一棵树,要求根到每个叶子节点上的路径颜色排列不同, 且每条根到叶子的路径恰有n条蓝边和n条红边. 求生成的树的节点个数. 1<=n<=10^6 题解: 简单计数. ...
- Bubble Cup 8 finals G. Run for beer (575G)
题意: 给定一个带权无向图,每条边的代价为边权/当前速度,每次到达一个新节点,速度都会除以10. 求0号点到n-1号点的最小代价,如果多解输出点数最少的解,输出代价.路径点数.路径经过的点. 1< ...
- Bubble Cup 8 finals F. Bulbo (575F)
题意: 给定初始位置,查询n次区间,每次查询前可以花费移动距离的代价来移动, 查询时需要花费当前位置到区间内最近的点的距离,求最小代价. 1<=n<=5000,1<=所有位置< ...
- Bubble Cup 8 finals E. Spectator Riots (575E)
题意: 一个长宽是100000单位的球场上有很多暴动的观众,每个观众都有一个速度v, 在一秒内,观众会等概率地移动到与原位置的曼哈顿距离<=v的地方(不会移动到界外). 你需要选取三个位置,这三 ...
- Bubble Cup 8 finals D. Tablecity (575D)
题意: (无输入,纯输出题) 一个城市用1000列2行的格子表示,一个小偷藏在城市的某一处. 在每一小时的开始, 在(X, Y)位置的小偷可以移动到 (X - 1, Y), (X + 1, Y),(X ...
- Bubble Cup 8 finals B. Bribes (575B)
题意: 给定一棵n个点和有向边构成的树,其中一些边是合法边,一些边是非法边, 经过非法边需要1的费用,并且经过之后费用翻倍. 给定一个长为m的序列,问从点1开始按顺序移动到序列中对应点的总费用. 1& ...
随机推荐
- JavaScript (If...Else和Switch和循环遍历) 语句以及常用消息框
If...Else 语句 JavaScript中if...else语句和Java中的语法和使用方法是一样的. 只是在JavaScript中要使用小写字母.使用大写的 IF 会出错! 至于if...el ...
- 【Linux命令】文件和目录操作命令
本文主要用于常用命令的备忘,具体用法可用man查看,或查询其他资料. cd:改变工作目录 ls:列出目录的内容 mkdir:创建一个目录 cat:连接并显示指定的一个和多个文件的有关信息 cp:将给出 ...
- .数据库连接池技术:DBCP和C3P0
数据库连接池技术:DBCP和C3P0 1.什么是数据库连接池 已知的方法是需要访问数据库的时候进行一次数据库的连接,对数据库操作完之后再释放这个连接,通常这样业务是缺点很明显的: 用户每次请求都需要向 ...
- Linux下yum安装MySQL
写这篇文章的原因是:在刚开始使用Linux操作系统时想要搭建LAMP环境,于是开始在Google和百度上各种寻找资料,碰到了不是很多的问题后,我决定写这篇文章总结一下在Linux下yum安装MySQL ...
- [LeetCode] Minimum Number of Arrows to Burst Balloons 最少数量的箭引爆气球
There are a number of spherical balloons spread in two-dimensional space. For each balloon, provided ...
- Linux CGroup之freezer分析与应用
Linux Kernel:4.4.17 CGroup的freezer子系统对于成批作业管理系统很有用,可以成批启动/停止任务,以达到及其资源的调度. freezer子系统也有助于针对运行一组任务设置检 ...
- Android 提醒公共方法 Notification
SimpAndroidFarme是近期脑子突然发热想做的android快速开发的框架,目标是模块化 常用的控件,方便新手学习和使用.也欢迎老鸟来一起充实项目:项目地址 今天的目标是做一个公共的提醒方法 ...
- .net的一致性哈希实现
最近在项目的微服务架构推进过程中,一个新的服务需要动态伸缩的弹性部署,所有容器化示例组成一个大的工作集群,以分布式处理的方式来完成一项工作,在集群中所有节点的任务分配过程中,由于集群工作节点需要动态增 ...
- neo4j-备份、恢复
neo4j备份命令(本例linux) neo4j-backup 命令使用: ./neo4j-backup -full -from single://[machine IP] -to ~/backup- ...
- Android基础总结(七)
广播(掌握) 广播的概念 现实:电台通过发送广播发布消息,买个收音机,就能收听 Android:系统在产生某个事件时发送广播,应用程序使用广播接收者接收这个广播,就知道系统产生了什么事件. Andro ...