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份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是 ...
随机推荐
- IOS+H5页面自定义按钮无效
在IOS整合H5页面的时候,自定义的按钮失去效果,Android系统可以. 如图,确定和取消按钮在IOS系统无效. 解决办法是在两个按钮上加上一个style属性即可 <span class=&q ...
- 分布式服务追踪与调用链 Zikpin
分布式服务追踪与调用链系统产生的背景 在为服务中,如果服务与服务之间的依赖关系非常复杂,如果某个服务出现了一些问题,很难追查到原因,特别是服务与服务之间调用的时候. 在微服务系统中,随着业务的发展,系 ...
- android 自动化测试案例之 MonkeyScript
#文件名 MonkeyScript.mks #功能: 使用monkey script测试app,此案例是测试搜索功能(输入关键字,然后点击搜索按钮)#参考: http://blog.csdn.net/ ...
- LeetCode 1103. Distribute Candies to People
1103. Distribute Candies to People(分糖果||) 链接:https://leetcode-cn.com/problems/distribute-candies-to- ...
- SIP协议参数详解
1.1 SIP消息分类 SIP协议是以层协议的形式组成的,就是说它的行为是以一套相对独立的处理阶段来描述的,每个阶段之间的关系不是很密切. SIP协议将Server和User Agent之间的通讯的 ...
- stm32位带
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bit ...
- Ubuntu-Python2.7安装 scipy,numpy,matplotlib (转)
sudo apt-get install python-scipy sudo apt-get install python-numpy sudo apt-get install python-matp ...
- 你不知道的javascript(上卷)读后感(二)
this词法 熟悉ES6语法的开发者,箭头函数在涉及this绑定时的行为和普通函数的行为完全不一致.跟普通this绑定规则不一样,它使用了当前的词法作用域覆盖了this本来的值. 误解 this理解成 ...
- 【Distributed】分布式锁
一.概述 1.1 分布式解决的核心思路 1.2 分布式锁一般有三种实现方式 二.基于Redis的分布式锁 2.1 使用常用命令 2.2 实现思路 2.3 核心代码 Maven依赖信息 LockRedi ...
- 【Distributed】分布式系统中遇到的问题
一.概述  大型互联网公司公司一般都采用服务器集群,这样就要实现多个服务器之间的通讯,在nginx实现负载均衡(分布式解决方案)服务器集群会产生那些问题? 分布式锁(基本)单纯的Lock锁或者syn ...