[SDOI2009] HH的项链 | 莫队模板
题目链接:戳我
题意:求区间中不同颜色的种类数
因为是要过知识点,所以又把这题拿出来做了一遍。。。。。。这里就写两种方法吧
主席树做法
设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的项链 | 莫队模板的更多相关文章
- Bzoj 1878: [SDOI2009]HH的项链 莫队
1878: [SDOI2009]HH的项链 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2717 Solved: 1363[Submit][Statu ...
- [SDOI2009][bzoj1878] HH的项链 [莫队模板题]
题面: 传送门 思路: 就是一道莫队的模板题目...... 开一个1000000的数组记录每个数出现的次数,然后每次从1到0或者从0到1更新答案 莫队讲解看这里:莫队 Code: #include&l ...
- BZOJ1878[SDOI2009]HH的项链+莫队算法模板
题意:多次询问,求在一个区间中,有多少种珠子: 思路:莫队算法模板题目: 参考:https://www.cnblogs.com/RabbitHu/p/MoDuiTutorial.html #inclu ...
- BZOJ1878 [SDOI2009] HH的项链 [莫队,卡常]
BZOJ传送门,洛谷传送门 HH的项链 Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义. ...
- [BZOJ1878][SDOI2009]HH的项链 莫队
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1878 不带修改的莫队,用一个桶记录一下当前区间中每种颜色的数量就可以做到$O(1)$更新了 ...
- P1972 [SDOI2009]HH的项链 莫队or树状数组
用什么树状数组莫队多帅 思路:树状数组\(or\)莫队(其实还是推荐树状数组\(QwQ\)) 提交:我告诉你我卡了一会儿常 卡不满原因:没有用奇偶性排序 题解: 莫队: 就是裸的莫队,把询问排序\(e ...
- [bzoj1878][SDOI2009][HH的项链] (莫队算法)
Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的项链变 ...
- 【SDOI2009】 HH的项链 - 莫队
题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链变得越来越长. ...
- 【SDOI2009】HH的项链 (莫队)
题面 Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的 ...
随机推荐
- UNITY 画布的粗浅理解
画布:当画布是screen-space overlay时,这个好理解,画布可以控制如分辨率,层次等.但当画布是 world-space时,这个严格来说就不算是一个画布了,屏幕空间或相机空间的画布是先绘 ...
- Python_安装官方whl包和tar.gz包
Windows环境: 安装whl包:pip install wheel -> pip install **.whl 安装tar.gz包:cd到解压后路径,python setup. ...
- ss查看状态
ps -ef | grep ss-server | grep -v ps | grep -v grep
- 索引(index)
#创建索引 create index index_name_pass on student(name,pass); create index index_name_id on student(name ...
- js对象的几种创建方式和js实现继承的方式[转]
一.js对象的创建方式 1. 使用Object构造函数来创建一个对象,下面代码创建了一个person对象,并用两种方式打印出了Name的属性值. var person = new Object(); ...
- SQL Server的聚集索引和非聚集索引
微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclustered index,也称非聚类索引.非簇集索引)…… (一) ...
- CloudStack 脚本封装分析
cloud.keystore是这样生成的 String dname = "cn=\"" + cn + "\",ou=\"" + o ...
- css中calc()的使用
calc()是css3中新出现的特性,可以用于动态计算,非常方便. 首先是兼容性 再来看看怎么使用 html{ font-size: 20px; } div{ width: calc(50% - 1p ...
- SliceBox
SliceBox相当于一个轮播图插件,只不过是3D的. 先来查看它能实现的效果: 官网:http://tympanus.net/codrops/2011/09/05/slicebox-3d-image ...
- 4.4.3 Java中的指针:Unsafe类
java多线程编程的无锁CAS底层都是通过 Unsafe进行操作的:源码如下 public final boolean compareAndSet(int expect, int update) { ...