[SDOI 2009]HH的项链
Description
Input
Output
Sample Input
1 2 3 4 3 5
3
1 2
3 5
2 6
Sample Output
2
4
HINT
对于40%的数据,N ≤ 3000,M ≤ 200000;
对于100%的数据,N ≤ 50000,M ≤ 200000。
题解
这题首先在线是没法做的,所以我们可以考虑离线算法
解法1:莫队裸题,分块就好。
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<ctime>
#include<cstdio>
#include<string>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
#define RE register
#define IL inline
using namespace std;
const int M=;
const int N=;
const int Q=; int cnt[M+],ans;
int keep[Q+];
int n,m,a[N+],tim;
struct query
{
int l,r,id;
}q[Q+];
bool comp(const query &a,const query &b){return a.l/tim==b.l/tim ? a.r<b.r:a.l<b.l;} int main()
{
scanf("%d",&n);
tim=sqrt(n);
for (int i=;i<=n;i++) scanf("%d",&a[i]);
scanf("%d",&m);
for (int i=;i<=m;i++)
{
scanf("%d%d",&q[i].l,&q[i].r);
q[i].id=i;
}
sort(q+,q+m+,comp);
int curl=,curr=,l,r;
for (int i=;i<=m;i++)
{
l=q[i].l,r=q[i].r;
while (curl<l) {cnt[a[curl]]--;ans-=(cnt[a[curl++]]==);}
while (curl>l) {cnt[a[--curl]]++;ans+=(cnt[a[curl]]==);}
while (curr<r) {cnt[a[++curr]]++;ans+=(cnt[a[curr]]==);}
while (curr>r) {cnt[a[curr]]--;ans-=(cnt[a[curr--]]==);}
keep[q[i].id]=ans;
}
for (int i=;i<=m;i++) printf("%d\n",keep[i]);
return ;
}
莫队
解法2:排序+树状数组。
首先记录下每种颜色的下一种颜色所在的位置,将所有询问按照右端点进行排序。
左往右扫,扫过一个元素将该位置++,若有前驱,将前驱--。
扫到区间端点,答案为$sum[r]-sum[l-1]$,记录一下就好。(其中$sum$为前缀和)
前缀和用树状数组实现。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct Node
{
int l,r,num;
}s[];
int a[],ans[],n,m,c[],vis[];
bool cmp(Node a,Node b)
{
return (a.r<b.r||(a.r==b.r&&a.l<b.l));
}
int getsum(int x)
{
int s=;
while (x)
{
s+=c[x];
x-=(x&(-x));
}
return s;
}
void add(int x,int d)
{
while (x<=n)
{
c[x]+=d;
x+=(x&(-x));
}
}
int main()
{int i,j;
cin>>n;
for (i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
cin>>m;
for (i=;i<=m;i++)
{
scanf("%d%d",&s[i].l,&s[i].r);
s[i].num=i;
}
sort(s+,s+m+,cmp);
j=;
for (i=;i<=n+;i++)
{
while (j<=m&&i>s[j].r)
{
ans[s[j].num]=getsum(s[j].r)-getsum(s[j].l-);
j++;
}
if (i>n) break;
if (vis[a[i]])
{
add(vis[a[i]],-);
vis[a[i]]=i;
add(i,);
}
else
{
vis[a[i]]=i;
add(i,);
}
}
for (i=;i<=m;i++)
printf("%d\n",ans[i]);
}
排序+树状数组
[SDOI 2009]HH的项链的更多相关文章
- [ SDOI 2009 ] HH的项链 & [ HEOI 2012 ] 采花
\(\\\) \(Description\) 给出一个长为\(N\)的序列,\(M\)次询问区间\([L_i,R_i]\)内不同数字的个数. \(N\in [1,5\times 10^4]\),\(M ...
- BZOJ 1878 SDOI 2009 HH项链 树状数组 + 脱机处理
标题效果:一些珠子项链.珠具有不同的颜色.我们问了很多次有多少种不同的颜色有过一段范围. 思考:这个问题让我学会聪明的离线实践.按左端点排序问题.加工出来的位置每种颜色首次出现.每一种颜色的下一次出现 ...
- [SDOI 2009]HH去散步
Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又 ...
- [BZOJ 1875] [SDOI 2009] HH去散步【矩阵乘法】
题目链接:BZOJ - 1875 题目分析: 这道题如果去掉“不会立刻沿着刚刚走来的路走回”的限制,直接用邻接矩阵跑矩阵乘法就可以了.然而现在加了这个限制,建图的方式就要做一些改变.如果我们把每一条边 ...
- sdoi 2009 HH去散步 矩阵乘
如果没有题里的"不会立刻沿着刚刚走来的路走回"限制,那么直接矩乘计算k步的方案数 但加了这个限制,就不能以点来矩乘了,考虑边数<=60,如果以边建邻接矩阵呢?? 先拆边,再把 ...
- Codevs 2307[SDOI2009]HH的项链
同题: Codevs 2307 HH的项链 BZOJ 1878 HH的项链 洛谷 1972 HH的项链 2009年省队选拔赛山东 时间限制: 1 s 空间限 ...
- BZOJ 1878: [SDOI2009]HH的项链
1878: [SDOI2009]HH的项链 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 3548 Solved: 1757[Submit][Statu ...
- BZOJ-1878 HH的项链 树状数组+莫队(离线处理)
1878: [SDOI2009]HH的项链 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 2701 Solved: 1355 [Submit][Statu ...
- 【BZOJ】【1878】【SDOI2009】HH的项链
树状数组/前缀和 Orz lct1999 好神的做法... 先看下暴力的做法:对于区间[l,r],我们依次扫过去,如果这个数是第一次出现,那么我们种类数+1. 我们发现:区间中相同的几个数,只有最左边 ...
随机推荐
- 团队作业4——第一次项目冲刺(Alpha版本)11.16
a. 提供当天站立式会议照片一张 举行站立式会议,讨论项目安排: 整理各自的任务汇报: 全分享遇到的困难一起讨论: 讨论接下来的计划: b. 每个人的工作 (有work item 的ID) 1.前两天 ...
- java克隆之深拷贝与浅拷贝
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java深拷贝与浅拷贝实际项目中用的不多,但是对于理解Java中值传递,引用传递十分重要,同时个人认为对于理解内存模型也有帮助,况且面试中也是经常问 ...
- Nginx在windows环境下的安装与简单配置
版权声明:本文为博主原创文章,未经博主允许不得转载. 一. 下载并安装Nginx 去Nginx官网下载 我这里选取nginx/Windows-1.10.3版本,下载后解压出来即可,解压出来的路径不能含 ...
- 总体来说,require_once 肯定要比 require 性能好
首先,总体来说,require_once 肯定要比 require 性能好. 因为 require 某个文件等同于 "编译 + 执行" 这个文件:require_once 避免了对 ...
- http客户端请求及服务端详解
http客户端请求及服务端详解 引言 HTTP 是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和 扩展. ...
- Oracle闪回技术
(一)闪回技术概要 闪回技术是数据库备份与恢复的重要补充手段,主要包括以下7种特性: 特性 原理 数据库支持 闪回查询(Flashback Query) 利用undo表空间中的回退信息,查询过去某个时 ...
- List集合就这么简单【源码剖析】
前言 声明,本文用得是jdk1.8 前一篇已经讲了Collection的总览:Collection总览,介绍了一些基础知识. 现在这篇主要讲List集合的三个子类: ArrayList 底层数据结构是 ...
- big_menu菜单设置
1.页面 <script> $(function(){ $('.subnav .content-menu .on').after('<a class="add fb&quo ...
- maven入门(1-4)使用eclipse构建maven项目
1. 安装m2eclipse插件 要用Eclipse构建Maven项目,我们需要先安装meeclipse插件 点击eclipse菜单栏Help->Eclipse Marketplac ...
- bootstrap 之下拉多选
效果如图: 一.HTML代码 <label class="col-sm-1 control-label text-right" for="ds_host" ...