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 ...
随机推荐
- 参与 2022 第二季度 Flutter 开发者调查
2022 Google I/O 大会正式落下帷幕,Flutter 作为 14 个开发者产品和平台中的一款,吸引了来自全球的很多开发者们的关注.随着全国很多地方已经进入夏季,Flutter 今年第二季度 ...
- Web自动化定位方法以及常用便捷操作
很遗憾现在才开始给大家逐步分享自动化教程,原本计划着将现有的接口以及app.pc网页端进行自动化处理后再逐步给大家好好分享一下,由于当前实在没必要自动化操作了,所以临时用脑海中的知识再为大家继续更一篇 ...
- 适配抖音!三角面转换和3d模型体量减小,轻量化一键即可完成!
抖音3d特效,可谓是越来越火爆了,这个有着迪士尼画风的3D大眼,就刷屏了国内外用户的首页! 有人好奇这些特效究竟是怎么制作的?其实就是把3D模型调整适配到头部模型上,调整位置或者大小就可以制作出一个简 ...
- 推荐一款M1芯片电脑快速搭建集群的虚拟机软件
虚拟机软件太多了,出名的莫过于VMware,VirutlaBox以及Parallels Desktop. 我们使用虚拟机软件一般有两种用途: 安装不同于宿主机系统的拥有用户界面的操作系统,比如Wind ...
- Error: $injector:modulerr Module Error
Failed to instantiate module app due to://实例化失败 Error: [$injector:modulerr] http://errors.angularjs. ...
- 整理orcal常用sql语句
1.表插入列 alter table XMJ_ONE add column1 NUMBER(38) default 0;comment on column XMJ_ONE.column1 is '字段 ...
- django生成迁移文件和执行迁移的命令
生成迁移文件: python manage.py makemigrations #创建数据库迁移文件 执行迁移: python manage.py migrate # 根据数据库迁移文件生 ...
- python小题目练习(六)
需求:编写一个猜数字的小游戏,随机生成1到10(包含1和10)之间的数字作为基准数,玩家每次通过键盘输入一个数字,如果输入的数字跟基准数相同,则闯关成功,否则重新输入,如果玩家输入的是-1,则表示退出 ...
- .NET ORM框架HiSql实战-第一章-集成HiSql
一.引言 做.Net这么多年,出现了很多很多ORM框架,比如Dapper,Sqlsugar,Freesql等等.在之前的项目中,用到的ORM框架也大多数是这几个老牌的框架. 不过最近园子关于.NET ...
- [ARC087D] Squirrel Migration 补题记录
题目链接 简要题意: 给你一个\(N\)个节点的树,求一个\(1\cdots N\)的排列\((p_1,p_2,\cdots p_N)\) ,使得\(\sum dist(i,p_i)\)最大. 求这样 ...