洛谷3971 【TJOI2014】Alice and Bob(拓扑排序+贪心)

本文探讨了如何使用贪心算法和拓扑排序解决特定的数组问题。通过构建有向无环图(DAG),并利用编号优先级进行拓扑排序,实现了有效的解决方案。最后,通过计算b数组验证了算法的正确性和效率。

传送门

【题目分析】

a数组就是起限制作用,由a数组我们可以推断出某些元素之间的大小关系。

很明显b数组就是将原数组倒着求一遍a数组,所以考虑贪心。

首先根据贪心可以知道,每个a[i]一定会连向最近的a[i]-1,由此建立DAG。

然后考虑编号分配,就是以编号为优先级做一次拓扑排序即可。

最后按题意求一次b数组即可。

至于贪心正确性。。。emm,不会啊。

感性理解一下吧。

【代码~】

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN=1e5+10;
const int INF=0x3f3f3f3f;

int n,cnt;
int a[MAXN];
int head[MAXN],du[MAXN];
int nxt[MAXN<<1],to[MAXN<<1];
int id[MAXN],tot;
int sx[MAXN],dp[MAXN];
int lb[MAXN];
priority_queue<int> q;

int Read(){
	int i=0,f=1;
	char c;
	for(c=getchar();(c>'9'||c<'0')&&c!='-';c=getchar());
	if(c=='-')
	  f=-1,c=getchar();
	for(;c>='0'&&c<='9';c=getchar())
	  i=(i<<3)+(i<<1)+c-'0';
	return i*f;
}

void add(int x,int y){
	nxt[cnt]=head[x];
	head[x]=cnt;
	to[cnt]=y;
	cnt++;
	du[y]++;
}

void tuopu(){
	for(int i=1;i<=n;++i)
	  if(!du[i])
	    q.push(i);
	while(!q.empty()){
		int u=q.top();
		q.pop();
		id[u]=++tot;
		for(int i=head[u];i!=-1;i=nxt[i]){
			int v=to[i];
			if(!--du[v]){
				q.push(v);
			}
		}
	}
}

LL calc(){
	LL ret=0;
	memset(sx,INF,sizeof(sx));
	sx[0]=0;
	for(int i=n;i>=1;--i){
		dp[i]=(lower_bound(sx+1,sx+n+1,id[i])-(sx+1))+1;
		sx[dp[i]]=min(sx[dp[i]],id[i]);
	}
	for(int i=1;i<=n;++i)
	  ret+=dp[i];
	return ret;
}

int main(){
	memset(head,-1,sizeof(head));
	n=Read();
	for(int i=1;i<=n;++i){
		a[i]=Read();
	}
	for(int i=1;i<=n;++i){
		if(a[i]>1)
		  add(lb[a[i]-1],i);
		if(lb[a[i]])
		  add(i,lb[a[i]]);
		lb[a[i]]=i;
	}
	tuopu();
	cout<<calc();
	return 0;
}

 

# 软件工程、数据库、算法 ## 详解 软件工程、数据库算法是计算机科学与软件开发中的三大核心领域,分别涉及**系统设计与开发流程**、**数据存储与管理机制**以及**问题求解的高效方法**。 --- ### 一、软件工程 软件工程是系统化、规范化的软件开发方法,强调**可维护性、可扩展性、可测试性协作性**。 #### 1. 软件开发生命周期(SDLC) - **需求分析**:明确用户需求。 - **设计**:架构设计、模块划分、接口设计。 - **实现(编码)**:使用编程语言实现功能。 - **测试**:验证功能是否符合需求。 - **部署与维护**:上线运行与后续更新。 #### 2. 常见开发模型 | 模型 | 特点 | |------|------| | 瀑布模型 | 线性流程,阶段分明 | | 敏捷开发 | 迭代增量,快速响应需求变化 | | DevOps | 开发与运维一体化,持续集成/交付 | #### 3. 设计模式与原则 - **SOLID 原则**:面向对象设计的核心原则。 - **设计模式**:如工厂模式、观察者模式、策略模式等,用于解决常见设计问题。 --- ### 二、数据库 数据库是数据存储与管理的核心工具,支持高效的数据存取、事务处理并发控制。 #### 1. 数据库分类 | 类型 | 特点 | 示例 | |------|------|------| | 关系型数据库 | 支持 SQL,结构化存储 | MySQL、PostgreSQL、Oracle | | 非关系型数据库 | 灵活结构,适合大数据 | MongoDB(文档型)、Redis(键值型) | #### 2. 数据库设计 - **范式理论**:1NF、2NF、3NF,用于减少数据冗余。 - **索引**:提高查询效率。 - **事务**:满足 ACID 特性(原子性、一致性、隔离性、持久性)。 - **连接方式**:如 JOIN、子查询等。 #### 3. SQL 示例 ```sql -- 查询用户及其订单信息 SELECT u.name, o.order_id, o.amount FROM users u JOIN orders o ON u.id = o.user_id WHERE u.status = 'active'; ``` --- ### 三、算法 算法是解决问题的逻辑步骤,决定了程序的效率与性能。 #### 1. 常见算法分类 - **排序算法**:冒泡排序、快速排序、归并排序。 - **搜索算法**:深度优先搜索(DFS)、广度优先搜索(BFS)。 - **动态规划**:解决重叠子问题,如最长递增子序列、背包问题。 - **贪心算法**:局部最优解构造全局最优解。 - **图算法**:Dijkstra、Kruskal、拓扑排序等。 #### 2. 算法复杂度分析 - **时间复杂度**:衡量算法执行时间随输入规模增长的趋势。 - **空间复杂度**:衡量算法内存消耗。 #### 3. Python 示例:快速排序 ```python def quicksort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] mid = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quicksort(left) + mid + quicksort(right) ``` --- ## 知识点 1. **软件开发流程**:掌握软件生命周期开发模型,如敏捷、DevOps。 2. **数据库管理**:包括关系型数据库设计、SQL 操作、事务机制。 3. **算法设计与分析**:理解常见算法原理、复杂度分析及实现技巧。
最新发布
09-14
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值