传送门:点我
Description
HH有一串由各种漂亮的贝壳组成的项链。HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一
段贝壳,思考它们所表达的含义。HH不断地收集新的贝壳,因此他的项链变得越来越长。有一天,他突然提出了一
个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答。。。因为项链实在是太长了。于是,他只
好求助睿智的你,来解决这个问题。
Input
第一行:一个整数N,表示项链的长度。
第二行:N个整数,表示依次表示项链中贝壳的编号(编号为0到1000000之间的整数)。
第三行:一个整数M,表示HH询问的个数。
接下来M行:每行两个整数,L和R(1 ≤ L ≤ R ≤ N),表示询问的区间。
N ≤ 50000,M ≤ 200000。
Output
M行,每行一个整数,依次表示询问对应的答案。

Sample Input
6

1 2 3 4 3 5

3

1 2

3 5

2 6

Sample Output
2

2

4

莫队

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<cstring>
#define go(i,a,b) for(int i=a;i<=b;i++)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int M=200003;
const int N=500003;
struct Mo {int l,r,ID;
} q[M];
int n,m,col[N],unit,Be[N];
int cnt[1000000+10],tot;
int ans[M];
bool cmp(Mo a,Mo b) {return Be[a.l]==Be[b.l]?a.r<b.r:a.l<b.l;
}
inline void revise(int x,int add){if(add==-1){cnt[col[x]]+=add;if(!cnt[col[x]]){ //如果该数的个数已经变为了0,计数减少一个 tot--;}}else{if(!cnt[col[x]]){//如果该数尚未开始计数,计数增加一个 tot++;}cnt[col[x]]+=add;}}
int main() {scanf("%d",&n);unit=sqrt(n);//分块 ,每一块的大小是unit go(i,1,n)scanf("%d",&col[i]),Be[i]=i/unit+1;scanf("%d",&m);go(i,1,m)scanf("%d%d",&q[i].l,&q[i].r),q[i].ID=i;//询问请求的id sort(q+1,q+m+1,cmp);int l=1,r=0;go(i,1,m) {while(l<q[i].l)revise(l,-1),l++;while(l>q[i].l)revise(l-1,1),l--;while(r<q[i].r)revise(r+1,1),r++;while(r>q[i].r)revise(r,-1),r--;ans[q[i].ID]=tot;}go(i,1,m)printf("%d\n",ans[i]);return 0;
}

在落谷上面莫队算法最后两个点竟然被卡掉了,qwq,后来看 了别人的离线+树状数组的做法,但是wa了后面的三个点,自己也不知道为什么,来往的大佬望指教,

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int M=200003;
const int N=500003;
int c[N];
int a[N];
int vis[N],nex[N];
int n,m;
int ans[M];
struct query{int l,r;int ind;
}q[M];
int cmp(query a,query b){return a.l<b.l;
}
int lowbit(int x){return x&(-x);
}
void add(int x,int num){while(x<=n){c[x]+=num;x+=lowbit(x);}
}
int getsum(int x){int s=0;while(x>0){s+=c[x];x-=lowbit(x);}return s;
}
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}scanf("%d",&m);for(int i=1;i<=m;i++){scanf("%d%d",&q[i].l,&q[i].r);q[i].ind=i;}for(int i=1;i<=n;i++){if(!vis[a[i]]){vis[a[i]]=1;add(i,1);}    }for(int i=1;i<=n;i++){vis[a[i]]=0;}for(int i=n;i;--i){if(!vis[a[i]]){nex[i]=n+1;}else{nex[i]=vis[a[i]];}vis[a[i]]=i;}sort(q+1,q+m+1,cmp);int j=1;for(int i=1;i<=m;++i){for(;j<q[i].l;j++)add(nex[j],1);ans[q[i].ind]=getsum(q[i].r)-getsum(q[i].l-1);} for(int i=1;i<=m;i++){printf("%d\n",ans[i]);}return 0;
}

后来又用了主席树, 不怎么会,所以直接套了一个板子,但是只过了前面三个点,其余的都是RE,
呜呜呜,过往的大牛指点一二

#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
const int maxn=500000+5;
const int m=maxn*40;
int n,q,tot;
int a[maxn];
int T[maxn],lson[m],rson[m],c[m];
int build(int l,int r){int root=tot++;c[root]=0;if(l!=r){int mid=(r+l)>>1;lson[root]=build(1,mid);rson[root]=build(mid+1,r);}return root;
}
int update(int root,int pos,int val){int newroot=tot++,tmp=newroot;c[newroot]=c[root]+val;int l=1,r=n;while(l<r){int mid=(l+r)>>1;if(pos<=mid){lson[newroot]=tot++;rson[newroot]=rson[root];newroot=lson[newroot];root=lson[root];r=mid;}else{rson[newroot]=tot++;lson[newroot]=lson[root];newroot=rson[newroot];root=rson[root];l=mid+1;}c[newroot]=c[root]+val;}return tmp;}
int query(int root,int pos){int ret=0;int l=1,r=n;while(pos<r){int mid=(l+r)>>1;if(pos<=mid){r=mid;root=lson[root];}else{ret+=c[lson[root]];root=rson[root];l=mid+1;}}return ret+c[root];}
int main(){while(scanf("%d",&n)==1){tot=0;for(int i=1;i<=n;i++){scanf("%d",&a[i]);}T[n+1]=build(1,n);map<int,int>mp;for(int i=n;i>=1;i--){if(mp.find(a[i])==mp.end()){T[i]=update(T[i+1],i,1);}else{int tmp=update(T[i+1],mp[a[i]],-1);T[i]=update(tmp,i,1);}mp[a[i]]=i;}scanf("%d",&q);while(q--){int l,r;scanf("%d%d",&l,&r);printf("%d\n",query(T[l],r));}}return 0;
}

bzoj 1878: [SDOI2009]HH的项链相关推荐

  1. BZOJ 1878: [SDOI2009]HH的项链

    1878: [SDOI2009]HH的项链 Time Limit: 4 Sec  Memory Limit: 64 MB Submit: 3548  Solved: 1757 [Submit][Sta ...

  2. BZOJ 1878: [SDOI2009]HH的项链( BIT )

    离线处理 , 记下询问的左右端点并排序 , 然后可以利用树状数组 , 保证查询区间时每种颜色只计算一次 ------------------------------------------------ ...

  3. bzoj 1878: [SDOI2009]HH的项链(主席树)

    1878: [SDOI2009]HH的项链 Time Limit: 4 Sec  Memory Limit: 64 MB Submit: 5317  Solved: 2624 [Submit][Sta ...

  4. bzoj 1878: [SDOI2009]HH的项链 ——树状数组+ 差分

    Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此他的项链变得 ...

  5. BZOJ 1878: [SDOI2009]HH的项链 | 莫队

    题解: http://www.lydsy.com/JudgeOnline/problem.php?id=1878 题解: 莫队板子题 核心思想是对区间的询问离线之后按照合理的顺序来优化复杂度 一般的做 ...

  6. 【BZOJ】[SDOI2009]HH的项链

    [算法]主席树||离线+树状数组 [题解] 主席树经典应用:找区间不同的数字个数. 做法:记录每个数上一次出现的位置last[i],对last建权值线段树,对于区间询问last[i]<L的数字个 ...

  7. bzoj千题计划181:bzoj1878: [SDOI2009]HH的项链

    http://www.lydsy.com/JudgeOnline/problem.php?id=1878 之前用莫队做的,现在用树状数组 把每种数的第一个出现位置在树状数组中+1 nxt[i] 记录i ...

  8. BZOJ-1878: [SDOI2009]HH的项链(莫队算法)

    1878: [SDOI2009]HH的项链 Time Limit: 4 Sec  Memory Limit: 64 MB Submit: 4857  Solved: 2401 [Submit][Sta ...

  9. bzoj1878: [SDOI2009]HH的项链

    树状数组的一类题目 #include<cstdio> #include<cstring> #include<iostream> #include<algori ...

最新文章

  1. C#图片处理常见方法性能比较
  2. jsp中设置自动换行_微信公众号文章中如何设置自动回复?
  3. 换行显示print_r($arr);打印结果显示:Array( [0] = 百度 [1] = 阿里)
  4. 【深度学习笔记】Windows 下 pip 安装paddle.fluid
  5. 模拟video播放器
  6. img标签的onerror事件来显示默认图片
  7. LeetCode MySQL 1661. 每台机器的进程平均运行时间
  8. java 方法 时间_Java 方法
  9. Num70 债权查询 债权审核
  10. composer.install
  11. ps怎么去掉框框不伤字体_PS如何去掉和替换图片中的文字? 照着学就行了
  12. python counter函数_Python中的魔法函数——Counter
  13. “黎明”号新任务继续“锁定”谷神星
  14. URL Schemes 程序跳转
  15. 解决win10家庭高级版切换到Administrator用户后无法切换回原账户问题过程记录
  16. 权限控制-Shiro
  17. 四旋翼无人机——导航、制导与控制的概念
  18. pythonturtle写人名_python turtle写名字
  19. 计算机许可管理器服务器名称是什么意思,部署 - 安装后的许可证服务器是什么?...
  20. 澳洲网:超8成雇主对澳大利亚高校毕业生表示满意

热门文章

  1. linux zip命令不存在,Linux压缩命令:zip命令详解
  2. xshell突然卡住不动了怎么回事?
  3. 星起航:抖音小店如何查询商品是否入池?
  4. moment.js的使用方法和日期格式化介绍
  5. 微信公众号开发,如何将素材文章的临时链接改为永久链接
  6. Shader实例(流光实现)
  7. shader 学习记录
  8. 智能mp5 android系统,新Android智能MP5 蓝晨BM790改版上市
  9. leetcode三数之和 M015
  10. 面向对象设计的10个原则