P1972 [SDOI2009]HH的项链 莫队or树状数组
用什么树状数组莫队多帅
思路:树状数组\(or\)莫队(其实还是推荐树状数组\(QwQ\))
提交:我告诉你我卡了一会儿常
卡不满原因:没有用奇偶性排序
题解:
莫队:
就是裸的莫队,把询问排序\(etc.\)
// luogu-judger-enable-o2
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#define R register int
using namespace std;
namespace Fread {
static char B[1<<15],*S=B,*D=B;
#define getchar() (S==D&&(D=(S=B)+fread(B,1,1<<15,stdin),S==D)?EOF:*S++)
inline int g() {
R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
}
}using Fread::g;
int T;
struct seg{
int l,r,rk;
bool operator <(const seg& a)const{return (l/T)==(a.l/T)?r>a.r:l<a.l;}
}s[1000010];
int n,m,l=0,r=0,ans;
int a[500010],cnt[1000010],anss[500010],pos[500010];
bool cmp(const seg& a,const seg& b){
return pos[a.l]^pos[b.l]?pos[a.l]<pos[b.l]:pos[a.l]&1?a.r<b.r:a.r>b.r;
}
inline void change(int pos,int inc) {(inc>0)?ans+=(++cnt[a[pos]]==1):ans-=(--cnt[a[pos]]==0);}
signed main() {
n=g(); T=sqrt(n);
for(R i=1;i<=n;++i) a[i]=g();
m=g(); for(R i=1;i<=m;++i) s[i].l=g(),s[i].r=g(),s[i].rk=i;
for(R i=1;i<=n;++i) pos[i]=(i-1)/T+1;
sort(s+1,s+m+1,cmp);
for(R i=1;i<=m;++i) {
while(r<s[i].r) change(++r,1);
while(r>s[i].r) change(r--,-1);
while(l<s[i].l) change(l++,-1);
while(l>s[i].l) change(--l,1);
anss[s[i].rk]=ans;
} for(R i=1;i<=m;++i) printf("%d\n",anss[i]);
}
树状数组:(推荐)
不用卡常先把询问按右端点排序,然后按照排好序的询问向树状数组里添加颜色,把每一种颜色最后出现的位置标记成\(1\)。因为排完序后右端点是递增的,所以我们可以只维护每一种颜色最后出现的位置,询问时查一下区间有多少个\(1\)。
我们维护一个数组叫\(pos[color]\),记录\(color\)上一次出现的位置。当我们向右扫时,设遇到的颜色\(a[now]=color\),当\(pos[color]!=0\)时,我们把\(pos[color]\)改成\(0\),并把\(now\)修改成\(1\),并令\(pos[color]=now\),即可维护信息。
#include<cstdio>
#include<iostream>
#include<algorithm>
#define R register int
using namespace std;
inline int g() {
R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
}
struct seg{
int l,r,rk;
#define l(i) s[i].l
#define r(i) s[i].r
#define rk(i) s[i].rk
bool operator <(const seg& a)const{return r==a.r?l<a.l:r<a.r;}
}s[500010];
int n,m,lst=1;
int a[500010],ans[500010],c[1000010],pos[1000010];
inline int lbt(int x) {return x&(-x);}
inline void add(int pos,int inc) {for(;pos<=n;pos+=lbt(pos)) c[pos]+=inc;}
inline int query(int pos) { R ret=0;
for(;pos;pos-=lbt(pos)) ret+=c[pos];
return ret;
}
signed main() {
n=g(); for(R i=1;i<=n;++i) a[i]=g();
m=g(); for(R i=1;i<=m;++i) l(i)=g(),r(i)=g(),rk(i)=i;
sort(s+1,s+m+1);
for(R i=1;i<=m;++i) {
for(R j=lst;j<=r(i);++j) {
if(pos[a[j]]) add(pos[a[j]],-1);
add(j,1); pos[a[j]]=j;
} lst=r(i)+1;
ans[rk(i)]=query(r(i))-query(l(i)-1);
}
for(R i=1;i<=m;++i) printf("%d\n",ans[i]);
}
2019.07.22
P1972 [SDOI2009]HH的项链 莫队or树状数组的更多相关文章
- 洛谷 P1972 [SDOI2009]HH的项链-二维偏序+树状数组+读入挂(离线处理,思维,直接1~n一边插入一边查询),hahahahahahaha~
P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...
- 【bzoj3289】Mato的文件管理 离散化+莫队算法+树状数组
原文地址:http://www.cnblogs.com/GXZlegend/p/6805224.html 题目描述 Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份 ...
- HDU6534 Chika and Friendly Pairs(莫队,树状数组)
HDU6534 Chika and Friendly Pairs 莫队,树状数组的简单题 #include<bits/stdc++.h> using namespace std; cons ...
- Bzoj 1878: [SDOI2009]HH的项链 莫队
1878: [SDOI2009]HH的项链 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2717 Solved: 1363[Submit][Statu ...
- BZOJ1878 [SDOI2009] HH的项链 [莫队,卡常]
BZOJ传送门,洛谷传送门 HH的项链 Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义. ...
- BZOJ 3289: Mato的文件管理[莫队算法 树状数组]
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 2399 Solved: 988[Submit][Status][Di ...
- BZOJ3289 Mato的文件管理(莫队算法+树状数组)
题目是区间逆序数查询. 莫队算法..左或右区间向左或右延伸时加或减这个区间小于或大于新数的数的个数,这个个数用树状数组来统计,我用线段树超时了.询问个数和数字个数都记为n,数字范围不确定所以离散化,这 ...
- HDU 6278 - Just h-index - [莫队算法+树状数组+二分][2018JSCPC江苏省赛C题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6278 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...
- 【BZOJ3289】Mato的文件管理 莫队算法+树状数组
[BZOJ3289]Mato的文件管理 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是 ...
随机推荐
- WUSTOJ 1246: 字符串排序(Java)
1246: 字符串排序 题目 输入n(n<100)个字符串,每个字符串长度不超过1000,将他们按字典顺序输出.更过内容点击标题. 分析 Java中的ArrayList()可以比较方便的 ...
- Django入门(上)
一.Web应用程序 1.web应用程序介绍 Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件. 应用程序有两种模式 ...
- 深度剖析Kubernetes API Server三部曲 - part 3
在本系列的前两部分中我们介绍了API Server的总体流程,以及API对象如何存储到etcd中.在本文中我们将探讨如何扩展API资源. 在一开始的时候,扩展API资源的唯一方法是扩展相关API源代码 ...
- 在一台服务器上启动多个Broker
1:把整个conf文件夹复制一份,比如叫做conf22:修改里面的activemq.xml文件(1)里面的brokerName 不能跟原来的重复(2)数据存放的文件名称不能重复,比如:<kaha ...
- Lieges of Legendre CodeForces - 603C (博弈论,SG找规律)
大意: 给定$n$堆石子, 两人轮流操作, 每次操作两种选择 $(1)$任选非空堆拿走一个石子 $(2)$任选石子数为$2x(x>0)$的一堆, 替换为$k$堆$x$个石子. ($k$给定) 最 ...
- 解决GitHub下载慢问题,不用修改HOSTS文件
写这篇文章缘由是我用的一款Github上的软件软件版本更新,想去Github上下载新的版本,结果下载速度居然只有几k,还老是下载失败,然后去修改HOSTS文件(我看文章基本都是叫修改这个),修改完成后 ...
- 清空windows系统网络配置
清空windows系统网络配置 来源 https://www.cnblogs.com/lemon-rain/p/9569990.html 具体描述:qq,微信可用网,但其他不能用. 一.win+r ...
- tasklist、taskkill命令使用
tasklist.taskkill命令使用 在Windows XP中新增了两个命令行工具“tasklist.taskkill”.通过“Ctrl+Alt+Del”组合键,打开“任务管理器”就可以查看到本 ...
- element-ui重置表单并清除校验的方法
this.$refs['activityForm'].resetFields(); 只会重置之前表单的内容,并不会清空 只需在关闭弹框的cancel方法中写上重置表单的方法即可 cancel() { ...
- 注解Annotation原理详解及其应用示例
一.什么是注解 注解也叫元数据,例如我们常见的@Override和@Deprecated,注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包.类.接口.字段.方法参数.局部变量等进 ...