题意: 询问区间不同种类颜色数


[2016-11-15]

离线好厉害

对于每一个区间询问,一个数只考虑一次,那么考虑他最后出现的一次

将询问按r排序

从1到n扫描,用树状数组维护一个位置应不应该考虑(记不记入答案),让每种颜色最后一个出现位置贡献

last[x]是x上一个出现的位置,每到一个a[i],last位置-1,i位置+1,并更新last

然后对于所有r==i的询问计算答案

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=5e4+,M=2e5+,INF=1e6+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,m,a[N],last[INF];
struct data{
int l,r,id,ans;
bool operator <(const data &rhs)const{return r<rhs.r;}
}q[M];
inline bool cmp(data a,data b){return a.id<b.id;}
int c[N];
inline int lowbit(int x){return x&-x;}
inline void add(int p,int v){
for(;p<=n;p+=lowbit(p)) c[p]+=v;
}
inline int sum(int p){
int res=;
for(;p>;p-=lowbit(p)) res+=c[p];
return res;
}
int main(){
n=read();
for(int i=;i<=n;i++) a[i]=read(); m=read();
for(int i=;i<=m;i++) q[i].l=read(),q[i].r=read(),q[i].id=i;
sort(q+,q++m);
int p=;
for(int i=;i<=n;i++){
if(last[a[i]]) add(last[a[i]],-);
add(i,); //printf("%d %d %d %d\n",i,a[i],last[a[i]],p);
last[a[i]]=i;
while(q[p].r==i) q[p].ans=sum(q[p].r)-sum(q[p].l-),p++;
}
sort(q+,q++m,cmp);
for(int i=;i<=m;i++) printf("%d\n",q[i].ans);
}

[2017-01-14]

用主席树做起来直观多了,特别在做了BZOJ3514之后这就是水题啊

last[i]表示i位置的数上一个出现位置,查询区间中last[i]<l的个数,序列建主席树,last权值线段树上就是[0...l-1]的权值和啊

注意权值从0开始注意权值从0开始注意权值从0开始

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define lc(x) t[x].l
#define rc(x) t[x].r
const int N=2e5+,MX=1e6+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,Q,x,ql,qr,last[N],pos[MX];
struct node{
int l,r,size;
}t[N*];
int sz,root[N];
void ins(int &x,int l,int r,int p){
t[++sz]=t[x];x=sz;
t[x].size++;
if(l==r) return;
int mid=(l+r)>>;
if(p<=mid) ins(t[x].l,l,mid,p);
else ins(t[x].r,mid+,r,p);
}
int que(int x,int y,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return t[y].size-t[x].size;
else{
int mid=(l+r)>>,ans=;
if(ql<=mid) ans+=que(lc(x),lc(y),l,mid,ql,qr);
if(mid<qr) ans+=que(rc(x),rc(y),mid+,r,ql,qr);
return ans;
}
} int main(){
//freopen("in.txt","r",stdin);
n=read();
for(int i=;i<=n;i++){
x=read();
last[i]=pos[x];
pos[x]=i;
}
for(int i=;i<=n;i++) root[i]=root[i-],ins(root[i],,n,last[i]);//,printf("last %d %d\n",i,last[i]);
Q=read();
while(Q--){
ql=read();qr=read();
printf("%d\n",que(root[ql-],root[qr],,n,,ql-));
}
}

BZOJ1878: [SDOI2009]HH的项链[树状数组+离线 | 主席树]的更多相关文章

  1. BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树

    [题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...

  2. BZOJ 1901 Zju2112 Dynamic Rankings ——树状数组套主席树

    [题目分析] BZOJ这个题目抄的挺霸气. 主席树是第一时间想到的,但是修改又很麻烦. 看了别人的题解,原来还是可以用均摊的思想,用树状数组套主席树. 学到了新的姿势,2333o(* ̄▽ ̄*)ブ [代 ...

  3. BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树

    BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排 ...

  4. ZOJ 2112 Dynamic Rankings(树状数组套主席树 可修改区间第k小)题解

    题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出 ...

  5. P2617 Dynamic Rankings(树状数组套主席树)

    P2617 Dynamic Rankings 单点修改,区间查询第k大 当然是无脑树套树了~ 树状数组套主席树就好辣 #include<iostream> #include<cstd ...

  6. [COGS257]动态排名系统 树状数组套主席树

    257. 动态排名系统 时间限制:5 s   内存限制:512 MB [问题描述]给定一个长度为N的已知序列A[i](1<=i<=N),要求维护这个序列,能够支持以下两种操作:1.查询A[ ...

  7. BZOJ 2141 排队(树状数组套主席树)

    解法很多的题,可以块套树状数组,可以线段树套平衡树.我用的是树状数组套主席树. 题意:给出一段数列,m次操作,每次操作是交换两个位置的数,求每次操作后的逆序对数.(n,m<=2e4). 对于没有 ...

  8. 洛谷P3759 [TJOI2017]不勤劳的图书管理员 【树状数组套主席树】

    题目链接 洛谷P3759 题解 树状数组套主席树板题 #include<algorithm> #include<iostream> #include<cstring> ...

  9. Codeforces Round #404 (Div. 2) E. Anton and Permutation(树状数组套主席树 求出指定数的排名)

    E. Anton and Permutation time limit per test 4 seconds memory limit per test 512 megabytes input sta ...

随机推荐

  1. Python概念-定制自己的数据类型(包装)

    包装:python为大家提供了标准数据类型,以及丰富的内置方法,其实在很多场景下我们都需要基于标准数据类型来定制我们自己的数据类型,新增/改写方法,这就用到了我们刚学的继承/派生知识(其他的标准类型均 ...

  2. Spring4笔记12--SSH整合3--Spring与Struts2整合

    SSH 框架整合技术: 3. Spring与Struts2整合(对比SpringWeb): Spring 与 Struts2 整合的目的有两个: (1)在 Struts2 的 Action 中,即 V ...

  3. aarch64_l2

    libfreehand-devel-0.1.1-5.fc26.aarch64.rpm 2017-05-23 07:16 26K fedora Mirroring Project libfreehand ...

  4. javascript按照指定格式获取上一个月的日期

    //get pre month//get pre month function getPreMonth() { var date=new Date().Format("yyyy-MM-dd& ...

  5. ubuntu下将程序挂后台命令

    ubuntu下将程序挂后台命令 nohup python -u main.py > test.out 2>&1 & ubunut下查看后台进程 jobs -l

  6. 大数据竞赛平台——Kaggle 入门(转)

    先马克一下:http://blog.csdn.net/u012162613/article/details/41929171

  7. 本地为Windows,使用Xshell登录Linux云主机

    以某东的云主机为实例 1. 下载并安装远程登录软件 下载Xshell软件 下载后双击xshell5_5.0.1332.exe进行安装 2. 安装完成,打开Xshell,并点击新建,根据要求输入相应参数 ...

  8. IntelliJ IDEA 把Json字符串 增加到IDE里 用windows记事本 能自动转换(自动增加转义字符)

  9. POJ 2955 Brackets(括号匹配一)

    题目链接:http://poj.org/problem?id=2955 题目大意:给你一串字符串,求最大的括号匹配数. 解题思路: 设dp[i][j]是[i,j]的最大括号匹配对数. 则得到状态转移方 ...

  10. conding.net或github,readme.md添加图片

    原因:    将图片放在仓库里面,在文件里链接它,最后 push 到 github 上.github 图片链接格式:(http://github.com/yourname/your-repositor ...