热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

[COCI20112012#4]OGRADA题解

看到有大小关系限制,考虑拓扑排序,并在拓扑的同时从大到小进行填数。问题转换为,对于拓扑队列中的所有元素(即\(B\)的位置),应该把最大的数填在哪个位置上。然后快快乐乐分类讨论就

看到有大小关系限制,考虑拓扑排序,并在拓扑的同时从大到小进行填数。

问题转换为,对于拓扑队列中的所有元素(即 \(B'\) 的位置),应该把最大的数填在哪个位置上。

然后快快乐乐分类讨论就行了。

约定: 蓝色块为已填,灰色块为可填(在拓扑队列中),白色块为不能填(不在拓扑队列中),优先级越小越先填。



  • \(A_{i-1}>A_i

    此时 \(B'_i\) 的值越小越好,并且 \(B'_i\) 的值每减小 \(1\),答案增加 \(2\),优先级为 \(4\)



  • \(A_{i-1}>A_i>A_{i+1}:\)

    此时从 \(B'_{i-1}\)\(B'_{i+1}\) 对答案的贡献为 \(B'_{i-1}-B'_{i+1}\),与 \(B'_{i}\) 无关,优先级为 \(2\)



  • \(A_{i-1}\(A_{i-1}>A_i>A_{i+1}\) 同理。



  • \(A_{i-1}A_{i+1}:\)

    此时 \(B'_i\) 的值越大越好,并且 \(B'_i\) 的值每增加 \(1\),答案增加 \(2\),优先级为 \(0\)



  • \(i=1,A_i>A_{i+1}:\)

    此时 \(B'_i\) 的值越大越好,并且 \(B'_i\) 的值每增加 \(1\),答案增加 \(1\),优先级为 \(1\)



  • \(i=1,A_i

    此时 \(B'_i\) 的值越小越好,并且 \(B'_i\) 的值每减小 \(1\),答案增加 \(1\),优先级为 \(3\)



  • \(i=n\)\(i=1\) 同理。



拓扑的时候用优先队列,按照优先级排序即可。

(其实这玩意儿写出来更像 \(\text{Dijstra}\) /qd)


代码

分类讨论很麻烦,但代码不复杂。

#include
#define ll long long
using namespace std;
const int maxn=300010;
inline int read(){
int x=0;
char c=getchar();
for(;!(c>='0'&&c<='9');c=getchar());
for(;c>='0'&&c<='9';c=getchar())
x=(x<<1)+(x<<3)+c-'0';
return x;
}
struct edge{
int v,to;
}e[maxn<<1];
int head[maxn],ecnt;
void addedge(int u,int v){
e[++ecnt].v=v,e[ecnt].to=head[u],head[u]=ecnt;
}
priority_queue

,vector

>,greater

> >q;
bitsetvis;
int ru[maxn],n;
int a[maxn],b[maxn];
int Ans[maxn];
int Num(int i){
//返回对应位置优先级
if(i-1&&i if(!Ans[i-1]&&!Ans[i+1]) return 0;
if(Ans[i-1]&&Ans[i+1]) return 4;
return 2;
}
if(i-1){
if(Ans[i-1]) return 3;
return 1;
}
if(Ans[i+1]) return 3;
return 1;
}
void Solve(){
for(int i=1;i<=n;i++)
if(!ru[i]) q.push(make_pair(Num(i),i));
pairt;
int cnt=0;
//拓扑排序写法参考Dijstra堆优化版本
while(!q.empty()){
t=q.top(),q.pop();
if(vis[t.second]) continue;
//填过,continue
if(Num(t.second)^t.first) continue;
//不是当前状态(不是最新版本),continue
Ans[t.second]=b[++cnt],vis[t.second]=1;
if(t.second-1&&!ru[t.second-1])
q.push(make_pair(Num(t.second-1),t.second-1));
if(t.second q.push(make_pair(Num(t.second+1),t.second+1));
for(int i=head[t.second];i;i=e[i].to){
ru[e[i].v]--;
if(!ru[e[i].v])
q.push(make_pair(Num(e[i].v),e[i].v));
}
}

}
int main(){
n=read();
for(int i=1;i<=n;i++)
a[i]=read();
for(int i=1;i<=n;i++)
b[i]=read();
sort(b+1,b+1+n,greater());
for(int i=1;i if(a[i]>a[i+1])
addedge(i,i+1),ru[i+1]++;
else addedge(i+1,i),ru[i]++;
Solve();
ll ans=0;
for(int i=1;i ans+=abs(Ans[i]-Ans[i+1]);
printf("%lld\n",ans);
for(int i=1;i<=n;i++)
printf("%d ",Ans[i]);
return 0;
}


推荐阅读
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文探讨了 Spring Boot 应用程序在不同配置下支持的最大并发连接数,重点分析了内置服务器(如 Tomcat、Jetty 和 Undertow)的默认设置及其对性能的影响。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 探讨如何通过高效的数据库查询和排序策略,优化基于GPS位置信息的附近用户搜索功能,以应对大规模用户数据场景。 ... [详细]
  • 本文探讨了哪些数据库支持队列式的写入操作(即一个键对应一个队列,数据可以连续入队),并且具备良好的持久化特性。这类需求通常出现在需要高效处理和存储大量有序数据的场景中。 ... [详细]
author-avatar
陈怡伶翰纬
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有