[SDOI2009]HH的项链 BZOJ1878
2024-10-16 19:12:40
分析:
听说是莫队裸题,很显然,我并不喜欢莫队。
我们可以考虑将询问离线,以右端点排序,之后从1枚举到n,依次树状数组中修改i和last[i],之后当i==询问的右节点时,find一下答案就可以了。
附上代码:
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;
#define N 50005
#define M 1000005
int n,m,a[N],last[M];
struct node
{
int l,r,ans,idx;
}q[N<<2];
bool cmp(const node &c,const node &b){return c.r<b.r;}
bool cmp1(const node &a,const node &b){return a.idx<b.idx;}
int sum[N];
void fix(int x,int c){for(int i=x;i<=n;i+=i&-i)sum[i]+=c;}
int find(int x)
{
int ret=0;
for(int i=x;i;i-=i&-i)ret+=sum[i];
return ret;
}
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].idx=i;
sort(q+1,q+m+1,cmp);
int cnt=1;
for(int i=1;i<=n;i++)
{
if(last[a[i]])fix(last[a[i]],-1);
fix(i,1);
last[a[i]]=i;
while(q[cnt].r==i)q[cnt].ans=find(i)-find(q[cnt].l-1),cnt++;
}
sort(q+1,q+m+1,cmp1);
for(int i=1;i<=m;i++)
{
printf("%d\n",q[i].ans);
}
return 0;
}
最新文章
- 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成
- json与JavaScript对象互换
- width:100%;与width:auto;的区别
- Spring任务调度之Quartz
- 用js计算从开始到结束时间之内的按周值选定
- 关于使用Transaction对于非数据库事务的操作
- 1.6.6 De-Duplication(重复数据删除)
- 运行yum报错Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
- [iOS基础控件 - 6.10.4] 项目启动原理 项目中的文件
- linuxC编程实战 my_server.c例子问题总结
- autorelease方法
- 【20171027中】alert(1) to win 第13,14,15,16题
- 二十一、Hadoop学记笔记————kafka的初识
- VRS——备忘
- HDU 2036 叉乘求三角形面积
- Windows下OpenCV 3.1.0 在 Qt Creator 4.0.2 (Qt 5.7.0 MinGW) 中的开发环境配置
- C++继承-重载-多态-虚函数
- jdk1.5后枚举类的定义规则
- 使用open live writee写的博客
- selenium学习笔记(智能等待)