[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. 我们发现:区间中相同的几个数,只有最左边 ...
随机推荐
- Leetcode 24——Swap Nodes in Pairs
Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2-& ...
- 利用jmeter做一个简单的性能测试并进行参数化设置
1.新增一个线程组,并在下面添加基本原件,包括:监听器.http请求默认值和一个事务控制器 在http请求默认值中填写 ip 地址和端口号,协议类型默认为http 2.添加代理服务器,以便之后进行录制 ...
- c语音-第零次作业
1.你认为大学的学习生活.同学关系.师生应该是怎样? 我认为大学学习应该以自我学习为主,由以往的被动学习改为主动学习,探索新世界,除学习专业知识外对自身欠缺的地方也应该加以补足:同学之间要互相帮助,更 ...
- C语言博客作业—嵌套循环
一.PTA实验作业 题目1:7-4 换硬币 1. 本题PTA提交列表 2. 设计思路 (1)定义整型变量money表示待换的零钱总额,p5表示5分硬币的数量,p2表示2分硬币的数量,p1表示1分硬币的 ...
- C语言博客作业一二维数组
一.PTA实验作业 题目1.7-5 数组循环左移 1.本题PTA提交列表 2.设计思路 定义变量a[100]存放整数,整数n,整数m,change作为交换数组的媒介,j,i作为循环的变量 输入整数n, ...
- 20145237 实验一 逆向与Bof基础
20145237 实验一 逆向与Bof基础 1.直接修改程序机器指令,改变程序执行流程 此次实验是下载老师传给我们的一个名为pwn1的文件. 首先,用 objdump -d pwn1 对pwn1进行反 ...
- Flask 部署和分发
到目前为止,启动Flask应用都是通过"app.run()"方法,在开发环境中,这样固然可行,不过到了生产环境上,势必需要采用一个健壮的,功能强大的Web应用服务器来处理各种复杂情 ...
- Scala 对象
1. 单例对象 对于任何你在Java中会使用单例对象的地方, 在scala中都可以使用对象来实现; scala字段没有静态方法或者静态字段, 可以使用object语法结构达到同样的效果,对象(obje ...
- python性能分析--cProfile
Python标准库中提供了三种用来分析程序性能的模块,分别是cProfile, profile和hotshot,另外还有一个辅助模块stats.这些模块提供了对Python程序的确定性分析功能,同时也 ...
- js前端对后台数据的获取,如果是汉字则需要添上引号
js前端对后台数据的获取,如果是汉字则需要添上引号