当前位置: 首页 > article >正文

算法竞赛进阶指南——基本算法(倍增)

ST表

可以求区间最大、最小、gcd、lcm,符合 f(a, a) = a都可以
求区间最值,一个区间划分成两段
f[i][j]: 从i开始,长度为2^j的区间最值

#include<iostream>
#include<cmath>
using namespace std;
const int N = 1e6 + 10;
int n, k, a[N];
int f[N][50];

//预处理 
void pre(){
	for(int i = 1; i <= n; i++) f[i][0] = a[i];
	//以2为底,n的对数 
	int t = log(n) / log(2);
	for(int j = 1; j <= t; j++)
		for(int i = 1; i <= n - (1 << j) + 1; i++)
			f[i][j] = min(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
}

int query(int l, int r){
	int k = log(r - l + 1) / log(2);
	return min(f[l][k], f[r - (1 << k) + 1][k]);
}

int main(){
  scanf("%d", &n);
	for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
	scanf("%d", &k);
	pre();
	for(int i = 1; i <= n; i++){
		int l = max(1, i - k), r = min(n, i + k);
		printf("%d ", query(l, r));
	}
	return 0;
}

天才ACM

在这里插入图片描述

#pragma GCC optimize(3, "Ofast", "inline")
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 5e5 + 10;
int k, n, m;
int a[N], b[N];
long long t;

long long f(int l, int r){
    int z = 0;
    for(int i = l; i < r; i++) b[z++] = a[i];
    sort(b, b + z);
    long long res = 0;
    for(int i = 0, j = z - 1; i < m && i < j; i++, j--)
        res += (long long)(b[j] - b[i]) * (b[j] - b[i]);
    return res;
}

int main(){
    scanf("%d", &k);
    while(k--){
        scanf("%d %d %lld", &n, &m, &t);
        for(int i = 0; i < n; i++) scanf("%d", &a[i]);
        int st = 0, ed = 0, ans = 0;
        while(ed < n){
            int len = 1;
            while(len){
                //[st, ed)
                if(ed + len <= n && f(st, ed + len) <= t){
                    ed += len;
                    len *= 2;
                }else len /= 2;
            }
            st = ed;
            ans++;
        }
        printf("%d\n", ans);
    }
    return 0;
}

http://www.kler.cn/a/234676.html

相关文章:

  • Excel批量设置行高,Excel表格设置自动换行后打印显示不全,Excel表格设置最合适的行高后打印显示不全,完美解决方案!!!
  • 在JavaScript中,let 和 const有什么不同
  • Triple三倍
  • 【Java 数据结构】面试题 02.02. 返回倒数第 k 个节点
  • ZCC5090EA适用于TYPE-C接口,集成30V OVP功能, 最大1.5A充电电流,带NTC及使能功能,双节锂电升压充电芯片替代CS5090EA
  • Flink中并行度和slot的关系——任务和任务槽
  • NGINX upstream、stream、四/七层负载均衡以及案例示例
  • python从入门到精通(十八):python爬虫的练习案列集合
  • 【高阶数据结构】B-树详解
  • 如何入门AI Agent?
  • C++函数对象-运算符函数对象 - 逻辑运算 - 实现 !x 的函数对象 (std::logical_not)
  • Java 集合、迭代器
  • 跟着cherno手搓游戏引擎【24】开启2D引擎前的项目总结(包括前置知识汇总)
  • 【大厂AI课学习笔记】【1.6 人工智能基础知识】(2)机器学习
  • 07-Java桥接模式 ( Bridge Pattern )
  • 网络学习:数据链路层VLAN原理和配置
  • tkinter-TinUI-xml实战(10)展示画廊
  • mac卸载被锁定的app
  • 《CSS 简易速速上手小册》第4章:视觉美学(2024 最新版)
  • Python for 循环
  • 常见性能优化策略
  • CVE-2012-2311 漏洞复现
  • 计算机网络(第六版)复习提纲29
  • spring boot 通过 application 切换cache使用的服务
  • React18原理: 再聊Fiber架构下的时间分片
  • 前端JavaScript篇之ajax、axios、fetch的区别