bzoj1878: [SDOI2009]HH的项链(主席树/离线+BIT)
这题有离线和在线两种做法。
离线:将查询区间按左端点排序,预处理出所有数下一次的出现位置,一开始将所有第一次出现的数a[i]++,之后当扫到这个数的时候a[next[i]]++,相当于差分,给之后的位置答案+1,因为查询区间左端点排序了,所以再也查不到当前点,这个数对答案有贡献的区间只有右端点在这个数下一次出现的位置右边的区间,当扫到查询区间左端点时当前答案为sum(r)-sum(l-1)。
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#include<map>
#define ll long long
using namespace std;
const int maxn=,inf=1e9;
struct poi{int l,r,pos;}q[maxn];
int n,m,x,y,z,tot,N;
int tree[maxn],a[maxn],b[maxn],ans[maxn],next[maxn],pre[maxn];
bool v[maxn];
inline void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
inline bool cmp(poi a,poi b){return a.l<b.l;}
inline int lowbit(int x){return x&-x;};
inline void add(int x){for(;x<=n;x+=lowbit(x))tree[x]++;}
inline int query(int x){int sum=;for(;x;x-=lowbit(x))sum+=tree[x];return sum;}
int main()
{
read(n);
for(int i=;i<=n;i++)read(a[i]),b[i]=a[i];N=n;
sort(b+,b++N);N=unique(b+,b++N)-b-;
for(int i=;i<=n;i++)a[i]=lower_bound(b+,b++N,a[i])-b;
for(int i=n;i;i--)next[i]=pre[a[i]],pre[a[i]]=i;
for(int i=;i<=n;i++)
if(!v[a[i]])add(i),v[a[i]]=;
read(m);
for(int i=;i<=m;i++)
{
read(q[i].l);read(q[i].r);
q[i].l--;q[i].pos=i;
}
sort(q+,q++m,cmp);
for(int i=,j=;i<=n&&j<=m;i++)
{
if(next[i])add(next[i]);
while(j<=m)
{
if(q[j].l!=i)break;
ans[q[j].pos]=query(q[j].r)-query(q[j].l);
j++;
}
}
for(int i=;i<=m;i++)printf("%d\n",ans[i]);
return ;
}
在线:预处理出所有数上一次出现的位置,把问题转化成查询区间里有多少数last[i]<l,这显然可以用主席树了
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#include<map>
#define ll long long
using namespace std;
const int maxn=,inf=1e9;
struct poi{int sum,lt,rt;}tree[maxn*];
int n,m,l,r,sz,N;
int root[maxn],pre[maxn],last[maxn],a[maxn],b[maxn];
void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
void update(int &x,int l,int r,int cx)
{
tree[++sz]=tree[x];tree[sz].sum++;x=sz;
if(l==r)return;
int mid=(l+r)>>;
if(cx<=mid)update(tree[x].lt,l,mid,cx);
else update(tree[x].rt,mid+,r,cx);
}
int query(int x,int y,int l,int r,int cl,int cr)
{
if(cl<=l&&r<=cr)return tree[y].sum-tree[x].sum;
int mid=(l+r)>>,ret=;
if(cl<=mid)ret+=query(tree[x].lt,tree[y].lt,l,mid,cl,cr);
if(cr>mid)ret+=query(tree[x].rt,tree[y].rt,mid+,r,cl,cr);
return ret;
}
int main()
{
read(n);
for(int i=;i<=n;i++)read(a[i]),b[i]=a[i];N=n;
sort(b+,b++N);N=unique(b+,b++N)-b-;
for(int i=;i<=n;i++)a[i]=lower_bound(b+,b++N,a[i])-b;
for(int i=;i<=n;i++)pre[i]=last[a[i]],last[a[i]]=i;
for(int i=;i<=n;i++)update(root[i]=root[i-],,n,pre[i]);
read(m);
for(int i=;i<=m;i++)
{
read(l);read(r);
printf("%d\n",query(root[l-],root[r],,n,,l-));
}
}
bzoj1878: [SDOI2009]HH的项链(主席树/离线+BIT)的更多相关文章
- [bzoj1878][SDOI2009]HH的项链_树状数组
HH的项链 bzoj-1878 SDOI-2009 题目大意:给定一个n个数的序列,m次查询.查询区间数的种类个数. 注释:$1\le n \le 5\cdot 10^4$,$1\le m\le 2\ ...
- [BZOJ1878][SDOI2009] HH的项链 (树状数组)
link 一道简单题. 不用可持久化. 对于统计颜色个数,可以看与其颜色一样的前一个位置. 设$las(i)$表示其与$i$颜色相等的上一个位置. 则对于二元组$(l,r)$,其答案为$\sum_{i ...
- BZOJ1878 SDOI2009 HH的项链 【莫队】
BZOJ1878 SDOI2009 HH的项链 Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的 ...
- BZOJ1878: [SDOI2009]HH的项链 (离线查询+树状数组)
1878: [SDOI2009]HH的项链 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1878 Description: HH有一串由 ...
- bzoj千题计划181:bzoj1878: [SDOI2009]HH的项链
http://www.lydsy.com/JudgeOnline/problem.php?id=1878 之前用莫队做的,现在用树状数组 把每种数的第一个出现位置在树状数组中+1 nxt[i] 记录i ...
- BZOJ1878: [SDOI2009]HH的项链[树状数组+离线 | 主席树]
题意: 询问区间不同种类颜色数 [2016-11-15] 离线好厉害 对于每一个区间询问,一个数只考虑一次,那么考虑他最后出现的一次 将询问按r排序 从1到n扫描,用树状数组维护一个位置应不应该考虑( ...
- BZOJ1878: [SDOI2009]HH的项链[树状数组 离线]
1878: [SDOI2009]HH的项链 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 3486 Solved: 1738[Submit][Statu ...
- BZOJ1878 [SDOI2009] HH的项链 [莫队,卡常]
BZOJ传送门,洛谷传送门 HH的项链 Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义. ...
- [bzoj1878][SDOI2009]HH的项链_莫队
HH 的项链 bzoj-1878 SDOI-2009 题目大意:给定一个n个数的序列.m次询问,每次询问一段区间内数的种类数. 注释:$1\le n\le 5\cdot 10^4$,$1\le m\l ...
随机推荐
- 「日常训练」Ice Cave(Codeforces Round 301 Div.2 C)
题意与分析(CodeForces 540C) 这题坑惨了我....我和一道经典的bfs题混淆了,这题比那题简单. 那题大概是这样的,一个冰塔,第一次踩某块会碎,第二次踩碎的会掉落.然后求可行解. 但是 ...
- VIN码识别,车架号识别,OCR扫描工具
近年二手车交易市场火爆,对二手车估值需要了详细解二手车的历史状况,车架号(VIN码)是车辆唯一的身份标识,也是了解二手车车况的入口,车商和二手车平台会频繁的进行车况查询,VIN码扫描识别技术给车辆估值 ...
- 运用GamePlayKit的GKEntity及GKComponent 的iOS游戏开发实例
GameplayKit是一个面向对象的框架,为构建游戏提供基础工具和技术. GameplayKit包含用于设计具有功能性,可重用架构的游戏的工具,以及用于构建和增强诸如角色移动和对手行为的游戏玩法特征 ...
- (C#)代理模式
1.代理模式 为其他对象提供代理以控制对这个对象的访问. 远程代理:为一个对象在不同的地址空间提供举报代表.这样可以隐藏一个对象在不同地址空间的事实. 虚拟代理:是依据需要创建开销很大的对象.通过它来 ...
- 孤荷凌寒自学python第八十一天学习爬取图片1
孤荷凌寒自学python第八十一天学习爬取图片1 (完整学习过程屏幕记录视频地址在文末) 通过前面十天的学习,我已经基本了解了通过requests模块来与网站服务器进行交互的方法,也知道了Beauti ...
- 人脸识别 ArcFace Demo [Windows]
Arcsoft ArcfaceDemo for Windows, VS2013 C++ 使用虹软技术开发完成 使用步骤: 1.下载SDK包,32位Windows平台将五个SDK包里lib中的文件到 ...
- 网络安全部门的漏洞扫描让你头痛不已么——PHP环境选它就可以了
最近网络安全要求是越来越严,原来PHP编写的程序在XAMPP或者其他环境下总会被某款软件扫出漏洞,进而上级部门就停止了我们服务器的外网出口,然而自从发现了一款安全环境神器UPUPW后,这样的问题就再也 ...
- HADOOP/HDFS Essay
HDFS架构 the core of HADOOP/distributed systems is storeage(HDFS) and resource manager(YARN) for compu ...
- [leetcode-784-Letter Case Permutation]
Given a string S, we can transform every letter individually to be lowercase or uppercase to create ...
- 硬件电路中VCC,VDD,VEE,VSS有什么区别
电路中GND和GROUND.VCC,VDD,VEE,VSS有什么区别 一.解释 DCpower一般是指带实际电压的源,其他的都是标号(在有些仿真软件中默认的把标号和源相连的)VDD:电源电压(单极器件 ...