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 ...
随机推荐
- 无线:SSID
BSSID,SSID,ESSID区别 SSID(Service Set Identifier) SSID,AP唯一的ID码,许多人认为可以将SSID写成ESSID,其实不然,SSID是个笼统的 ...
- MyBatisPlus详解
1.MyBatisPlus概述 需要的基础:MyBatis.Spring.SpringMVC 为什么要学习?MyBatisPlus可以节省我们大量工作时间,所有的CRUD代码它都可以自动化完成! 简介 ...
- 好客租房23-react组件的两种创建方式(抽离为独立js)
2.3抽离为单独组件 组件作为一个单独的个体,一般把每个组件放在单独的js中文件中 1创建hello.js 2在hello.js中导入React 3创建组件(函数或者类) hello.js子组件 // ...
- python之re模块补充和其他模块(collection、time、queue、datetime、random)
目录 re模块补充说明 collections模块 queue模块 time模块 datetime模块 random模块 re模块补充说明 在正则表达式中,'()'的作用是进行分组,但是在re模块中, ...
- ES6 - promise(1)
今天决定对之前学过的一些前端的知识进行梳理和总结,因为最近都是独自承担项目的开发与搭建,所以先从前后端交互的第一线axios来梳理,复习axios首先一定要先复习promise对象. 什么是promi ...
- Kubernetes client-go workqueue 源码分析
概述Queue接口和结构体setAdd()Get()Done()DelayingQueue接口和结构体waitForNewDelayingQueuewaitingLoop()AddAfter()Rat ...
- Asp.Net Core Identity 多数据库支持
Asp.Net Core Identity 是.Net自带的身份认证系统,支持用户界面 (UI) 登录功能,并且管理用户.密码.配置文件数据.角色.声明.令牌.电子邮件确认等等.使用Visual St ...
- java面试:关于public static void main(String[] args)是什么意思?
它是作为JAVA中的主函数,所有java程序的运行起点就是这个方法,除了args这个名字可以不一样外,其他必须是这样. 主函数的一般写法如下: public static void main(Stri ...
- 使用PowerShell校验文件MD5
更新记录 2022年4月16日:本文迁移自Panda666原博客,原发布时间:2021年7月14日. 方法1:使用Get-FileHash命令 (Get-FileHash ".\SQLSer ...
- 24.Haproxy搭建Web群集
Haproxy搭建Web群集 目录 Haproxy搭建Web群集 Haproxy简介 常见的Web集群调度器 软件类 硬件类 Haproxy应用分析 HAProxy的主要特性 HAProxy常见的8种 ...