Sona NBUT - 1457 CodeForces 220B Little Elephant and Array 【莫队 + 离散化】

本文探讨了在处理大规模数据集的算法竞赛题目中,如何运用离散化技巧来优化解决方案。通过对比分析NBUT1457和CodeForces220B两个题目,展示了离散化在降低数据复杂度、提高算法效率方面的作用。文章深入讲解了离散化过程,并提供了详细的代码实现。

NBUT 1457 是要求区间内不同的数出现次数的立方和

CodeForces 220B 是要求区间内不同的数出现次数等于其本身个数和。

由于两题给的数都是 1 ~ 1e9, 而且n的范围是1 ~ 1e5, 所以都需要离散化一下。这两题也就十分相似。

NBUT 1457

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#define ll __int64
using namespace std;
const int N = 100103;
int n, m, pos[N];
int c[N], sub[N] ;
ll s[N], ans;
inline ll cube(ll x) {
    return x*x*x;
}
struct node {
    int l, r, id;
    ll ans;
}q[N];
bool cmp(node a, node b) {
    if(pos[a.l] == pos[b.l]) {
        return a.r < b.r;
    }
    return a.l < b.l;
}
bool cmpId(node a, node b) {
    return a.id < b.id;
}
inline void scanf_(int &num) {
    char in;
    bool neg=false;
    while(((in=getchar()) > '9' || in<'0') && in!='-') ;
    if(in=='-') {
        neg=true;
        while((in=getchar()) >'9' || in<'0');
    }
    num=in-'0';
    while(in=getchar(),in>='0'&&in<='9')
        num*=10,num+=in-'0';
    if(neg)
        num=0-num;
}
void Update(int index, int tp) {
    ans -= cube(s[c[index]]);
   // ans -= (ll)s[c[index]]*s[c[index]]*s[c[index]];
    s[c[index]] += tp;
    ans += cube(s[c[index]]);
    //ans += (ll)s[c[index]]*s[c[index]]*s[c[index]];
}
void solve() {
    for(int i=1, l=1,r=0; i<=m; i++) {
        if(q[i].l==q[i].r) {
            q[i].ans=1;
            continue;
        }
        for( ; r<q[i].r; r++) {
            Update(r+1, 1);
        }
        for( ; r>q[i].r; r--) {
            Update(r, -1);
        }
        for( ; l<q[i].l; l++) {
            Update(l, -1);
        }
        for( ; l>q[i].l; l--) {
            Update(l-1, 1);
        }
        q[i].ans = ans;
    }
}
int main() {
    while(scanf("%d", &n)!=EOF) {
        memset(s, 0, sizeof(s)), ans = 0;
        int block = (int)sqrt(n*1.0);
        for(int i=1; i<=n; i++) scanf_(c[i]), pos[i] = (i-1)/block + 1,sub[i] = c[i];
        scanf_(m);
        for(int i=1; i<=m; i++) {
//            scanf("%d%d", &q[i].l, &q[i].r);
            scanf_(q[i].l);
            scanf_(q[i].r);
            q[i].id = i;
        }
        sort(sub+1, sub+n+1);
        int Size = unique(sub+1, sub+n+1) - (sub+1);
        for(int i=1; i<=n; i++) {
            c[i] = lower_bound(sub+1, sub+Size+1, c[i]) - (sub+1);
        }
        sort(q+1, q+1+m, cmp);
        solve();
        sort(q+1, q+1+m, cmpId);
        for(int i=1; i<=m; i++) {
            printf("%I64d\n",q[i].ans);
        }
    }
    return 0;
}

CodeForces 220B

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#define ll long long
using namespace std;
const int N = 200103;
int n, m, pos[N];
int c[N], sub[N], b[N];
ll s[N], ans;
bool vis[N];
struct node {
    int l, r, id;
    ll ans;
}q[N];
bool cmp(node a, node b) {
    if(pos[a.l] == pos[b.l]) {
        return a.r < b.r;
    }
    return a.l < b.l;
}
bool cmpId(node a, node b) {
    return a.id < b.id;
}
inline void scanf_(int &num) {
    char in;
    bool neg=false;
    while(((in=getchar()) > '9' || in<'0') && in!='-') ;
    if(in=='-') {
        neg=true;
        while((in=getchar()) >'9' || in<'0');
    }
    num=in-'0';
    while(in=getchar(),in>='0'&&in<='9')
        num*=10,num+=in-'0';
    if(neg)
        num=0-num;
}
void Update(int index, int tp) {
    s[c[index]] += tp;
    if(s[c[index]] == b[index]+tp) ans--;
    if(s[c[index]]==b[index]) ans++;
}
void solve() {
    for(int i=1, l=1,r=0; i<=m; i++) {
        for( ; r<q[i].r; r++) {
            Update(r+1, 1);
        }
        for( ; r>q[i].r; r--) {
            Update(r, -1);
        }
        for( ; l<q[i].l; l++) {
            Update(l, -1);
        }
        for( ; l>q[i].l; l--) {
            Update(l-1, 1);
        }
        q[i].ans = ans;
    }
}
int main() {
    while(scanf("%d%d", &n, &m)!=EOF) {
        memset(s, 0, sizeof(s)), ans = 0;
        int block = (int)sqrt(n*1.0), sum = 0;
        for(int i=1; i<=n; i++){
            scanf("%d", &c[i]);
            sub[i] = c[i];
            b[i] = c[i];
            pos[i] = (i-1)/block + 1;
        }
        for(int i=1; i<=m; i++) {
            scanf("%d%d", &q[i].l, &q[i].r);
            q[i].id = i;
        }
        sort(sub+1, sub+n+1);
        int Size = unique(sub+1, sub+n+1) - (sub);
        for(int i=1; i<=n; i++) {
            c[i] = lower_bound(sub+1, sub+Size, c[i]) - (sub);
        }
        sort(q+1, q+1+m, cmp);
        solve();
        sort(q+1, q+1+m, cmpId);
        for(int i=1; i<=m; i++) {
            printf("%lld\n",q[i].ans);
        }
    }
    return 0;
}

 

源码链接: https://pan.quark.cn/s/fa13cd6c6c8d Chrome浏览器作为一款备受青睐的网页浏览器,凭借其出色的稳定性和运行速度获得了广泛认可。 然而出于安全考量,Chrome系统默认不兼容ActiveX插件,因为ActiveX技术主要应用于Internet Explorer,它赋予网页内容与用户本地系统交互的能力,但同时也可能引发潜在的安全隐患。 不过在某些特定工作场景下,比如在企业内部网络环境或需要与老旧应用程序整合时,可能仍需在Chrome中启用ActiveX控件。 为此我们必须掌握在Chrome浏览器下加载和运用ActiveX的方法。 首先需要明确ActiveX的本质。 ActiveX是由微软设计的一种技术框架,旨在开发可在网页环境中运行的控件,这些控件能够完成多种功能,包括视频播放、应用程序组件运行或与硬件设备通信等。 ActiveX控件多以OCX(OLE控件)格式发布。 在Chrome浏览器中启用ActiveX需要采取额外措施,因为该浏览器本身并不支持此项技术。 以下是几种常见的解决方案: 1. **应用Chrome的兼容性设置**:部分Chrome版本提供了" --enable-internal-activex"命令行参数,可通过此参数使浏览器具备加载ActiveX控件的能力。 用户可在启动Chrome时,于快捷方式的目标路径后附加该参数来激活此功能。 例如:"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --enable-internal-activex。 2. **安装第三方插件**:市面上存在一些第三方插件,例如"IE Tab"或"ActiveX Con...
标题SpringBoot与微信小程序结合的健康饮食平台研究AI更换标题第1章引言介绍健康饮食平台的研究背景、意义、国内外研究现状、论文方法及创新点。1.1研究背景与意义阐述健康饮食平台在当前社会的重要性及其市场需求。1.2国内外研究现状分析国内外健康饮食平台的发展现状及趋势。1.3研究方法及创新点概述本文采用的研究方法和技术创新点。第2章相关理论总结健康饮食、SpringBoot及微信小程序的相关理论。2.1健康饮食理论介绍健康饮食的基本原则和营养学知识。2.2SpringBoot框架阐述SpringBoot框架的特点、优势及在项目中的应用。2.3微信小程序技术介绍微信小程序的开发技术、特点及其用户群体。第3章健康饮食平台设计详细介绍健康饮食平台的设计方案,包括前端和后端设计。3.1平台架构设计给出平台的整体架构、模块划分及交互流程。3.2数据库设计介绍数据库的设计思路、表结构及数据关系。3.3前后端交互设计阐述前后端数据交互的方式、接口设计及安全性考虑。第4章微信小程序实现介绍微信小程序的具体实现过程,包括页面设计、功能实现等。4.1页面设计与布局给出微信小程序的页面设计思路、布局及交互效果。4.2功能实现与测试详细介绍微信小程序各项功能的实现过程及测试方法。4.3用户体验优化阐述如何提升微信小程序的用户体验,包括界面优化、性能优化等。第5章平台测试与优化对健康饮食平台进行测试,并根据测试结果进行优化。5.1测试环境与数据介绍测试环境、测试数据及测试方法。5.2测试结果分析从功能、性能、用户体验等方面对测试结果进行详细分析。5.3平台优化策略根据测试结果提出平台优化策略,包括代码优化、功能改进等。第6章结论与展望总结本文的研究成果,并展望未来的研究方向。6.1研究结论概括本文的主要研究结论和平台实现效果。6.2展望指出本文研究的不足之处以及未来研究的方向和改进点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值