【最大公约数&链表】权值 @upcexam5921

时间限制: 1 Sec 内存限制: 512 MB
题目描述
给定一个长为n的正整数序列Ai。对于它的任意一个连续的子序列{Al, Al+1, …, Ar},定义其权值W (l, r)为其长度与序列中所有元素的最大公约数的乘积,即W (l, r) = (r − l + 1) × gcd(Al, Al+1, .., Ar )。
你需要输出权值最大的子序列的权值
输入
第一行一个正整数n。
第二行n个正整数,表示序列Ai。
输出
一行一个正整数,表示答案。
样例输入
5
30 60 20 20 20
样例输出
80

有这样一个性质:
长度为n的序列,子序列gcd的取值最多有logn种
枚举右端点,维护一个不同gcd取值的链表,每次向右枚举一个端点时,反向更新链表,最后维护答案

#define FILE() freopen("../../in.txt","r",stdin)
#include <bits/stdc++.h>

using namespace std;
typedef 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个针对空闲分区链表的最佳适应算法内存分配函数,并包括对空闲分区链表的排序: ``` bool best_fit_allocation(MemBlock* free_list, MemBlock* assign_list, int size, void*& ret_begin, void*& ret_end) { // 对空闲分区链表进行排序 sort_free_list(free_list); // 在空闲分区链表中查找第一个能够容纳请求大小的分区 MemBlock* p = free_list; while (p) { if (p->size >= size) { break; } p = p->next; } // 如果找到了合适的分区 if (p) { // 分配内存 ret_begin = p->begin; ret_end = ret_begin + size; assign_list->insert(ret_begin, ret_end); // 更新空闲分区链表 if (p->size == size) { // 如果找到的分区大小正好等于请求大小,直接删除该分区 if (p == free_list) { free_list = p->next; } delete p; } else { // 如果找到的分区比请求大小大,将该分区分裂成两个分区,一个分配,一个空闲 MemBlock* new_free_block = new MemBlock(p->begin + size, p->size - size, p->next); if (p == free_list) { free_list = new_free_block; } else { MemBlock* q = free_list; while (q->next != p) { q = q->next; } q->next = new_free_block; } delete p; } return true; } // 没有找到合适的分区 return false; } // 对空闲分区链表进行排序 void sort_free_list(MemBlock* free_list) { if (free_list == nullptr || free_list->next == nullptr) { return; } MemBlock* p = free_list; MemBlock* q = p->next; MemBlock* r = q->next; while (r != nullptr) { if (q->size > r->size) { q->next = r->next; r->next = q; p->next = r; p = r; r = q->next; } else { p = q; q = r; r = r->next; } } } ``` 在这个函数中,我们首先调用`sort_free_list`函数对空闲分区链表进行排序,以便能够更快地找到合适的分区。然后,在空闲分区链表中查找第一个能够容纳请求大小的分区,如果找到了合适的分区,就将其分配给进程,并更新空闲分区链表。如果没有找到合适的分区,则返回false。 `sort_free_list`函数使用的是插入排序算法,它将空闲分区链表按照分区大小从小到大排序。排序后,我们就能够更快地找到合适的分区。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值