[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不断地收集新的贝壳,因此, 他的 ...
随机推荐
- Python下载与安装
Python目前已支持所有主流操作系统,在Linux,Unix,Mac系统上自带Python环境,一般默认装的是Python2版本,Windows系统上没有Pyhton环境,需要我们手动安装一下,过程 ...
- Promethus安装指南
由于Prometheus是go语言写的,所以不需要编译,安装的过程非常简单,仅需要解压然后运行.Prometheus官方下载地址:https://prometheus.io/download/ 安装P ...
- cdoj914-方老师分身 I 【dijkstra】
http://acm.uestc.edu.cn/#/problem/show/914 方老师分身 I Time Limit: 3000/1000MS (Java/Others) Memory ...
- sql优化 原因
不使用子查询例: SELECT * FROM t1 WHERE id (SELECT id FROM t2 WHERE name='hechunyang'); 子查询在MySQL5.5版本里,内部执行 ...
- 数字图像处理实验(总计23个)汇总 标签: 图像处理MATLAB 2017-05-31 10:30 175人阅读 评论(0)
以下这些实验中的代码全部是我自己编写调试通过的,到此,最后进行一下汇总. 数字图像处理实验(1):PROJECT 02-01, Image Printing Program Based on Half ...
- Ext.data.association.hasMany一对多模型使用示例
来自<sencha touch权威指南>第11章,323页开始 --------------------------------------------------- index.html ...
- 虚拟机上linux与windows之间复制粘贴
参考:https://blog.csdn.net/qq_34501940/article/details/51222119
- Asp.net相关知识和经验的碎片化记录
1.解决IIS7.0下“HTTP 错误 404.15 - Not Found 请求筛选模块被配置为拒绝包含的查询字符串过长的请求”问题 方案1:在程序的web.config中system.web节点里 ...
- Web测试实践--Rec 4
累计完成任务情况: 阶段内容 参与人 整理小组工作记录,维护小组博客 小尹 分析产品并撰写文档相关板块 小靳 撰写文档中对被测系统进行功能性分析相关板块 小龙.小黄 撰写文档中用户调研相关板块 小熊 ...
- springMvc 核心配置
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...