博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 1878 SDOI2009 HH的项链 树状数组/莫队算法
阅读量:6188 次
发布时间:2019-06-21

本文共 1055 字,大约阅读时间需要 3 分钟。

题目大意:给定一个序列。求一个区间内有多少个不同的数

正解是树状数组 将全部区间依照左端点排序 然后每次仅仅统计左端点開始的每种颜色的第一个数即可了 用树状数组维护

我写的是莫队算法 莫队明显能搞 m√m明显慢了点可是还是能接受的一个复杂度

一開始离散化数组开小了各种秒RE…… 跪了

#include
#include
#include
#include
#include
#define M 50500using namespace std;struct abcd{ int l,r,pos; bool operator < (const abcd &x) const;}q[200200];int n,m,block,l=1,r=0,now,a[M],map[1001001],tot;int cnt[M],ans[200200];bool abcd :: operator < (const abcd &x) const{ if( (l-1)/block == (x.l-1)/block ) return r < x.r ; return (l-1)/block < (x.l-1)/block ;}inline void Update(int x){ cnt[x]++; if(cnt[x]==1) ++now;}inline void Downdate(int x){ cnt[x]--; if( !cnt[x] ) --now;}int main(){ int i,x; cin>>n; for(i=1;i<=n;i++) { scanf("%d",&x); if(!map[x]) map[x]=++tot; a[i]=map[x]; } cin>>m; for(i=1;i<=m;i++) scanf("%d%d",&q[i].l,&q[i].r),q[i].pos=i; block=static_cast
(sqrt(n)+1e-7); sort(q+1,q+m+1); for(i=1;i<=m;i++) { while(r
q[i].l) Update(a[--l]); while(r>q[i].r) Downdate(a[r--]); while(l

转载地址:http://vsoda.baihongyu.com/

你可能感兴趣的文章
ubuntu 安装NVIDIA驱动过程
查看>>
C# WPF 低仿网易云音乐(PC)歌词控件
查看>>
MongoDB学习笔记(11) --- 聚合
查看>>
asp.net—WebApi跨域
查看>>
centos7安装docker
查看>>
在dotnet core下去中心化访问HTTP服务集群
查看>>
eclipse中项目jdk1.8刷新下就变成1.5的解决办法
查看>>
.NET Core微服务之路:基于Consul最少集群实现服务的注册与发现(二)
查看>>
SpringBoot系列: SpringBoot Web项目中使用Shiro 之二
查看>>
Ngnix常用的操作
查看>>
一个小学生看了《金刚》后写的作文
查看>>
Save icons from shell32.dll 的Delphi源码
查看>>
Java Socket例程3 UDP
查看>>
DevExpress VCL Skin 如何去除 Windows 标题栏皮肤
查看>>
TP复习14
查看>>
PowerShell入门(九):访问.Net程序集、COM和WMI
查看>>
Handler的另外一种用法(HandlerThread)
查看>>
关于appdomain, assembly, 进程,线程的概念体会
查看>>
js open() 与showModalDialog()方法
查看>>
ORACLE客户端乱码
查看>>