题目链接

  难题,所以会讲得细一些。

  首先我们想如何统计区间[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的项链(链表+树状数组)相关推荐

  1. luogu P2344 奶牛抗议 DP 树状数组 离散化

    P2344 奶牛抗议 最新讨论 暂时没有讨论 题目背景 Generic Cow Protests, 2011 Feb 题目描述 约翰家的N 头奶牛正在排队游行抗议.一些奶牛情绪激动,约翰测算下来,排在 ...

  2. [luogu] P1637 三元上升子序列 树状数组

    前言 真简单,数据结构真简单!! 传送门 : 思路 计算一个 三元上升序列 我们可以枚举 中间节点 然后通过乘法原理 记录Left[]和Right[]Left[] 和 Right[]Left[]和Ri ...

  3. Luogu P4178 Tree (点分治 + 树状数组)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P4178 Prob ...

  4. HH的项链 HYSBZ - 1878 (莫队/ 树状数组)

    HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此他的项链变得越来越长.有一天,他突然 ...

  5. 【DP】【树状数组】方伯伯的玉米田/优美玉米(luogu 3287/金牌导航 数据结构优化DP-5)

    正题 luogu 3287 金牌导航 数据结构优化DP-5 题目大意 有n个玉米,给出高度,你可以选择一个区间,使这个区间的玉米高度+1,你可以进行k次这样的操作,查询你操作完后最长不下降子序列最大值 ...

  6. 【DP】【树状数组】免费馅饼(luogu 7302/金牌导航 数据结构优化DP-4)

    正题 luogu 7302 金牌导航 数据结构优化DP-4 题目大意 在坐标轴上会出现n个金币,第i个金币tit_iti​时在wiw_iwi​出现(只出现一个单位时间),价值为sis_isi​,当你t ...

  7. 【LCT】【树状数组】Matches Are Not a Child‘s Play(luogu CF1137F)

    正题 luogu CF1137F 题目大意 定义一棵树的产出序列为依次删除权值最小的叶子节点的顺序 进行q此操作: 1.把一个点的权值改为当前树中的最大权值+1 2.查询一个点在删除序列中的位置 3. ...

  8. 【树状数组】Bzoj1878[SDOI2009] HH的项链

    Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的项链变 ...

  9. bzoj 1878: [SDOI2009]HH的项链 ——树状数组+ 差分

    Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此他的项链变得 ...

  10. 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】

    U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...

最新文章

  1. c语言中的字节序和字节对齐,C语言字节序对齐以及空间利用率
  2. java toolkit invoker_有没有哪位老哥愿意帮一下新人啊
  3. VTK:Filtering之ConstrainedDelaunay2D
  4. 上下div高度动态自适应--另类处理方案
  5. C#设计模式之9-装饰者模式
  6. 曝微信低调上线“银行储蓄”服务,这是越来越像支付宝的节奏?
  7. C语言二级考试都是从题库抽取吗,c語言二級考試題庫_全國計算機等級考試二級C語言的考試題目都是從《C語言題庫》裡面抽取的題目嗎_淘題吧...
  8. 内存调试工具Electric Fence
  9. 基于Java的超市水果管理系统_技术分享 - 基于JAVA SWING结合链表的水果超市管理系统...
  10. html页面如何嵌套if标签,IF嵌套10个以上
  11. 学生成绩管理系统html代码,学生成绩管理系统(含源代码)30.doc
  12. GWO灰狼优化算法综述(Grey Wolf Optimization)
  13. STM32C8T6 学习总结+资料分享
  14. 巡检报告实例-Python脚本生成
  15. 光模块中的DDM介绍
  16. 《电商系统后台统计报表模块》需求分析与设计的课程小结
  17. MySQL入门实战 一
  18. Tanner L-Edit 系列教程:03 文件操作
  19. ubuntu翻译工具 GoldenDict 词典
  20. FPGA学习经典网站推荐

热门文章

  1. R语言数据可视化---交互式图表recharts包
  2. mongodb 笔记
  3. python基础--集合
  4. Mybatis笔记 - SQL标签方法
  5. 51nod 1640 天气晴朗的魔法
  6. Python核心编程--学习笔记--8--条件与循环
  7. java B2B2C Springboot仿淘宝电子商城系统-spring cloud 跨域访问
  8. Spring Security——基于表单登录认证原理及实现
  9. SCCM部署前的IIS、WSUS等准备
  10. 聊聊spring for kafka对consumer的封装与集成 1