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 不断地收集新的贝壳,因此,他的项链变得越来越长. ...
随机推荐
- Mac下PHP+Apache+MySQL环境搭建
一.启动Apache 有两种方法 1.打开网络共享 打开"系统偏好设置"->"共享",在"互联网共享"那一项前面打√. 2.打开终端, ...
- 二、多线程之Atomic包
一.简介 1.原子操作 我们在使用变量的时候,经常会出现资源竞争的情况,为了保证变量安全,我们就会对对应的方法添加"synchronized"同步锁来达到目的,以保证线程安全. 而 ...
- HDOJ2037 今年暑假不AC (经典的贪心问题)
Description “今年暑假不AC?” “是的.” “那你干什么呢?” “看世界杯呀,笨蛋!” “@#$%^&*%...” 确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会 ...
- K:求取两个数的最大公约数的两个算法
相关介绍: 最大公因数,也称最大公约数.最大公因子,指两个或多个整数共有约数中最大的一个.a,b的最大公约数记为gcd(a,b).同样的,a,b,c的最大公约数记为gcd(a,b,c),多个整数的最 ...
- Java 基础:数组
一.数组声明: int[] x; int x[]; 在Java中一般使用前者,机把int[]看做一个类型,C++中只能后者 二.数组初始化: 直接提供值: int[] x = {1, 3, 4}; i ...
- OpenStack IceHouse 部署 - 3 - 控制节点部署
Mysql部署配置 安装 安装mysql,mysql的python绑定 apt-get install mysql-server 安装过程中会要求设定mysql的root账户的密码,这里假定设为my ...
- 创业公司感悟录之十个提醒—by李天平
这几年经历过很多事,和朋友创业过, 自己也在创业(动软卓越),看过太多创业的人.创业的事,时不时静下心来把所看所感所想总结一下,记录一下,不足为鉴,仅作为自己在路上的警示与提醒,并和广大准备创业和创业 ...
- laravel开发之-安装laravel-admin
1.输入命令:composer require encore/laravel-admin "1.4.*" 2.在config/app.php中添加 :Encore\Admin\Pr ...
- Node.js 优雅地自动审核团队的代码
Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. 简介 在团队开发中,无论是写前端(js,css,htm ...
- Volley1--为什么说Volley适合数据量小,通信频繁的网络操作
前言 网络编程对于客户端来说是一块及其重要的地方,使用高效的网络请求框架将为你的系统产生很大的影响.而Volley作为谷歌的一个开源项目,炙手可热.有很多中小型公司的安卓移动客户端的网络程序都是基于v ...