\(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的更多相关文章

  1. Design and Analysis of Algorithms_Brute Froce

    I collect and make up this pseudocode from the book: <<Introduction to the Design and Analysis ...

  2. 多校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 ...

  3. 去除reads中的pcr 重复,fastquniq

    改编: python ~/tools2assemble/run_fastuniq.py SHT-3K-1_1.fq.gz SHT-3K-1_2.fq.gz 好像不支持gz文件,要先解压 http:// ...

  4. 2015 多校联赛 ——HDU5316(线段树)

    Fantasy magicians usually gain their ability through one of three usual methods: possessing it as an ...

  5. 2018.07.08 hdu5316 Magician(线段树)

    Magician Problem Description Fantasy magicians usually gain their ability through one of three usual ...

  6. HDU 5316——Magician——————【线段树区间合并区间最值】

    Magician Time Limit: 18000/9000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  7. Neon Intrinsics各函数介绍

    #ifndef __ARM_NEON__ #error You must enable NEON instructions (e.g. -mfloat-abi=softfp -mfpu=neon) t ...

  8. hdu 5316 Magician 线段树

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=5316 Magician Time Limit: 18000/9000 MS (Java/Others)  ...

  9. D3js-API介绍【英】

    Everything in D3 is scoped under the d3 namespace. D3 uses semantic versioning. You can find the cur ...

随机推荐

  1. 8.0 vue cli自定义页面

    1.新建a.html(public文件夹下)文件,并设定div的id="a" <!DOCTYPE html> <html lang=""> ...

  2. vue2 sass主题一键修改功能

    1.先创建一个 _theme.scss文件 作为各类主题颜色的整理 $themes: ( light: ( //字体 font_color1: #414141, font_color2: white, ...

  3. 「JOISC 2019 Day4」蛋糕拼接 3

    loj 3039 NKOJ Description \(n\)个蛋糕,每个蛋糕有\(w_i,h_i\).选\(m\)个蛋糕满足\(\sum\limits_{j=1}^mw_{k_j}-\sum\lim ...

  4. leetcode 4. Median of Two Sorted Arrays 寻找两个正序数组的中位数(困难)

    一.题目大意 标签: 查找 https://leetcode.cn/problems/median-of-two-sorted-arrays 给定两个大小分别为 m 和 n 的正序(从小到大)数组 n ...

  5. HTML行内元素与块级元素有哪些及区别详解

    转自 https://www.jb51.net/web/724286.html   这篇文章主要介绍了HTML行内元素与块级元素有哪些及区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具 ...

  6. Kubernetes Job Controller 原理和源码分析(二)

    概述程序入口Job controller 的创建Controller 对象NewController()podControlEventHandlerJob AddFunc DeleteFuncJob ...

  7. 超详细干货!Docker+PXC+Haproxy搭建高可用强一致性的MySQL集群

    前言 干货又来了,全程无废话,可先看目录了解. MySQL搭建集群最常见的是binlog方式,但还有一种方式是强一致性的,能保证集群节点的数据一定能够同步成功,这种方式就是pxc,本篇就使用图文方式一 ...

  8. SQL Server 2008~2019版本序列号/密钥/激活码 汇总

    SQL Server 2019 Enterprise:HMWJ3-KY3J2-NMVD7-KG4JR-X2G8G Strandard:PMBDC-FXVM3-T777P-N4FY8-PKFF4 SQL ...

  9. 13.LAMP架构介绍及配置

    LAMP架构介绍及配置 LAMP简介与概述 LAMP概述 LAMP架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整套系统和相关软件,能够提供动态Web站点服务及其应用开发环境. LAMP是一 ...

  10. 关于react的props你需要知道的一个简单方法

    //注意一点:函数名必须大写 function Clock(props) { return ( <div> <h1>Hello, world!</h1> <h ...