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 不断地收集新的贝壳,因此,他的项链变得越来越长. ...
随机推荐
- .NET中的集合-ArrayList2
数组特点:类型同统一,长度固定 集合常用操作 添加 遍历 移除 ArrayList可变长度数组,使用类似于数组 属性:capacity(集合中可以容纳元素的个数,翻倍增长)count(集合中实际存放的 ...
- 如鹏网学习笔记(十三)EasyUI
一.EasyUI简介 是一组基于JQuery的UI插件集合 主要作用:为JQuery对象提供新的方法,实现新的功能 可以快速创建出简洁.友好.美观的页面,非常适合做网站后台管理页面(不够漂亮,不适合做 ...
- Spring-在IDEA2016中创建maven管理的SpringMVC项目
这是一套我自己摸索出来的创建项目方法,基本是用在创建用maven管理的 Spring+SpringMVC+Mybatis的J2EE项目时. 创建一个maven管理的webapp项目 在创建项目时,选择 ...
- 用Lua控制Nginx静态文件的url访问权限
需求背景:比如我们有一个存储文件的web服务器,一般通过url可直接访问到:http://127.0.0.1/uploads/test.rar,如果我们需要限制别人的访问,可以通过添加lua脚本来控制 ...
- HDFS学习
HDFS体系结构 HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群包括一个名称节点(NameNode)和若干个数据节点(DataNode)(如图所示).名称节点作为中心服务器, ...
- delphi之读写文件的三种方式
一.Tstrings.Tstringlist procedure TForm1.Button2Click(Sender: TObject); var strlist: TStringList; pat ...
- OpenStack IceHouse 部署 - 4 - 计算节点部署
Nova计算服务(计算节点) 参考 本页内容依照官方安装文档进行,具体参见Configure a compute node(nova service) 前置工作 数据库 由于我们在Nova(计算管理 ...
- Sublime Text3之安裝Emmet及使用技巧
首先准备工作: 如果你的Sublime Text3没有Package Control组件先看一下这里,如果以安装请忽略: 1.按Ctrl+`调出sublime text的console 2.粘贴以下代 ...
- Nodejs + express + ejs
特性 <% %> 用于控制流 <%= %> 用于转义的输出 (会对数据字符进行转义) // 数据源 // app.js var tem={ title:"我是中间部分 ...
- web前端面试题(持续更新)
此文是我本人在面试的时候遇到的问题和一些同学遇到的问题加资料上面的问题的总结.(将会持续更新,因为未有满意工作) 面试时有几点需要注意: 1.面试题目:根据你的等级和职位的变化,入门级到大神级,广度和 ...