[Codeforces Round #508 (Div. 2)][Codeforces 1038E. Maximum Matching]
前几天给舍友讲这题的时候感觉挺有意思的,就贴上来吧...
题目大意:有\(n\)个棒子,每个条两端有颜色\(c1,c2\)以及他的价值\(v\),要求选取若干个棒子拼接起来(要求连接处的颜色相同,棒子可以反转),求最大价值总和。
题解:设\(c1==c2\)的为同色棒子,反之为异色
可以发现偶数个异色棒子可以拼为一个长长的同色棒子,奇数个则可以拼为一个长长的异色棒子,因此可以预处理\(F[i][j]\)表示若将所有\((i,j)\)当做异色棒子来用所能得到的价值,\(G[i][j]\)表示当做同色棒子来用所能得到的价值。显然他们的值为所有颜色为\((i,j)\)的价值总和\(-k\cdot\)颜色为\((i,j)\)的最小价值,k等于0或1,由当前颜色的数目决定。
对于同色的棒子,可以发现,若当前已经拼好的棒子里颜色\(c\)出现过,则可以将所有颜色为\(c\)的同色棒子塞进去以增加答案。
接下去就是直接暴力DFS了,枚举起点的颜色,然后暴力考虑可以接哪些颜色,每次进入下一层的时候更新一次答案。更新答案就按照上面所说的那样,判断哪些颜色出现过,并将所有包含此颜色的异色棒子当做同色棒子来用塞进去。这里要注意一点,虽然塞进去的时候是当做同色来塞,但这种操作可能会导致新出现了一种颜色,而新颜色的出现可能还会导致答案的增加(即有包含新颜色的棒子)。因此这样子的操作还要再进行若干次,3次是肯定够的。最后再把所有已出现颜色的同色棒子加入就好了。
由于颜色组合只有10种((1,2)和(2,1)算一种),因此DFS的复杂度不会超过\(O(4^{10})\),再乘上update的复杂度则为\(O(4^{13})\),水过去是没有压力的
代码中将颜色对\((c1,c2)\)进行了标号处理
#include<bits/stdc++.h>
using namespace std;
#define N 101
int n,s[N],cnt[N],m[N],F[N],G[N],c1,c2,v,ans;
bool x[][],f[];
void update()
{
bool g[],X[][];
for(int i=;i<=;i++)g[i]=f[i];
for(int i=;i<=;i++)
for(int j=i+;j<=;j++)
X[i][j]=x[i][j];
int res=;
for(int i=;i<=;i++)
for(int j=i+;j<=;j++)
if(x[i][j])res+=F[i*+j];
for(int _=;_<;_++)
for(int i=;i<=;i++)
for(int j=i+;j<=;j++)
if(!X[i][j] && (g[i]||g[j]) && cnt[i*+j]>)
res+=G[i*+j],X[i][j]=true,g[i]=true,g[j]=true;
for(int i=;i<=;i++)if(g[i])res+=s[i];
ans=max(ans,res);
}
int get(int i,int j){if(i>j)swap(i,j);return i*+j;}
void dfs(int i)
{
update();
for(int j=;j<=;j++)
if(!x[i][j] && cnt[get(i,j)])
x[i][j]=x[j][i]=f[j]=true,dfs(j),x[i][j]=x[j][i]=f[j]=false;
}
int main()
{
memset(m,0x3f,sizeof(m));
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d%d%d",&c1,&v,&c2);
if(c1==c2){s[c1]+=v;continue;}
if(c1>c2)swap(c1,c2);
int id=c1*+c2;
cnt[id]++,m[id]=min(m[id],v),s[id]+=v;
}
for(int i=;i<=;i++)
for(int j=i+;j<=;j++)
{
int id=i*+j;
if(cnt[id])F[id]=cnt[id]&?s[id]:(s[id]-m[id]);
G[id]=cnt[id]&?(s[id]-m[id]):s[id];
}
for(int i=;i<=;i++)
f[i]=true,dfs(i),f[i]=false;
return printf("%d\n",ans),;
}
[Codeforces Round #508 (Div. 2)][Codeforces 1038E. Maximum Matching]的更多相关文章
- Codeforces Round #508 (Div. 2)
Codeforces Round #508 (Div. 2) http://codeforces.com/contest/1038 A #include<bits/stdc++.h> us ...
- Codeforces Round #508 (Div. 2) E. Maximum Matching(欧拉路径)
E. Maximum Matching 题目链接:https://codeforces.com/contest/1038/problem/E 题意: 给出n个项链,每条项链左边和右边都有一种颜色(范 ...
- Codeforces Round #524 (Div. 2) codeforces 1080A~1080F
目录 codeforces1080A codeforces 1080B codeforces 1080C codeforces 1080D codeforces 1080E codeforces 10 ...
- Codeforces Round #508 (Div. 2) D. Slime
D. Slime 题目链接:https://codeforces.com/contest/1038/problem/D 题意: 给出两个数,然后每次可以对相邻的两个数合并,比如x,y,那么合并过后就是 ...
- Codeforces Round #704 (Div. 2), problem: (C) Maximum width还是要多学习
Problem - C - Codeforces 看清题目要求, 最重要部分在第二段. 大佬最后给出的代码果然简单, 思路简单化, 未必非要把答案在一个大括号里全部完成, 两个指针同时跑,中间加了一堆 ...
- Codeforces Round #508 (Div. 2) C D
C: C - Gambling 给你两个数列 每一回合A可以选择从第一个序列里面选一个数或者清除第二个序列里面选一个数 同理B能从第二序列里面选数或者清除第一个序列里面一个数 然后 求A所选的数之和 ...
- 题解——Codeforces Round #508 (Div. 2) T3 (贪心)
贪心的选取最优解 然后相减好 记得要开long long #include <cstdio> #include <algorithm> #include <cstring ...
- 题解——Codeforces Round #508 (Div. 2) T2 (构造)
按照题意构造集合即可 注意无解情况的判断 #include <cstdio> #include <algorithm> #include <cstring> #in ...
- 题解——Codeforces Round #508 (Div. 2) T1 (模拟)
依照题意暴力模拟即可A掉 #include <cstdio> #include <algorithm> #include <cstring> #include &l ...
随机推荐
- 下拉框 -------> 初始化数据
在Web应用程序中开发编写功能时,时常用到获取数据库中的数据并将值初始化在HTML中的标签上. 1.Form from django.forms import Form from django.for ...
- pycharm实用快捷键集锦
以下是本人需要记录的快捷键,并不针对大众,所以是断断续续补充的,大家看看图个乐呵就成! 生成代码块(Surround with):Ctrl + Alt + t . 历史浏览页面跳转:很多时候,我们需要 ...
- oracle的安装与卸载
安装oracle: 下载符合系统要求的oracle数据库 2. 将上面的压缩文件都解压到一个文件夹中,然后以管理员的身份运行其中的可执行文件(.exe) 3. 配置安全更新(可选可不选,学习时我没 ...
- percona-toolkit 之 【pt-online-schema-change】说明【转】
背景: MySQL 大字段的DDL操作:加减字段.索引.修改字段属性等,在5.1之前都是非常耗时耗力的,特别是会对MySQL服务产生影响.在5.1之后随着Plugin Innodb的出现在线加索引的提 ...
- webpack4加载字体
webpack加载字体,刚开始下载完字体后就用css去引用它,结果死活没显示我要的字体,后来https://www.aliyun.com/jiaocheng/654750.html这篇文章说要把下载的 ...
- jQuery 第六章 jQuery在Ajax应用
1.本章目标 ajax 2.ajax 异步刷新技术,我们的网页不需要全部刷新,按需实现局部刷新,上线后台的交互 用户体验好 地图,前台验证,表单提交,修改,查询等等 原生的js和ajax packag ...
- numpy的基础运算2-【老鱼学numpy】
numpy的基础运算中还有很多运算,我们这里再记录一些. 最小/大值索引 前面一篇博文中我们讲述过如何获得数组中的最小值,这里我们获得最小/大值的索引值,也就是这个最小/大值在整个数组中位于第几位. ...
- Kubernetes 学习1 k8s架构概述
一.概述 1.意思:舵手,飞行员 2.特点 a.自动装箱,自我修复,水平扩展,服务发现和负载均衡,自动发布和回滚. b.密钥和配置管理,存储编排,批量处理执行. 二.架构术语 1.集群 master( ...
- HTTP简述
参考链接: https://www.cnblogs.com/XJJD/p/7674007.html HTTP的请求类型:GET.POST的区别? 一般在浏览器中输入网址访问资源都是通过GET方式:在F ...
- Doctirne---查询更新等操作
使用Doctrine进行mysql更删改查操作,事务处理,生命周期的管理 1.先记录最简单的插入操作 $em = $this->getDoctrine()->getManager(); / ...