题目链接:戳我

题意:求区间中不同颜色的种类数

因为是要过知识点,所以又把这题拿出来做了一遍。。。。。。这里就写两种方法吧

主席树做法

设pre[i]为第i个点上的颜色在前面序列中出现的最晚的一次的位置+1,那么就可以将问一个区间内有多少种颜色转化为——问一个区间内上有多少个点的pre在当前区间左端点之前。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 50010
using namespace std;
int n,m,cnt;
int a[MAXN<<5],pre[MAXN<<5],last[MAXN<<5],rt[MAXN<<5];
struct Node{int ls,rs,v;}t[MAXN<<5];
inline void modify(int &x,int f,int l,int r,int pos,int k)
{
x=++cnt;
t[x]=t[f];t[x].v+=k;
if(l==r) return;
int mid=(l+r)>>1;
if(pos<=mid) modify(t[x].ls,t[f].ls,l,mid,pos,k);
else modify(t[x].rs,t[f].rs,mid+1,r,pos,k);
}
inline int query(int x,int f,int l,int r,int ll,int rr)
{
if(ll<=l&&r<=rr) return t[x].v-t[f].v;
int mid=(l+r)>>1;
int cur_ans=0;
if(ll<=mid) cur_ans+=query(t[x].ls,t[f].ls,l,mid,ll,rr);
if(mid<rr) cur_ans+=query(t[x].rs,t[f].rs,mid+1,r,ll,rr);
return cur_ans;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
freopen("ce.out","w",stdout);
#endif
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
pre[i]=last[a[i]]+1;
last[a[i]]=i;
modify(rt[i],rt[i-1],1,n,pre[i],1);
}
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
printf("%d\n",query(rt[v],rt[u-1],1,n,1,u));
}
}

莫队做法

莫队有些奇奇怪怪的块的大小,但是我不是特别会,所以就记成一般的根号的大小吧。

然后排序的时候以所在块的编号为第一关键字,右端点为第二关键字。

写的时候注意一下i++和++i的区别就可以了qwq

代码如下:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAXN 1000100
struct query{int l,r,t,id;}q[MAXN];
int color[MAXN],A[MAXN],Ans,c[MAXN],n,m;
bool operator <(query a,query b)
{
if(a.t==b.t)return a.r<b.r;
return a.t<b.t;
}
inline void Change(int pos,int k)
{
color[c[pos]]+=k;
if(color[c[pos]]==0&&k==-1)--Ans;
if(color[c[pos]]==1&&k==+1)++Ans;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
scanf("%d",&n);
int Len=sqrt(n);
for(int i=1;i<=n;++i)scanf("%d",&c[i]);
scanf("%d",&m);
for(int i=1;i<=m;++i)
scanf("%d%d",&q[i].l,&q[i].r),q[i].t=(q[i].l-1)/Len+1,q[i].id=i;
sort(&q[1],&q[m+1]);
int l=1,r=0;
for(int i=1;i<=m;++i)
{
while(l<q[i].l)Change(l,-1),l++;
while(l>q[i].l)Change(l-1,1),l--;
while(r<q[i].r)Change(r+1,1),r++;
while(r>q[i].r)Change(r,-1),r--;
A[q[i].id]=Ans;
}
for(int i=1;i<=m;++i)printf("%d\n",A[i]);
return 0;
}

BZOJ上如上代码 主席树2276ms,莫队1724ms qwqwq

[SDOI2009] HH的项链 | 莫队模板的更多相关文章

  1. Bzoj 1878: [SDOI2009]HH的项链 莫队

    1878: [SDOI2009]HH的项链 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2717  Solved: 1363[Submit][Statu ...

  2. [SDOI2009][bzoj1878] HH的项链 [莫队模板题]

    题面: 传送门 思路: 就是一道莫队的模板题目...... 开一个1000000的数组记录每个数出现的次数,然后每次从1到0或者从0到1更新答案 莫队讲解看这里:莫队 Code: #include&l ...

  3. BZOJ1878[SDOI2009]HH的项链+莫队算法模板

    题意:多次询问,求在一个区间中,有多少种珠子: 思路:莫队算法模板题目: 参考:https://www.cnblogs.com/RabbitHu/p/MoDuiTutorial.html #inclu ...

  4. BZOJ1878 [SDOI2009] HH的项链 [莫队,卡常]

    BZOJ传送门,洛谷传送门 HH的项链 Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义. ...

  5. [BZOJ1878][SDOI2009]HH的项链 莫队

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1878 不带修改的莫队,用一个桶记录一下当前区间中每种颜色的数量就可以做到$O(1)$更新了 ...

  6. P1972 [SDOI2009]HH的项链 莫队or树状数组

    用什么树状数组莫队多帅 思路:树状数组\(or\)莫队(其实还是推荐树状数组\(QwQ\)) 提交:我告诉你我卡了一会儿常 卡不满原因:没有用奇偶性排序 题解: 莫队: 就是裸的莫队,把询问排序\(e ...

  7. [bzoj1878][SDOI2009][HH的项链] (莫队算法)

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

  8. 【SDOI2009】 HH的项链 - 莫队

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

  9. 【SDOI2009】HH的项链 (莫队)

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

随机推荐

  1. 什么是web资源????

    所谓 web 资源即放在 Internet 网上供外界访问的文件或程序,又根据它们呈现的效果及原理不同,将它们划分为静态资源和动态资源. 1. 什么是静态资源 静态资源是浏览器能够直接打开的,一个 j ...

  2. PHP中使用CURL模拟文件上传实例

    调用实例: 该方法将本地的E盘文件test.doc上传到接口服务器上的 uploadFile方法中,uploadFile会对上传的文件做进一步处理. 若你想自己对上传的文件做操作,将接口uploadF ...

  3. axis2 webService开发指南(3)

    复杂对象类型的WebService 这次我们编写复杂点的WebService方法,返回的数据是我们定义属性带getter.setter方法JavaBean,一维数组.二维数组等 1.服务源代码 新建一 ...

  4. Linux常用命令----基本文件系统常用命令

    1.查看当前工作目录---pwd sunny@sunny-ThinkPad-T450:~$ pwd /home/sunny sunny@sunny-ThinkPad-T450:~$ cd Worksp ...

  5. go_指针

    值传递:相当于在内存中拷贝一分变量出来,拷贝变量的改变对原变量不影响 引用传递:直接引用内存中的变量,会被改变 c,c++值传递和引用传递都有 Java,python多用引用传递 go语言指针简单之处 ...

  6. Ant学习--简单实例入门

    步骤1.创建工程文件夹名字 F:\Helloworld 步骤2.编写java代码: package com.netease; public class Ant_test { public static ...

  7. ubuntu 14.04 Clion2016.2 安装激活与安装后添加快捷启动方式

    参考链接:http://www.cnblogs.com/conw/p/5938113.html 下载clion for linux : http://www.jetbrains.com/clion/d ...

  8. Web测试实践--Rec 3

    累计完成任务情况: 阶段内容 参与人 根据功能性分析得出结论 小梁 对被测系统进行功能性分析 小龙.小黄 进行用户调研 小熊 开会学习作业要求,取得共识 全体 注: 1."阶段内容" ...

  9. Ubuntu14.04 下安装Vmware-Tools

    1.切换到ubuntu 图形界面 startx , 点击虚拟机菜单栏-安装VMware Tools 2. 在Ubuntu系统中找到VMwareTools-9.2.2-893683.tar.gz ,右键 ...

  10. C#通过Redis实现分布式锁

    Redis有三个最基本属性来保证分布式锁的有效实现: 安全性: 互斥,在任何时候,只有一个客户端能持有锁. 活跃性A:没有死锁,即使客户端在持有锁的时候崩溃,最后也会有其他客户端能获得锁,超时机制. ...