【Luogu】P1972HH的项链(链表+树状数组)
题目链接
难题,所以会讲得细一些。
首先我们想如何统计区间[l,r]内不同贝壳的个数。
第一个思路就是线段树/树状数组,query(1,r)-query(1,l-1)对不对?
然而这样是不对的。
然后我们举个例子:
例如有一段区间是[ 1 2 3 1 2 3 1 2 3 ]这样子,如果要统计不同贝壳的个数,那么一个贝壳就可以代表所有同色贝壳。
也就是说,假设要统计这个区间内1有没有出现,那这个区间变成这样子:[ 1 2 3 0 2 3 0 2 3 ] 或 [ 0 2 3 1 2 3 1 2 3 ] 或什么样子,都是一样的,只要1出现过一次,那就说明1出现过了。
所以可以把所有询问按左端点排序,左端点相同的按照右端点排序,然后挨个统计:
设next[ j ] 表示:x为j位置贝壳的颜色,next[j]表示的就是j后面第一个颜色为x的位置。如在我们举的例子中,next[1]=4,next[2]=5,next[5]=8。
然后我们在刚开始初始化的时候,只有所有颜色第一次出现的位置作为该颜色的代表贝壳,也就是说只有这几个位置有1个不同的贝壳。
然后在扫描询问数组的时候,把q[i-1].l到q[i].l之间的不同贝壳个数更新。具体方法是把next[当前位置]所指向的位置不同的贝壳变成1。
这样就可以树状数组查询了。
#include<cstdio> #include<cstdlib> #include<cctype> #include<cstring> #include<algorithm>inline long long read(){long long num=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}while(isdigit(ch)){num=num*10+ch-'0';ch=getchar();}return num*f; }struct line{int l,r,id,ans;bool operator <(const line &a)const{if(l!=a.l) return l<a.l;return r<a.r;} }q[1000100]; bool cmp(line a,line b){ return a.id<b.id; } int n; int tree[1000100]; inline void add(int pos){while(pos<=n){tree[pos]++;pos+=pos&(-pos);} } inline int query(int pos){int ans=0;while(pos){ans+=tree[pos];pos-=pos&(-pos);}return ans; }int pre[1001010]; int next[1001010]; int vis[1001010]; int que[1001010];int main(){n=read();for(int i=1;i<=n;++i){que[i]=read();next[pre[que[i]]]=i;if(!pre[que[i]]){add(i);vis[i]=1;}pre[que[i]]=i;}int m=read();for(int i=1;i<=m;++i) q[i]=(line){read(),read(),i};std::sort(q+1,q+m+1);q[0].l=1;for(int i=1;i<=m;++i){if(q[i-1].l!=q[i].l)for(int j=q[i-1].l;j<q[i].l;++j)if(next[j]&&!vis[next[j]]){vis[next[j]]=1;add(next[j]);}q[i].ans=query(q[i].r)-query(q[i].l-1);}std::sort(q+1,q+m+1,cmp);for(int i=1;i<=m;++i) printf("%d\n",q[i].ans);return 0; }
转载于:https://www.cnblogs.com/cellular-automaton/p/7661936.html
【Luogu】P1972HH的项链(链表+树状数组)相关推荐
- luogu P2344 奶牛抗议 DP 树状数组 离散化
P2344 奶牛抗议 最新讨论 暂时没有讨论 题目背景 Generic Cow Protests, 2011 Feb 题目描述 约翰家的N 头奶牛正在排队游行抗议.一些奶牛情绪激动,约翰测算下来,排在 ...
- [luogu] P1637 三元上升子序列 树状数组
前言 真简单,数据结构真简单!! 传送门 : 思路 计算一个 三元上升序列 我们可以枚举 中间节点 然后通过乘法原理 记录Left[]和Right[]Left[] 和 Right[]Left[]和Ri ...
- Luogu P4178 Tree (点分治 + 树状数组)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P4178 Prob ...
- HH的项链 HYSBZ - 1878 (莫队/ 树状数组)
HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此他的项链变得越来越长.有一天,他突然 ...
- 【DP】【树状数组】方伯伯的玉米田/优美玉米(luogu 3287/金牌导航 数据结构优化DP-5)
正题 luogu 3287 金牌导航 数据结构优化DP-5 题目大意 有n个玉米,给出高度,你可以选择一个区间,使这个区间的玉米高度+1,你可以进行k次这样的操作,查询你操作完后最长不下降子序列最大值 ...
- 【DP】【树状数组】免费馅饼(luogu 7302/金牌导航 数据结构优化DP-4)
正题 luogu 7302 金牌导航 数据结构优化DP-4 题目大意 在坐标轴上会出现n个金币,第i个金币tit_iti时在wiw_iwi出现(只出现一个单位时间),价值为sis_isi,当你t ...
- 【LCT】【树状数组】Matches Are Not a Child‘s Play(luogu CF1137F)
正题 luogu CF1137F 题目大意 定义一棵树的产出序列为依次删除权值最小的叶子节点的顺序 进行q此操作: 1.把一个点的权值改为当前树中的最大权值+1 2.查询一个点在删除序列中的位置 3. ...
- 【树状数组】Bzoj1878[SDOI2009] HH的项链
Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的项链变 ...
- bzoj 1878: [SDOI2009]HH的项链 ——树状数组+ 差分
Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此他的项链变得 ...
- 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】
U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...
最新文章
- c语言中的字节序和字节对齐,C语言字节序对齐以及空间利用率
- java toolkit invoker_有没有哪位老哥愿意帮一下新人啊
- VTK:Filtering之ConstrainedDelaunay2D
- 上下div高度动态自适应--另类处理方案
- C#设计模式之9-装饰者模式
- 曝微信低调上线“银行储蓄”服务,这是越来越像支付宝的节奏?
- C语言二级考试都是从题库抽取吗,c語言二級考試題庫_全國計算機等級考試二級C語言的考試題目都是從《C語言題庫》裡面抽取的題目嗎_淘題吧...
- 内存调试工具Electric Fence
- 基于Java的超市水果管理系统_技术分享 - 基于JAVA SWING结合链表的水果超市管理系统...
- html页面如何嵌套if标签,IF嵌套10个以上
- 学生成绩管理系统html代码,学生成绩管理系统(含源代码)30.doc
- GWO灰狼优化算法综述(Grey Wolf Optimization)
- STM32C8T6 学习总结+资料分享
- 巡检报告实例-Python脚本生成
- 光模块中的DDM介绍
- 《电商系统后台统计报表模块》需求分析与设计的课程小结
- MySQL入门实战 一
- Tanner L-Edit 系列教程:03 文件操作
- ubuntu翻译工具 GoldenDict 词典
- FPGA学习经典网站推荐