1878. [SDOI2009]HH的项链【线段树 或 莫队】
Description
Input
Output
M行,每行一个整数,依次表示询问对应的答案。
Sample Input
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的项链【线段树 或 莫队】的更多相关文章
- BZOJ 1878: [SDOI2009]HH的项链 离线树状数组
1878: [SDOI2009]HH的项链 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- 【BZOJ】1878: [SDOI2009]HH的项链(树状数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=1878 我太弱了,看题解才过的. 一开始看到此题,我想了想在线做法,但之后觉得这个想法可能是错的:维护 ...
- bzoj 1878: [SDOI2009]HH的项链【树状数组】
对于一个lr,每个颜色贡献的是在(1,r)区间里出现的最右位置,所以记录一个b数组表示当前点这个颜色上一个出现的位置 然后把询问离线,按r升序排序 每次把右端点右移,把这个点在树状数组上+1,并且在当 ...
- 1878: [SDOI2009]HH的项链
1878: [SDOI2009]HH的项链 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 4420 Solved: 2199[Submit][Statu ...
- BZOJ 1878: [SDOI2009]HH的项链
1878: [SDOI2009]HH的项链 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 3548 Solved: 1757[Submit][Statu ...
- BZOJ 1878: [SDOI2009]HH的项链( BIT )
离线处理 , 记下询问的左右端点并排序 , 然后可以利用树状数组 , 保证查询区间时每种颜色只计算一次 ------------------------------------------------ ...
- Bzoj 1878: [SDOI2009]HH的项链 莫队
1878: [SDOI2009]HH的项链 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2717 Solved: 1363[Submit][Statu ...
- BZOJ 1878 [SDOI2009]HH的项链 【莫队】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=1878 1878: [SDOI2009]HH的项链 Time Limit: 4 Sec M ...
- 【SDOI2009】HH的项链 线段树
题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链变得越来越长. ...
随机推荐
- SQL Serever学习9——基础查询语句
SQL语言概述 SQL是结构化查询语言(Structure Query Language),1974年提出,1979年被IBM实现,SQL语言已经成为关系型数据库的标准语言. 包括: DDL数据定义语 ...
- VS中特殊的注释——TODO/UNDONE/HACK的使用
在代码的后面添加形如下面注释: //TODO: (未实现)…… //UNDONE:(没有做完)…… //HACK:(修改)…… 等到再次打开VS的时候,找到 :视图>任务列表 即可显示所有带有T ...
- 经典SQL分页语句
select top pageSize, * from (SELECT row_number() over(order by id desc) as rownumber,*FROM tb1) A wh ...
- mybatis必知必会二
关联: 嵌套查询:通过执行另外一个 SQL 映射语句来返回预期的复杂类型. 嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集.首先,然让我们来查看这个元素的属性.所有的你都会看到,它和普通的只由 ...
- windows emacs 中拷贝文件
cp d:/workspace/LoginWeb/target/LoginWeb.war D:/Program\ Files/apache-tomcat-7.0.78/webapps/LoginWeb ...
- 【C++并发实战】(一)并发基本概念
什么是并发 并发,最简单的理解就是,两个或者以上的活动同时进行.举个比较实际的例子,你可以手脚并用,两只手做不同的动作等等. 在计算机中的“并发”,是指一个系统可以同时执行多个独立的活动.在以前大多数 ...
- 使用WampServer搭建本地PHP环境,绑定域名,配置伪静态
倡萌之前介绍过 USBWebserver 快速搭建本地PHP环境 ,推荐USBWebserver的原因在于它是绿色的,不需要安装,想使用就手动运行下即可.但是 USBWebserver 也有自身的弱点 ...
- 20条最最常用的Linux命令讲解
玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的命令就可以了.当然你也可以在使用时去找一下 ...
- Non-resolvable parent POM for com.*******
场景: 同事新打了一个jar包到私服里面,自己删除了本地对应的中央仓库的依赖包,再次重新下载. 于是我又打开了一个idea的窗口重新引入这个项目,然后重新下载依赖的服务. 结果就一直报这个问题... ...
- 毕向东_Java基础视频教程第19天_IO流(20~22)
第19天-20-IO流(改变标准输入输出设备) static void setIn(InputStream in) Reassigns the "standard" input s ...