Codeforces Round 1054 (Div. 3)-G. Buratsuta 3

游戏开发实战:如何在Unity中实现六边形网格地图(附完整代码) 本文详细介绍了在Unity中实现六边形网格地图的完整开发流程,从数学原理到实战代码。涵盖三种主流坐标系转换方法、距离计算算法对比、网格生成与渲染技巧,以及高级功能如网格高亮、寻路算法和性能优化策略。适合策略游戏、战棋类游戏开发者提升地图系统开发效率。 阅读详情

题目链接

这道题目可以说是很典的一个题目,解法很多,适合练习,这里给出随机选数、摩尔投票、主席树,三种解法。

题意:给定一个数组,有q次询问,每次询问该数组的一个区间[ l ,r ] ,让你找出其中出现超过 \lfloor\frac{r-l+1}{3}\rfloor 的数,并且输出。

数据范围:

代码一(随机选数)

就是对于一个区间中的数字,每次随机选取一个数字,二分统计这个区间中数字出现的次数,我们随机50次,出错的概率可以小到  \left(\frac{2}{3}\right)^{50} \approx 0.000000001568。

时间复杂度:O(n \log n + 50q \log n)

#include<bits/stdc++.h>
#define int long long 
using namespace std;
int n,q;
int a[200005],b[200005];
vector<int> v[200005];
mt19937 rnd(time(0));
int query(int l,int r,int x)
{
	return upper_bound(v[x].begin(),v[x].end(),r)-lower_bound(v[x].begin(),v[x].end(),l);
}
void test()
{
	cin>>n>>q;
	for(int i=1;i<=n;i++)
		cin>>a[i],b[i]=a[i];
	sort(b+1,b+n+1);
	int m=unique(b+1,b+n+1)-b-1;
	for(int i=1;i<=n;i++)
		a[i]=lower_bound(b+1,b+m+1,a[i])-b;
	for(int i=1;i<=m;i++)
		v[i].clear();
	for(int i=1;i<=n;i++)
		v[a[i]].push_back(i);
	for(int i=1;i<=q;i++)
	{
		int l,r;
		cin>>l>>r;
		int k=(r-l+1)/3;
		set<int> st;
		for(int j=1;j<=50;j++)
		{
			int x=rnd()%(r-l+1)+l;
			if(query(l,r,a[x])>k)
				st.insert(b[a[x]]);
			if(st.size()>=3)
				break;
		}
		for(int x:st)
			cout<<x<<" ";
		if(st.empty())
			cout<<-1;
		cout<<"\n";
	}
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin>>t;
	for(int i=1;i<=t;i++)
		test();
}

代码二(主席树)

主席树一般解决区间第k小问题,在这里其实就是求某区间出现次数大于k的数

重点理解query逻辑就行,目的是找到区间中某一个点的计数 > k ,而不是每次计算一个区间中的数了,但是只有当某个区间中的cnt > k ,我们要找的点才可能存在于这样的区间 ,然后不断收缩,直到找到 l == r,或者直接路径中断,并用fg标记有没有找到解,没有找到的话就输出-1,找到的话就直接输出,其余就是主席树模板。

核心代码:$O(n \log n + q \log n)$

void query_k(int u, int v, int l, int r, int k)
{
    if (l == r) // 最后收缩到一个点 说明这个点的数量  > k 
    {
        fg = 1;
        cout << nums[l - 1] << " ";
        return;
    }

    int diff_l = tr[tr[u].l].cnt - tr[tr[v].l].cnt;
    int diff_r = tr[tr[u].r].cnt - tr[tr[v].r].cnt;

    int mid = l + r >> 1;
    if (k < diff_l) // 右子树找不到再往左子树中找
    {
        // 第 k 小的数在左子树
        query_k(tr[u].l, tr[v].l, l, mid, k);
    }
    if (k < diff_r)
    {
        // 第 k 小的数在右子树
        query_k(tr[u].r, tr[v].r, mid + 1, r, k);
    }
}

理解这个直接套模板就行:

时间复杂度:$O(n \log n + q \log n)$

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 200005; // 序列长度和查询次数的最大值
vector<int> v[N];
int n, m, fg;
int a[N];         // 原始序列
vector<int> nums; // 用于存储所有待离散化的值

// 获取 x 离散化后的排名
int get_id(int x)
{
    return lower_bound(nums.begin(), nums.end(), x) - nums.begin() + 1;
}

struct Node
{
    int l, r; // 左右子节点的编号
    int cnt;  // 区间内数的个数
} tr[N * 24]; // 空间大小估算: n * log(n) + m * log(n),开大一些比较保险
int root[N];  // root[i] 存储第 i 个版本的根节点
int tot = 0;  // 节点总数

int insert(int p, int l, int r, int x)
{
    int q = ++tot; // 创建一个新节点 q
    tr[q] = tr[p]; // 复制上一个版本的信息
    tr[q].cnt++;   // 当前区间的计数值+1
    if (l == r)
        return q; // 到达叶子节点,返回
    int mid = l + r >> 1;
    if (x <= mid)
    {
        // 如果 x 在左半区间,递归更新左子树,并把新左子树的根节点赋给 q->l
        tr[q].l = insert(tr[p].l, l, mid, x);
    }
    else
    {
        // 否则递归更新右子树
        tr[q].r = insert(tr[p].r, mid + 1, r, x);
    }
    return q; // 返回新节点的编号
}

void query_k(int u, int v, int l, int r, int k)
{
    if (l == r) // 最后收缩到一个点 说明这个点的数量  > k 
    {
        fg = 1;
        cout << nums[l - 1] << " ";
        return;
    }

    int diff_l = tr[tr[u].l].cnt - tr[tr[v].l].cnt;
    int diff_r = tr[tr[u].r].cnt - tr[tr[v].r].cnt;

    int mid = l + r >> 1;
    if (k < diff_l) // 右子树找不到再往左子树中找
    {
        // 第 k 小的数在左子树
        query_k(tr[u].l, tr[v].l, l, mid, k);
    }
    if (k < diff_r)
    {
        // 第 k 小的数在右子树
        query_k(tr[u].r, tr[v].r, mid + 1, r, k);
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int t;
    cin >> t;
    while (t--)
    {
        tot = 0;
        nums.clear();
        cin >> n >> m;
        for (int i = 1; i <= n; ++i)
        { 
            root[i] = 0;
            v[i].clear();
        }
        for (int i = 1; i <= n; ++i)
        {
            cin >> a[i];
            nums.push_back(a[i]);
        }
        // 离散化
        sort(nums.begin(), nums.end());
        nums.erase(unique(nums.begin(), nums.end()), nums.end());
        int range = nums.size();
        for (int i = 1; i <= n; ++i)
        {
            int id = get_id(a[i]);
            root[i] = insert(root[i - 1], 1, range, id);
        }
        // 处理 m 次查询
        for (int i = 0; i < m; ++i)
        {
            fg = 0;
            int l, r;
            set<int> st;
            cin >> l >> r;
            int k = (r - l + 1) / 3;
            query_k(root[r], root[l - 1], 1, range, k);
            if (!fg)
                cout << -1;
            cout << endl;
        }
    }
    return 0;
}

代码三(摩尔投票+线段树)

摩尔投票相比前两者有些麻烦,感兴趣的可以了解一下。

时间复杂度:$O(n \log n + q \log n)$

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>

using namespace std;

// 线段树节点结构体
struct Node {
    pair<int, int> c[2]; // 存储两个候选数 {值id, 票数}
    
    Node() {
        c[0] = {0, 0}; // 初始化两个候选数为空
        c[1] = {0, 0};
    }
};

// 全局变量
vector<int> arr;      // 存储原始数组
vector<Node> seg;     // 线段树
vector<vector<int>> pos; // 每个值出现的位置列表
map<int, int> val2id; // 值到离散化id的映射
vector<int> id2val;   // 离散化id到值的映射

// 合并两个节点的候选信息
Node merge(const Node &l, const Node &r) {
    Node res = l; // 以左节点为基础
    
    // 处理右节点的两个候选数
    for (int i = 0; i < 2; ++i) {
        if (r.c[i].second == 0) continue; // 跳过空候选
        
        int val = r.c[i].first;   // 候选数值id
        int cnt = r.c[i].second;  // 候选数票数
        
        // 情况1: 候选数已在res中
        if (res.c[0].first == val) {
            res.c[0].second += cnt;
        } 
        // 情况2: 候选数在res的第二个位置
        else if (res.c[1].first == val) {
            res.c[1].second += cnt;
        } 
        // 情况3: res有空位
        else if (res.c[0].second == 0) {
            res.c[0] = {val, cnt};
        } 
        else if (res.c[1].second == 0) {
            res.c[1] = {val, cnt};
        } 
        // 情况4: 需要三方抵消
        else {
            // 计算最小票数进行抵消
            int minv = min({res.c[0].second, res.c[1].second, cnt});
            res.c[0].second -= minv;
            res.c[1].second -= minv;
            cnt -= minv;
            
            // 抵消后如果还有剩余票数,尝试占据空位
            if (cnt > 0) {
                if (res.c[0].second == 0) {
                    res.c[0] = {val, cnt};
                } else if (res.c[1].second == 0) {
                    res.c[1] = {val, cnt};
                }
            }
        }
    }
    
    // 清理票数为0的候选
    if (res.c[0].second == 0) res.c[0].first = 0;
    if (res.c[1].second == 0) res.c[1].first = 0;
    
    // 确保票数多的在前
    if (res.c[0].second < res.c[1].second) {
        swap(res.c[0], res.c[1]);
    }
    
    return res;
}

// 构建线段树
void build(int u, int l, int r) {
    if (l == r) { // 叶子节点
        seg[u].c[0] = {arr[l], 1}; // 初始候选是自己,票数为1
        seg[u].c[1] = {0, 0};      // 第二个候选为空
        return;
    }
    int mid = (l + r) / 2;
    build(u * 2, l, mid);      // 构建左子树
    build(u * 2 + 1, mid + 1, r); // 构建右子树
    seg[u] = merge(seg[u * 2], seg[u * 2 + 1]); // 合并子节点信息
}

// 区间查询
Node query(int u, int l, int r, int ql, int qr) {
    if (qr < l || r < ql) return Node(); // 查询区间与当前区间无交集
    if (ql <= l && r <= qr) return seg[u]; // 当前区间完全包含在查询区间内
    
    int mid = (l + r) / 2;
    Node left = query(u * 2, l, mid, ql, qr);    // 查询左子树
    Node right = query(u * 2 + 1, mid + 1, r, ql, qr); // 查询右子树
    return merge(left, right); // 合并左右子树结果
}

// 统计某个值在区间[l,r]内的出现次数
int count_in_range(int id, int l, int r) {
    if (id == 0) return 0; // 无效id
    auto &p = pos[id];     // 获取该值的所有位置
    // 使用二分查找统计在[l,r]范围内的数量
    auto itl = lower_bound(p.begin(), p.end(), l);
    auto itr = upper_bound(p.begin(), p.end(), r);
    return distance(itl, itr);
}

void solve() {
    int n, q;
    cin >> n >> q;
    
    // 读取并离散化数据
    arr.assign(n + 1, 0);
    vector<int> tmp(n);
    for (int i = 1; i <= n; ++i) {
        cin >> arr[i];
        tmp[i - 1] = arr[i];
    }
    
    // 去重排序
    sort(tmp.begin(), tmp.end());
    tmp.erase(unique(tmp.begin(), tmp.end()), tmp.end());
    
    // 建立双向映射
    val2id.clear();
    id2val.assign(tmp.size() + 1, 0);
    for (size_t i = 0; i < tmp.size(); ++i) {
        val2id[tmp[i]] = i + 1; // 值到id
        id2val[i + 1] = tmp[i]; // id到值
    }
    
    // 记录每个值的位置
    pos.assign(tmp.size() + 1, vector<int>());
    for (int i = 1; i <= n; ++i) {
        arr[i] = val2id[arr[i]]; // 将值转换为id
        pos[arr[i]].push_back(i); // 记录位置
    }
    
    // 构建线段树
    seg.assign(4 * (n + 1), Node());
    build(1, 1, n);
    
    // 处理查询
    for (int i = 0; i < q; ++i) {
        int l, r;
        cin >> l >> r;
        Node res = query(1, 1, n, l, r); // 查询区间候选
        int len = r - l + 1;
        int thr = len / 3; // 阈值
        
        // 验证候选是否满足条件
        vector<int> ans;
        if (res.c[0].second > 0 && count_in_range(res.c[0].first, l, r) > thr) {
            ans.push_back(id2val[res.c[0].first]);
        }
        if (res.c[1].second > 0 && count_in_range(res.c[1].first, l, r) > thr) {
            ans.push_back(id2val[res.c[1].first]);
        }
        
        // 去重排序输出
        sort(ans.begin(), ans.end());
        ans.erase(unique(ans.begin(), ans.end()), ans.end());
        
        if (ans.empty()) {
            cout << -1 << "\n";
        } else {
            for (size_t j = 0; j < ans.size(); ++j) {
                cout << ans[j] << (j == ans.size() - 1 ? "" : " ");
            }
            cout << "\n";
        }
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

U2Net网络实战:从原理到代码实现(附背景去除应用) 本文深入解析了U2Net网络的原理与代码实现,重点剖析了其独特的嵌套U型结构(RSU模块)和显著图融合机制。通过实战演示,指导读者如何加载预训练模型并应用于精准的图像背景去除任务,为电商、摄影等领域提供高效的自动化抠图解决方案。 阅读详情

相关推荐

自动驾驶仿真(五)—— 基于Carsim、Prescan、Simulink的联合仿真

自动驾驶仿真五——基于Carsim、Prescan、Simulink的联合仿真1. 联合仿真流程2. CarSim联合仿真配置要点3. Prescan联合仿真配置要点4. Carsim、Prescan、Simulink联合仿真结果5. 参考学习的书目教材 博主前面的博文已经介绍了Carsim和Prescan各自与Matlab/Simulink的相关联合仿真应用实例,并且论述过几款软件各自的优势及用法,CarSim适合动力学模型的建立,PreScan适合行车场景的搭建,Simulink适合控制算法的设计及信号

zhudj08的博客 1万+

Codeforces Round 1054 (Div. 3)(赛时 Solve 5题,A-E 题解)

给你一个长度为 nnn 的数组,每个元素都是 −1,0-1,0−1,0 或者 111。 你可以执行操作:把其中一个元素 +1+1+1 求使得 整个数组乘积 严格大于 000 的 最少操作次数首先,对于每个等于 000 的元素,都至少需要执行 111 次操作。 其次,对于 −1-1−1,由于要保证 ∏i=1nai≥1\prod_{i=1}^{n} a_i \geq 1∏i=1n​ai​≥1,所有 −1-1−1 的乘积 需要等于 111。考虑到最少操作次数,所以如果 −1-1−1 的频数等于奇数的话,我们需要进

Transient_ovo的博客 1073

锐捷交换机堆叠配置举例

一、组网需求: 1)四台S2628G进行堆叠; 2)设备在堆叠前先设置好优先级; 3)使用光口堆叠的设备如RG-S2928G-E相关配置 二、组网拓扑 三、配置要点: 普通堆叠设备不需要配置,只要把堆叠模块和线缆连接好即可 堆叠模块不支持热插拔,即插在模块连上线缆后不能立即生效,需要重启设备才生效。 如果拔掉堆叠插槽后,想再插上模块堆叠,那么必须重启设备才生效 设备堆叠需要协商参数,时间会比较久,请耐心等待 堆叠时设备建议是...

dongsheng_9234的专栏 8287

Codeforces Round 1054 (Div. 3)

Link。

weixin_52264062的博客 883

ZYNQ出现问题及解决办法汇总(一直更新)

问题目录使用软件及开发板版本一,vitis在build project时卡住。二,Could not find FPGA device on the board for connection 'Local'三,FPGA configuration failed:DONE PIN is not high四,Could not find ARM device on the board for connection 'Local' 使用软件及开发板版本 开发板:MZ7XA-7020 软件:vitis2020.2(

qq_45057368的博客 1万+

ESP32系列之LVGL(四):输入设备(外部按键)对接

本文详细介绍了如何在ESP32上使用LVGL库对接外部按键作为输入设备,包括硬件连接、驱动层实现和LVGL输入设备移植。通过具体代码示例和实战案例,帮助开发者快速实现按键控制UI界面,解决常见问题如按键无反应和控件跳转不正常。

weixin_30907935的博客 242

Codeforces Round 1054 (Div. 3)(A~D)

本文分享了Codeforces Div.3比赛中A、B、C、D四道题的解题思路和代码实现。A题要求通过最少操作使数组乘积为正,需消除0并确保负数为偶数;B题通过排序和二分查找最小化配对最大差值;C题分析如何使MEX等于k,计算缺失数和k出现次数的较大值;D题针对字符串处理,通过中位数优化交换操作次数,使某字符形成连续块。文章详细讲解了每道题的算法逻辑和具体实现,适合编程竞赛练习者参考。

2402_89341493的博客 1605

Windows下MMdetection3D保姆级安装指南(含CUDA和PyTorch版本避坑)

本文提供Windows平台下MMdetection3D的完整安装指南,重点解决CUDA与PyTorch版本匹配问题。从环境准备到关键组件安装,详细介绍了CUDA Toolkit选择策略、PyTorch精准安装步骤,以及MM系列组件的安装顺序和常见错误解决方案,帮助用户顺利完成3D目标检测环境的配置。

weixin_42628941的博客 492

Codeforces Round 1054(Div. 3)A-C 题解

本文包含三个编程问题的解法: A题:通过统计处理使数组乘积为正的最小操作次数。先处理0元素,再根据负数数量奇偶性决定是否额外操作。 B题:求排序后数组中相邻元素差的最大值。将数组排序后遍历比较相邻元素差值。 C题:计算使数组MEX为k的最小操作数。统计缺失的小于k的数和多余k的个数,取较大值作为结果。 三题均使用C++实现,涉及数组处理、排序和集合操作等算法。

Me_nb的博客 337

断点回归(regression discontinuity design)学习笔记

本篇博文主要是对断点回归的一些学习和总结~ 学习材料如下: 1 断点回归设计RDD分类与操作案例 2 RDD断点回归, Stata程序百科全书式的宝典 3 断点回归设计的前沿研究现状, RDD 4 让“跳跃”更有意义:断点回归设计(RDD) 5 Stata: 断点回归 (RDD) 教程 6 怎么用通俗的语言解释断点回归?它与DID的区别是什么 7 Watering Down Environmental Regulation in China,Guojun He, Shaoda Wang, Bing Zhan

Claire_chen_jia的博客 9万+

csp-j/s

CSP-J/S 是中国计算机学会(CCF)主办的 ‌‌(Certified Software Professional Junior/Senior),是信息学奥赛(NOI)体系的入门级选拔考试,也是国内最具权威性的青少年编程能力认证之一。

gxyxxrYYDS的博客 2029

Codeforces Round 1054(d3)ABCDEF题解

给你两个数字h和d,表示一个人的初始生命值和终点位置,从起点0出发,每次经过一个节点可以选择休息或者前进,休息加一点生命值,前进消耗第i次连续前进值的生命值,每次操作增加一个回合数量,问最少需要多少回合才能到达终点。给你一个长度为n的数组a和一个数字k,其0<=k<=n,你每次可以选择数组中的一个数,使其变为[0,n]的任何一个数,问最少修改多少次能使得整个数组的MEX变为k。:给你一个大小为n的数组a,数组仅由-1,0,1组成,每次可以选择一个数字加1,求出最小操作次数使得整个数组的所有元素乘积为正。

2402_89254607的博客 628

YOLO11涨点优化:特征融合改进 | 引入BiFPN (双向特征金字塔) 加权融合机制,自适应分配不同尺度特征权重

YOLO11与BiFPN特征融合技术解析 本文深入剖析了YOLO11目标检测架构及其BiFPN特征融合机制的关键创新。2024年发布的YOLO11通过C3k2模块、SPPF池化和C2PSA注意力机制,在COCO数据集上以更少参数实现更高精度。研究发现传统FPN+PAN结构存在特征融合权重分配不均和计算冗余问题,而BiFPN通过双向跨尺度连接和加权融合机制实现了突破: 架构创新:BiFPN采用剪枝策略、跳跃连接增强和层级重复叠加,优化信息流动路径 加权融合:提出快速归一化融合算法,动态分配特征权重,相比Sof

2601_95807009的博客 175

关于vp Codeforces Round 1054 (Div. 3)的收货

对于第二个条件,我们要的是删,删去全部才行。而因为必然能得到合法构造,所以我们不必担心没有补 的原料,所以如果删的把补的补完了 ,也就是代码中的cnt1 > cnt,那么我们只删就行了,如果删的不够补,那么把删的用完之后(包含在补的范围内),那么补的后面直接换1:1的次数就够了,这样的结果就是cnt。主要是对整体的积进行分类讨论,积为1,就返回0,积为0,则需要把所有0排除,从而使积必然不为0,积为-1,则需要将必然存在的-1加2使积为1(因为不难得出只需要一个-1变成1就能改变积)。

wsykszzrqz的博客 418

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Codeforces Round 1054 B. Unconventional Pairs(2149)

通过最后提示:可以发现,是偶数个元素,并且成对出现是排序过,然后求2个数之差,然后取最大的差值。说明:不能用冒泡排序,当测试数据2万条的时候,就会超时,根据之前排序方法,只有快速排序。最小可能的,最大差值,在元素的对对中,根据NOTE就可以推理出来。根据题意,是求,成对出现的数据之差,其差值,最大的是?参考和别人的代码,消化理解完成。

191

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【算法】摩尔投票算法

本文介绍了摩尔投票算法的相关知识。

代码星辰的博客 2639

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 248

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 320

把 KV Cache 压到 FP4:BitDecoding-FP4 的算法-系统协同设计复盘

长上下文推理卡在KV Cache的显存与带宽上,而现有FP4方案要么精度崩、要么速度废。这篇文章复盘BitDecoding-FP4如何用三个算法补丁加一个系统重构,在B300上把服务吞吐提升2.4–3.0倍,精度几乎不掉。

helloagent的博客 193

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 596

优选算法:分治-归并排序

交易逆序对的总数

Wangshijie1015的博客 126

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 22

408 算法 06|堆与 Top-K:最小的 10 个数,到底该用数组还是堆

2022(42) 找 100 万个数里最小的 10 个,官方给了"10 元素有序数组"和"大根堆"两种答案。我把两种都实现并数了比较次数:k=10 时两者几乎打平,k=10000 时堆少 111 倍。另附 2021(42) 计数排序的比较次数与稳定性实测。

m0_56226131的博客 357

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 172

408 算法 04|主元素与三元组最小距离:两种“扫描时做决定“的思路

2013(41) 的主元素用摩尔投票一遍选出候选,但真正的考点是"选完必须验票";2020(41) 的三元组最小距离,三指针每次只挪最小的那个,靠的是 D=2×(max−min) 这个恒等式。两套完整 C 代码加真实输出,附官方评分档位表。

m0_56226131的博客 414

【数据结构-3】算法美学之降复杂度

在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。

weixin_44218929的博客 89
上一篇: The 2024 ICPC Asia Hangzhou Regional Contest (2024杭州区域赛AKHEM)
下一篇: The 2023 ICPC Asia Macau Regional Contest (2023澳门区域赛ADIJ)
西望云天
博客等级 码龄3年 74粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值