Codeforces1418 D. Trash Problem(set)

本文介绍了一种垃圾清理算法,目标是在二维坐标系中将所有垃圾堆集中到两个不同的x坐标上,通过最少的移动次数实现。文章详细解释了算法的运行过程,包括如何处理垃圾堆的添加和移除操作,以及如何计算每次操作后的最小移动次数。

Vova decided to clean his room. The room can be represented as the coordinate axis 𝑂𝑋. There are 𝑛 piles of trash in the room, coordinate of the 𝑖-th pile is the integer 𝑝𝑖. All piles have different coordinates.

Let’s define a total cleanup as the following process. The goal of this process is to collect all the piles in no more than two different 𝑥 coordinates. To achieve this goal, Vova can do several (possibly, zero) moves. During one move, he can choose some 𝑥 and move all piles from 𝑥 to 𝑥+1 or 𝑥−1 using his broom. Note that he can’t choose how many piles he will move.

Also, there are two types of queries:

0 𝑥 — remove a pile of trash from the coordinate 𝑥. It is guaranteed that there is a pile in the coordinate 𝑥 at this moment.
1 𝑥 — add a pile of trash to the coordinate 𝑥. It is guaranteed that there is no pile in the coordinate 𝑥 at this moment.
Note that it is possible that there are zero piles of trash in the room at some moment.

Vova wants to know the minimum number of moves he can spend if he wants to do a total cleanup before any queries. He also wants to know this number of moves after applying each query. Queries are applied in the given order. Note that the total cleanup doesn’t actually happen and doesn’t change the state of piles. It is only used to calculate the number of moves.

For better understanding, please read the Notes section below to see an explanation for the first example.

Input
The first line of the input contains two integers 𝑛 and 𝑞 (1≤𝑛,𝑞≤105) — the number of piles in the room before all queries and the number of queries, respectively.

The second line of the input contains 𝑛 distinct integers 𝑝1,𝑝2,…,𝑝𝑛 (1≤𝑝𝑖≤109), where 𝑝𝑖 is the coordinate of the 𝑖-th pile.

The next 𝑞 lines describe queries. The 𝑖-th query is described with two integers 𝑡𝑖 and 𝑥𝑖 (0≤𝑡𝑖≤1;1≤𝑥𝑖≤109), where 𝑡𝑖 is 0 if you need to remove a pile from the coordinate 𝑥𝑖 and is 1 if you need to add a pile to the coordinate 𝑥𝑖. It is guaranteed that for 𝑡𝑖=0 there is such pile in the current set of piles and for 𝑡𝑖=1 there is no such pile in the current set of piles.

Output
Print 𝑞+1 integers: the minimum number of moves Vova needs to do a total cleanup before the first query and after each of 𝑞 queries.

Examples
inputCopy
5 6
1 2 6 8 10
1 4
1 9
0 6
0 10
1 100
1 50
outputCopy
5
7
7
5
4
8
49
inputCopy
5 8
5 1 2 4 3
0 1
0 2
0 3
0 4
0 5
1 1000000000
1 1
1 500000000
outputCopy
3
2
1
0
0
0
0
0
499999999
Note
Consider the first example.

Initially, the set of piles is [1,2,6,8,10]. The answer before the first query is 5 because you can move all piles from 1 to 2 with one move, all piles from 10 to 8 with 2 moves and all piles from 6 to 8 with 2 moves.

After the first query, the set becomes [1,2,4,6,8,10]. Then the answer is 7 because you can move all piles from 6 to 4 with 2 moves, all piles from 4 to 2 with 2 moves, all piles from 2 to 1 with 1 move and all piles from 10 to 8 with 2 moves.

After the second query, the set of piles becomes [1,2,4,6,8,9,10] and the answer is the same (and the previous sequence of moves can be applied to the current set of piles).

After the third query, the set of piles becomes [1,2,4,8,9,10] and the answer is 5 because you can move all piles from 1 to 2 with 1 move, all piles from 2 to 4 with 2 moves, all piles from 10 to 9 with 1 move and all piles from 9 to 8 with 1 move.

After the fourth query, the set becomes [1,2,4,8,9] and the answer is almost the same (the previous sequence of moves can be applied without moving piles from 10).

After the fifth query, the set becomes [1,2,4,8,9,100]. You can move all piles from 1 and further to 9 and keep 100 at its place. So the answer is 8.

After the sixth query, the set becomes [1,2,4,8,9,50,100]. The answer is 49 and can be obtained with almost the same sequence of moves as after the previous query. The only difference is that you need to move all piles from 50 to 9 too.

题意:
有一些点有东西,要求你指定两个洞,然后把每个点的东西依次移动到洞里(东西如果在一个点可以合并)。求最小操作次数。

然后还有删除东西和加东西的操作。

思路:
很明显洞直接放在两边就好了,所以结果就是东西的左右距离减去中间两个相邻东西最大距离。用set维护这个最大距离就好了。


#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
 
using namespace std;
 
typedef long long ll;
 
const int maxn = 2e5 + 7;
const int INF = 0x3f3f3f3f;
 
int a[maxn];
map<int,int>mp;
set<int>st;//所有的值
multiset<int>mst;//所有的间距
 
int main() {
    int n,q;scanf("%d%d",&n,&q);
    for(int i = 1;i <= n;i++) {
        scanf("%d",&a[i]);
        mp[a[i]]++;
        st.insert(a[i]);
    }
    sort(a + 1,a + 1 + n);
    int mx = 0;
    for(int i = 2;i <= n;i++) {
        mst.insert(a[i] - a[i - 1]);
    }
    if(st.size() <= 1) printf("0\n");
    else {
        mx = *(--mst.end());
        printf("%d\n",a[n] - a[1] - mx);
    }
    
    for(int i = 1;i <= q;i++) {
        int t,x;scanf("%d%d",&t,&x);
        if(t == 1) {
            if(mp[x] == 0) {
                auto it = st.lower_bound(x);
                int pre = 0,nex = 0;
                if(it != st.end()) { //后继
                    nex = *it;
                    mst.insert(nex - x);
                }
                if(it != st.begin()) { //前驱
                    pre = *(--it);
                    mst.insert(x - pre);
                }
                if(nex && pre) mst.erase(mst.find(nex - pre));
                st.insert(x);
            }
            mp[x]++;
        } else {
            if(mp[x] == 1) {
                auto it = st.find(x);
                int pre = 0,nex = 0;
                if(++it != st.end()) { //后继
                    nex = *it;
                    mst.erase(mst.find(nex - x));
                }
                --it;
                if(it != st.begin()) { //前驱
                    pre = *(--it);
                    mst.erase(mst.find(x - pre));
                }
                if(pre && nex) mst.insert(nex - pre);
                st.erase(st.find(x));
            }
            mp[x]--;
        }
        if(st.size() <= 1) {
            printf("0\n");
            continue;
        }
        mx = *(--mst.end());
        printf("%d\n",*(--st.end()) - *(st.begin()) - mx);
    }
    return 0;
}
本实践项目深入研究了基于C#编程环境与Halcon图像处理工具包的条码检测技术实现。该原型系统具备静态图像解析与动态视频分析双重功能,通过具体案例展示了人工智能技术在自动化数据采集领域的集成方案。 C#作为微软研发的面向对象编程语言,在Windows生态系统中占据重要地位。其语法体系清晰规范,配合.NET框架提供的完备类库支持,能够有效构建各类企业级应用解决方案。在计算机视觉技术体系中,条码识别作为关键分支,通过机器自动解析商品编码信息,为仓储管理、物流追踪等业务场景提供技术支持。 Halcon工具包集成了工业级图像处理算法,其条码识别模块支持EAN-13、Code128、QR码等多种国际标准格式。通过合理配置检测算子参数,可在C#环境中实现高精度条码定位与解码功能。项目同时引入AForge.NET开源框架的视频处理组件,其中Video.DirectShow模块实现了对摄像设备的直接访问控制。 系统架构包含以下核心模块: 1. Halcon接口封装层:完成图像处理功能的跨平台调用 2. 视频采集模块:基于AForge框架实现实时视频流获取 3. 静态图像分析单元:处理预存图像文件的条码识别 4. 动态视频解析单元:实现实时视频流的连续帧分析 5. 主控程序:协调各模块工作流程 系统运行时可选择图像文件输入或实时视频采集两种工作模式。识别过程中将自动标注检测区域,并输出解码后的标准条码数据。该技术方案为零售业自动化管理、智能仓储系统等应用场景提供了可靠的技术实现路径,对拓展计算机视觉技术的实际应用具有重要参考价值。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
Java内存泄漏发现技术研究.pdf内容概要:本文围绕Java内存泄漏的发现技术展开研究,针对现有研究多集中于泄漏发生后的诊断与修复,而缺乏对泄漏现象早期发现方法的不足,提出了一套结合动态与静态分析的综合解决方案。动态方面,设计了一种面向泄漏的单元测试生成方法,通过识别高风险泄漏模块并生成具有泄漏检测能力的单元测试,实现早期泄漏发现;静态方面,提出基于模式的检测方法,重点识别因错误使用WeakHashMap等弱引用结构导致的内存泄漏,通过静态扫描源代码提前发现潜在缺陷。系统基于JUnit、CodePro Analytix和Soot等工具实现,实验验证了其在JDK等开源项目中发现已知泄漏缺陷的能力。; 适合人群:具备一定Java编程基础,从事软件开发、测试或质量保障工作1-3年的研发人员,以及对程序分析、内存管理感兴趣的研究生或技术人员。; 使用场景及目标:①帮助开发者在编码和测试阶段主动发现潜在内存泄漏,提升软件健壮性;②为构建自动化内存泄漏检测工具链提供理论与实践参考;③深入理解Java内存泄漏的常见模式(如WeakHashMap误用)及对应的动态测试生成与静态分析技术。; 阅读建议:建议结合Soot、JUnit等工具的实际操作进行学习,重点关注第三章和第四章提出的三类泄漏模块识别算法与基于模式的静态检测流程,并通过复现实验加深对溢出分析、指向分析等底层技术的理解。
本方案提供一套完整的锂离子电池健康状态评估系统,采用Python编程语言结合Jupyter交互式开发环境与MATLAB数值计算平台进行协同开发。该技术框架适用于高等教育阶段的毕业设计课题、专业课程实践任务以及工程研发项目。 系统核心算法基于多参数退化模型,通过分析电池循环充放电过程中的电压曲线特性、内阻变化趋势和容量衰减规律,构建健康状态评估指标体系。具体实现包含特征参数提取模块、容量回归预测模型和健康度评估单元三个主要组成部分。特征提取模块采用滑动窗口法处理时序数据,运用小波变换消除测量噪声;预测模型集成支持向量回归与高斯过程回归方法,通过交叉验证优化超参数;评估单元引入模糊逻辑判断机制,输出健康状态百分制评分。 开发过程中采用模块化架构设计,数据预处理、特征工程、模型训练与验证等环节均实现独立封装。代码结构遵循工程规范,配备完整注释文档和单元测试案例。经严格验证,该系统在标准数据集上的评估误差控制在3%以内,满足工业应用精度要求。 本方案提供的实现代码可作为研究基础,支持进一步功能扩展与性能优化,包括但不限于引入深度学习网络结构、增加多温度工况适配、开发在线更新机制等改进方向。所有核心函数均采用可配置参数设计,便于根据具体应用场景调整算法性能。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值