[SDOI2009]HH的项链 和 [HEOI2012]采花两题树状数组解法对比分析

2023-10-09 15:38

本文主要是介绍[SDOI2009]HH的项链 和 [HEOI2012]采花两题树状数组解法对比分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://www.luogu.com.cn/problem/P1972

  • HH的项链这个题是静态区间查询的问题,如果用树状数组来解决,那么容易想到的方法是比如说问 [ l , r ] 的 [l,r]的 [l,r]不同贝壳数量,那么我如果用树状数组维护区间的不同贝壳数,那么答案应该是 q u e r y ( r ) − q u e r y ( l − 1 ) query(r)-query(l-1) query(r)query(l1),但是这里带来一个问题,就是 [ 1 , l ] [1,l] [1,l] [ 1 , r ] [1,r] [1,r]这两个区间里面不能有重复的贝壳,否则就会出错,那如何来解决呢?
  • 一个办法就是记录当前贝壳的上一次出现的位置,如果当前贝壳不是第一次出现,那么把它上一次出现的位置所对应的树状数组的值 − 1 -1 1,这次出现的位置所对应的树状数组的值 + 1 +1 +1,但这同样存在一个问题,如果你询问右端点在上一个出现位置前面怎么办?所以我们要先把查询时候的右端点按照从小到大的顺序排个序,然后就可以进行上述操作了,每次查询完毕就记录答案
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <cmath>
#include <cstdio>
#include <map>
#include <unordered_map>
using namespace std;
typedef long long ll;
const int MAXN = 2e6 + 100;
const int INF = 0x3f3f3f3f;
int Data[MAXN];
int a[MAXN];
int n, m;
struct st{int l, r;int id;bool operator< (st &x)const {return r < x.r;}
}s[MAXN];
int lowbit(int x){return x & -x;
}
void ADD(int x, int val){while(x <= n){Data[x] += val;x += lowbit(x);}
}
int query(int x){int res = 0;while(x > 0){res += Data[x];x -= lowbit(x);}return res;
}
int last[MAXN], pre[MAXN];
int ans[MAXN];
int main(){#ifdef LOCALfreopen("input.txt", "r", stdin);freopen("output.txt", "w", stdout);#endifios::sync_with_stdio(false);cin >> n;for(int i=1;i<=n;i++){cin >> a[i];pre[i] = last[a[i]];last[a[i]] = i;}cin >> m;for(int i=1;i<=m;i++){cin >> s[i].l >> s[i].r;s[i].id = i;}sort(s + 1, s + 1 + m);int now = 1;for(int i=1;i<=m;i++){while(now <= s[i].r){if(pre[now]){ADD(pre[now], -1);}ADD(now, 1);++now;}ans[s[i].id] = query(s[i].r) - query(s[i].l - 1);}for(int i=1;i<=m;i++){cout << ans[i] << '\n';}return 0;
}

https://www.luogu.com.cn/problem/P4113

  • 这个题问的也是种类数,也是静态区间查询问题,查询区间之间也是独立的,但是和上一个题的区别是必须有两个以上的同种颜色的花才能算数,这样的话我们可以再记录一个前驱的前驱,查询的时候先让前驱所对应的树状数组的值 + 1 +1 +1,前驱的前驱所对应树状数组的值 − 1 -1 1,当然前驱和前驱的前驱必须存在才能做相关操作
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <cmath>
#include <cstdio>
#include <map>
#include <unordered_map>
using namespace std;
typedef long long ll;
const int MAXN = 2e6 + 100;
const int INF = 0x3f3f3f3f;
int Data[MAXN];
int a[MAXN];
int n, c, m;
struct st{int l, r;int id;bool operator< (st &x)const {return r < x.r;}
}s[MAXN];
int lowbit(int x){return x & -x;
}
void ADD(int x, int val){while(x <= n){Data[x] += val;x += lowbit(x);}
}
int query(int x){int res = 0;while(x > 0){res += Data[x];x -= lowbit(x);}return res;
}
int last[MAXN], pre[MAXN], prepre[MAXN];
int ans[MAXN];
int main(){#ifdef LOCALfreopen("input.txt", "r", stdin);freopen("output.txt", "w", stdout);#endifios::sync_with_stdio(false);cin >> n >> c >> m;for(int i=1;i<=n;i++){cin >> a[i];pre[i] = last[a[i]];last[a[i]] = i;prepre[i] = pre[pre[i]];}for(int i=1;i<=m;i++){cin >> s[i].l >> s[i].r;s[i].id = i;}sort(s + 1, s + 1 + m);int now = 1;for(int i=1;i<=m;i++){while(now <= s[i].r){if(pre[now]){ADD(pre[now], 1);}if(prepre[now]){ADD(prepre[now], -1);}++now;}ans[s[i].id] = query(s[i].r) - query(s[i].l - 1);}for(int i=1;i<=m;i++){cout << ans[i] << '\n';}return 0;
}

这篇关于[SDOI2009]HH的项链 和 [HEOI2012]采花两题树状数组解法对比分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/173844

相关文章

Java实现本地缓存的四种方法实现与对比

《Java实现本地缓存的四种方法实现与对比》本地缓存的优点就是速度非常快,没有网络消耗,本地缓存比如caffine,guavacache这些都是比较常用的,下面我们来看看这四种缓存的具体实现吧... 目录1、HashMap2、Guava Cache3、Caffeine4、Encache本地缓存比如 caff

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

MySQL中读写分离方案对比分析与选型建议

《MySQL中读写分离方案对比分析与选型建议》MySQL读写分离是提升数据库可用性和性能的常见手段,本文将围绕现实生产环境中常见的几种读写分离模式进行系统对比,希望对大家有所帮助... 目录一、问题背景介绍二、多种解决方案对比2.1 原生mysql主从复制2.2 Proxy层中间件:ProxySQL2.3

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499