CF1615G Maximum Adjacent Pairs
\(CF1615G\)
Description
给定一个数列 \(a\),你需要将所有 \(a_i=0\) 的位置填上一个 \(1\sim n\) 的正整数,使得数列的「值」最大。
数列的值定义为满足以下条件的 \(k\) 的个数:
- 存在 \(i\in\Z[1,n-1]*i*∈Z[1,*n*−1]\),使得 \(a_{i}=a_{i+1}=k\)。
输出值最大的序列,若有多解,输出任意一个。
\(0\le a\le \min(n,600)\);\(0<n\le 3\times 10^5\)
Solution
转化到匹配问题是比较直觉的?
一开始的错误思路是直接对于每个数匹配位置,会出现这种情况
\(01000020\),直接匹配的话可能会出现,\(01100220\),最优匹配显然是\(11000022\)
那么考虑我们初始状态是一段连续的非\(0\)和\(0\)拼接而成,我们考虑进行连续段匹配
比较显然的几个结论
长度为偶数的 \(0\) 段,两边都匹配或者两边都不匹配,是肯定不劣的
长度为奇数的 \(0\) 段,只有一边匹配或者不匹配,也是不劣的
那么对于这个模型建图:
长度偶数段:左右端点连边,左右边界分别和左右端点连边
长度奇数段:左右边界和区间连边
跑一遍最大匹配就好了,由于是一般图,带花树(复杂度稳定过不去)\(/\)随机匈牙利(直接踩过去)
#define Eternal_Battle ZXK
#include<bits/stdc++.h>
#define MAXN 300005
using namespace std;
int match[MAXN],vis[MAXN],a[MAXN],Lim=600,Tim,n;
mt19937 my_rd(time(0));
vector<int>rd[MAXN];
map<int,int>py[605];
bool No[MAXN];
void add(int u,int v)
{
if(No[u]||No[v]) return ;
rd[u].push_back(v);
rd[v].push_back(u);
}
bool dfs(int now)
{
shuffle(rd[now].begin(),rd[now].end(),my_rd);
vis[now]=Tim;
for(int i=0;i<rd[now].size();i++)
{
int y=rd[now][i];
if(vis[match[y]]==Tim) continue;
int z=match[y];
match[now]=y;
match[y]=now;
match[z]=0;
if(!z||dfs(z)) return true;
match[now]=0;
match[y]=z;
match[z]=y;
}
return false;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<n;i++)
{
if(a[i]==a[i+1]) No[a[i]]=true;
}
No[0]=true;
for(int i=1,j=0;i<=n;i++)
{
if(a[i])
{
if(j+1==i) goto EB;
else if((i-j)%2==1)
{
Lim++;
add(a[j],Lim); py[a[j]][Lim]=j+1;
add(a[i],Lim+1); py[a[i]][Lim+1]=i-1;
add(Lim,Lim+1);
Lim++;
}
else
{
Lim++;
add(a[j],Lim); py[a[j]][Lim]=j+1;
add(a[i],Lim); py[a[i]][Lim]=i-1;
}
EB:;
j=i;
}
}
for(int T=1;T<=3;T++)
{
for(int i=1;i<=Lim;i++)
{
if(!match[i]) Tim++,dfs(i);
}
}
for(int i=1;i<=600;i++)
{
if(!match[i]||No[i]||!py[i][match[i]]) continue;
a[py[i][match[i]]]=i;
No[i]=true;
}
int num=1;
for(int i=1;i<=n;i++)
{
if(a[i]) continue;
while(No[num]) num++;
if(!a[i]&&!a[i+1])
{
a[i]=a[i+1]=num;
i++;
}
else
{
a[i]=num;
}
num++;
}
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
}
CF1615G Maximum Adjacent Pairs的更多相关文章
- Design and Analysis of Algorithms_Brute Froce
I collect and make up this pseudocode from the book: <<Introduction to the Design and Analysis ...
- 多校3-Magician 分类: 比赛 2015-07-31 08:13 4人阅读 评论(0) 收藏
Magician Time Limit: 18000/9000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- 去除reads中的pcr 重复,fastquniq
改编: python ~/tools2assemble/run_fastuniq.py SHT-3K-1_1.fq.gz SHT-3K-1_2.fq.gz 好像不支持gz文件,要先解压 http:// ...
- 2015 多校联赛 ——HDU5316(线段树)
Fantasy magicians usually gain their ability through one of three usual methods: possessing it as an ...
- 2018.07.08 hdu5316 Magician(线段树)
Magician Problem Description Fantasy magicians usually gain their ability through one of three usual ...
- HDU 5316——Magician——————【线段树区间合并区间最值】
Magician Time Limit: 18000/9000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- Neon Intrinsics各函数介绍
#ifndef __ARM_NEON__ #error You must enable NEON instructions (e.g. -mfloat-abi=softfp -mfpu=neon) t ...
- hdu 5316 Magician 线段树
链接:http://acm.hdu.edu.cn/showproblem.php? pid=5316 Magician Time Limit: 18000/9000 MS (Java/Others) ...
- D3js-API介绍【英】
Everything in D3 is scoped under the d3 namespace. D3 uses semantic versioning. You can find the cur ...
随机推荐
- iTextSharp 提取签名图像
原文 本文使用 iTextSharp 5.5.13.2,记录使用 iTextSharp 提取图片时,获得的知识点. pdf 中的签名并不是单纯的一张图片,它是由一张基础的底色图和一张蒙版图片组成.需要 ...
- 「ABC 249Ex」Dye Color
考虑停时定理. 初始势能为 \(\sum \Phi(cnt_i)\),末势能为 \(\Phi(n)\),我们希望构造这样一个 \(\Phi:Z\to Z\) 函数,使得每一次操作期望势能变化量为常数. ...
- SPFA 最短路算法
SPFA算法 1.什么是spfa算法? SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环.SPFA一般情况复杂度是O(m)O(m) ...
- GO GMP协程调度实现原理 5w字长文史上最全
1 Runtime简介 Go语言是互联网时代的C,因为其语法简洁易学,对高并发拥有语言级别的亲和性.而且不同于虚拟机的方案.Go通过在编译时嵌入平台相关的系统指令可直接编译为对应平台的机器码,同时嵌入 ...
- Django 学习记录(AcWing)
Django 2.1 搭建文件结构 前面的都是配置基本步骤,不需要理解,其他Django项目同样步骤操作: 接下来用Django-admin新建一个Django项目: django-admin sta ...
- JavasScript打印年月日时间代码
就是Date的API,直接上代码啦. //打印中文的日期 function printChineseDateTime() { var now=new Date(); var str = now.get ...
- Java学习-第一部分-第一阶段-第二节:变量
变量 变量介绍 为什么需要变量 变量是程序的基本组成单位 不论是使用哪种高级程序语言编写程序,变量都是其程序的基本组成单位,比如: //变量有三个基本要素(类型+名称+值) class Test{ p ...
- Spring Data JPA系列3:JPA项目中核心场景与进阶用法介绍
大家好,又见面了. 到这里呢,已经是本SpringData JPA系列文档的第三篇了,先来回顾下前面两篇: 在第1篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring ...
- Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现
我们在前文中已经介绍了SpringAOP的切面实现和创建动态代理的过程,那么动态代理是如何工作的呢?本文主要介绍Cglib动态代理的案例和SpringAOP实现的原理.@pdai Spring框架系列 ...
- labview从入门到出家1--第一个加法程序
概述: Labview在众多编程语言中排名靠后,显然在当今互联网,物联网时代并非主流语言.但是俗话说行行 出状元,即便不是立身于某个主流的领域,用好了依旧可以独领风骚,而且Labview对于硬件出身的 ...