pku_2182_Lost Cows

本文介绍了一道关于牛的排序问题,并使用线段树数据结构进行解答。通过逆序处理输入序列,实现了快速查找和更新剩余位置中的指定元素。代码实现包括建树、更新及查询等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一道线段树求排列顺序的简单题.

题目大意:

给一个数N表示有N头牛,农夫先牵出一头(当然不知道是第几头),接下来N-1行表示他把剩下个数中的第i头牛牵了出来.位置从0开始.

问题是问每头牛在队列中的位置.

例如题目样例中:

1,2,1,0

因为从0开始,为了便于理解,我们全部加1:

2,3,2,1

牛的编号:   1 2 3 4 5

第一次牵出第2头,是编号2

1 3 4 5

第二次牵出剩下的第2头,是编号4

1 3 5

第三次牵出剩下的第3头,是编号5

1 3

第四次牵出剩下的第2头,是编号3

1

第五次.....


解题思想和注意事项:

由上例可以看出,只要对牵出的顺序逆序操作,就可模拟反向的操作过程.对于样例中有五头牛的序列

1,1,1,1,1

从最后一位数据开始,将每次牵出的第i头补回当前序列剩余的第i个位置即可.

逆向序列: 1,2,3,2,?

第一回 i=1: 0,1,1,1,1

第二回 i=2: 0,1,0,1,1

第三回 i=3: 0,1,0,1,0

第四回 i=2: 0,1,0,0,0

第五回 最后一回: 编号为,仅剩的位置


由此可以归纳为解求剩余位置中第N位的问题,要求快速查找和更新,我选择的数据结构为线段树.

建树的函数为标准模板建树,每个叶子初值为1,每个结点统计区间和.

更新函数用来求剩余位置中的第i个位置.具体做法将记录的值和左右子树比较,因为给出的位置一定是合理的可找到的,若大于左子树,则减去左子树值递归到右子树.

最后还需要询问函数,询问最后剩下那个位置编号是什么.


源代码:

#include <myhead.h>

const int N=8010;
#define ROOT 1,n,1
int n;
int data[N],result[N];
int seg[N<<2];

inline void pushUp(int rt)
{
	seg[rt]=seg[LL(rt)]+seg[RR(rt)];
}

void build(int l,int r,int rt)
{
	if(l==r) {
		seg[rt]=1;
		return ;
	}
	int mid=MID(l,r);
	build(LSON);
	build(RSON);
	pushUp(rt);
}

void init()
{
	build(ROOT);
	memset(result,0,sizeof(result));
	for(int i=1;i<n;++i)
		scanf("%d",&data[i]);
}

void updata(int p,int x,int l,int r,int rt)
{
	if(l==r) {
		result[x]=l;
		seg[rt]=0;
		return ;
	}
	int mid=MID(l,r);
	if(seg[LL(rt)]>=p) updata(p,x,LSON);
	else			   updata(p-seg[LL(rt)],x,RSON);
	pushUp(rt);
}

void query(int l,int r,int rt)
{
	if(l==r) {
		result[0]=l;
		return ;
	}
	int mid=MID(l,r);
	if(seg[LL(rt)]) query(LSON);
	else			query(RSON);
}

void work()
{
	for(int i=n-1;i>0;--i)
		updata(data[i]+1,i,ROOT);
	query(ROOT);
	for(int i=0;i<n;++i)
		printf("%d\n",result[i]);
}

int main()
{
	while(~scanf("%d",&n)) {
		init();
		work();
	}
	return 0;
}



### 关于 PKU_Campus 数据库文件格式及其用途 在 IT 领域中,`pku_campus.db` 文件通常是一个 SQLite 数据库文件。SQLite 是一种轻量级的关系型数据库管理系统,广泛用于嵌入式应用和小型项目中[^4]。以下是关于 `pku_campus.db` 的可能格式和用途: #### 1. **文件格式** SQLite 数据库文件的标准扩展名为 `.db` 或 `.sqlite`。这种文件本质上是以二进制形式存储的数据表集合,支持 SQL 查询语言。可以通过以下命令查看其结构: ```bash sqlite3 pku_campus.db ``` 运行上述命令后,可以执行如下操作来了解数据表的内容: ```sql .tables -- 查看所有表格名称 .schema table_name -- 查看特定表格的定义 SELECT * FROM table_name LIMIT 10; -- 浏览前几条记录 ``` #### 2. **潜在用途** 根据命名惯例,“PKU Campus” 可能指北京大学校园相关的某个系统或应用程序。因此,该数据库文件可能是为了管理与校园活动、学生信息或其他资源有关的数据而设计的。 - 如果涉及学生活动,则可能会有类似于 `students`, `events`, 和 `registrations` 这样的表格。 - 若是科研领域中的工具包组件之一,则需进一步确认具体上下文环境下的功能定位[^5]。 另外值得注意的是,在某些情况下,此类数据库也可能被用来保存地理空间信息(GIS),特别是当它关联到地图服务或者位置追踪类软件时[^6]。 #### 示例代码展示如何连接并查询此类型的 SQLite 数据库 下面提供了一个简单的 Python 脚本例子,演示怎样加载以及读取一个 SQLite 数据库内的基本信息: ```python import sqlite3 conn = sqlite3.connect('pku_campus.db') cursor = conn.cursor() # 获取所有的表名 cursor.execute("SELECT name FROM sqlite_master WHERE type='table';") tables = cursor.fetchall() print(f"Tables found: {tables}") for table in tables: tableName = table[0] print(f"\nData from Table '{tableName}': ") try: cursor.execute(f'SELECT * FROM "{tableName}" LIMIT 5') rows = cursor.fetchall() for row in rows: print(row) except Exception as e: print(e) conn.close() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值