Description

HH有一串由各种漂亮的贝壳组成的项链。HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一
段贝壳,思考它们所表达的含义。HH不断地收集新的贝壳,因此他的项链变得越来越长。有一天,他突然提出了一
个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答。。。因为项链实在是太长了。于是,他只
好求助睿智的你,来解决这个问题。

Input

第一行:一个整数N,表示项链的长度。 
第二行:N个整数,表示依次表示项链中贝壳的编号(编号为0到1000000之间的整数)。 
第三行:一个整数M,表示HH询问的个数。 
接下来M行:每行两个整数,L和R(1 ≤ L ≤ R ≤ N),表示询问的区间。
N ≤ 50000,M ≤ 200000。

Output

M行,每行一个整数,依次表示询问对应的答案。

Sample Input

6
1 2 3 4 3 5
3
1 2
3 5
2 6

Sample Output

2
2
4

第一个线段树第二个莫队

线段树:
啊这个题的IDEA炒鸡妙啊……让我情不自禁想写一发题解
(其实是我怕这次抄题解会了后下次就不会了……)
我们先将询问按照结束点升序排序
用now保存当前询问的是第几个
线段树保存的是当前下标是否有珠子(0/1表示)
然后从1~n依次访问项链。
当前访问中,我们要做的有两件事:
第一件:将当前点的珠子修改成1
第二件:将上一个和当前珠子编号相同的珠子设为0
          (因为我们要保证当前序列里不能有重复编号的珠子
            而当前珠子以后的访问都不需要上一个重复编号的珠子了
            因为我们完全可以用当前珠子来统计区间[L,R]之间的个数
            如何统计呢?求个和就好了啊……)
将当前珠子的修改做好后,就要查询了。如果当前询问(now)的右端点和当前珠子是一样的
就查询[L,R]的和就好了,这个和就代表着区间内不同种的数量
毕竟我们已经把重复的珠子都去重了……

 #include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std; struct node
{
int x,y,num,ans;
}ask[];
struct node1
{
int val;
}Segt[];
bool cmp(node a,node b)
{
return a.y<b.y;
}
bool cmp1(node a,node b)
{
return a.num<b.num;
} int last[],a[];
int Query(int node,int l,int r,int l1,int r1)
{
if (l>r1 || r<l1)
return ;
if (l1<=l && r<=r1)
return Segt[node].val;
int mid=(l+r)/;
return Query(node*,l,mid,l1,r1)+
Query(node*+,mid+,r,l1,r1);
} void Update(int node,int l,int r,int x,int k)
{
if (l==r)
Segt[node].val=k;
else
{
int mid=(l+r)/;
if (x<=mid) Update(node*,l,mid,x,k);
else Update(node*+,mid+,r,x,k);
Segt[node].val=Segt[node*].val+Segt[node*+].val;
}
} int main()
{
int n,m;
scanf("%d",&n);
for (int i=;i<=n;++i)
scanf("%d",&a[i]);
scanf("%d",&m);
for (int i=;i<=m;++i)
{
scanf("%d%d",&ask[i].x,&ask[i].y);
ask[i].num=i;
}
sort(ask+,ask+m+,cmp);
int now=;
for (int i=;i<=n;++i)
{
Update(,,n,i,);
if (last[a[i]]!=)
Update(,,n,last[a[i]],);
last[a[i]]=i;
while (ask[now].y==i)
{
ask[now].ans=Query(,,n,ask[now].x,ask[now].y);
++now;
}
}
sort(ask+,ask+m+,cmp1);
for (int i=;i<=m-;++i)
printf("%d\n",ask[i].ans);
printf("%d",ask[m].ans);
}

莫队:

入门题

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define MAXN (1000000+10)
using namespace std;
struct node
{
int l,r,ord,id,ans;
}Ask[MAXN];
int l=,r=,now,n,m;
int cnt[MAXN],a[MAXN];
bool cmp1(node a,node b){return a.id==b.id?a.r<b.r:a.id<b.id;}
bool cmp2(node a,node b){return a.ord<b.ord;} void Del(int x)
{
cnt[a[x]]--;
if (!cnt[a[x]]) now--;
}
void Ins(int x)
{
if (!cnt[a[x]]) now++;
cnt[a[x]]++;
}
void MO(int x)
{
int L=Ask[x].l,R=Ask[x].r;
while (l>L) Ins(--l);
while (l<L) Del(l++);
while (r>R) Del(r--);
while (r<R) Ins(++r);
Ask[x].ans=now;
} int main()
{
scanf("%d",&n);
int len=sqrt(n);
for (int i=;i<=n;++i)
scanf("%d",&a[i]);
scanf("%d",&m);
for (int i=;i<=m;++i)
{
scanf("%d%d",&Ask[i].l,&Ask[i].r);
Ask[i].id=Ask[i].l/len;
Ask[i].ord=i;
}
sort(Ask+,Ask+m+,cmp1);
for (int i=;i<=m;++i)
MO(i);
sort(Ask+,Ask+m+,cmp2);
for (int i=;i<=m;++i)
printf("%d\n",Ask[i].ans);
}

1878. [SDOI2009]HH的项链【线段树 或 莫队】的更多相关文章

  1. BZOJ 1878: [SDOI2009]HH的项链 离线树状数组

    1878: [SDOI2009]HH的项链 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  2. 【BZOJ】1878: [SDOI2009]HH的项链(树状数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1878 我太弱了,看题解才过的. 一开始看到此题,我想了想在线做法,但之后觉得这个想法可能是错的:维护 ...

  3. bzoj 1878: [SDOI2009]HH的项链【树状数组】

    对于一个lr,每个颜色贡献的是在(1,r)区间里出现的最右位置,所以记录一个b数组表示当前点这个颜色上一个出现的位置 然后把询问离线,按r升序排序 每次把右端点右移,把这个点在树状数组上+1,并且在当 ...

  4. 1878: [SDOI2009]HH的项链

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

  5. BZOJ 1878: [SDOI2009]HH的项链

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

  6. BZOJ 1878: [SDOI2009]HH的项链( BIT )

    离线处理 , 记下询问的左右端点并排序 , 然后可以利用树状数组 , 保证查询区间时每种颜色只计算一次 ------------------------------------------------ ...

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

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

  8. BZOJ 1878 [SDOI2009]HH的项链 【莫队】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=1878 1878: [SDOI2009]HH的项链 Time Limit: 4 Sec  M ...

  9. 【SDOI2009】HH的项链 线段树

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

随机推荐

  1. WeifenLuo.WinFormsUI.Docking.dll的用法

    基本框架 说明 weiFenLuo.winFormsUI.Docking.dll是开源项目DockPanel Suite的一个类库,可以实现像Visual Studio的窗口停靠.拖拽等功能.Weif ...

  2. SQL SERVER学习1——数据库概念

    <SQL Server实例教程>(科学出版社) 数据库的基本概念 数据是载荷信息的物理符号,是数据库中存储的基本对象. 信息可以通过手势,眼神表达,但是表达信息的最佳方式还是数据. 数据有 ...

  3. 腾讯云安全组,实现服务器外网ip访问网站

    添加访问地ip出入站规则HTTP,并将云主机添加到安全组中.

  4. js画一棵树

    用纯js画一棵树.思路: 1.一棵树的图片,作为页面背景: 2.通过html5中的canvas画布进行遮罩: 3.定时每隔10ms,从下往上清除1px的遮罩: <!DOCTYPE html> ...

  5. axios中的qs

    qs是一个npm仓库所管理的包,可通过npm install qs命令进行安装. 1. qs.parse()将URL解析成对象的形式 const Qs = require('qs'); let url ...

  6. com.alibaba.fastjson.JSONObject循环给同一对象赋值会出现"$ref":"$[0]"现象问题

    1.今天定义了一个JSONObject对象,引用的com.alibaba.fastjson.JSONObject,循环给这个对象赋值出现"$ref":"$[0]" ...

  7. Python3.7安装Geenlet

    1.首先再python文件下的Scripts文件夹下有这几个文件: 2.打开Scripts文件夹下可能你会发现是空的,这时候就要先安装setuptools了,安装完后Script文件下就出现上图的文件 ...

  8. CSS Align bottom

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  9. 04.CSS选择器-->相邻、通用兄弟选择器

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Linux 新手入门常用命令

    1,增加用户:useradd mylinux passwd mylinux 添加你的用户密码 2,切换用户: su otheruser   (注意这种切换方式只是临时的,本质工作目录还在原来的用户目录 ...