BZOJ1878 洛谷1972 HH的项链题解
看到这样不用修改的题目,应该佷容易就联想到了离线来处理。
我们发现若将询问按照r来排序,排完后每次对答案有贡献的仅是每个颜色最后出现的位置
我们用next[i]表示i处颜色之前出现的位置,我们利用树状数组维护每个数最后一次出现的位置小于j的个数,每次的答案就是树状数组l到r这一段的和
显然,next[i]处对答案已经不会产生贡献了,我们就可以将这个贡献减掉
然后再将i处对答案的贡献加入
# include<iostream>
# include<cstdio>
# include<cmath>
# include<algorithm>
using std::sort;
const int mn = ;
const int maxn = ;
inline int read()
{
int x=;
char ch=getchar();
while(ch>'' || ch<'') ch=getchar();
while(ch>='' && ch<='') {x=x*+ch-'';ch=getchar();}
return x;
}
int n,m;
int nxt[],ans[maxn],tmp[];
int T[mn];
//nxt[i]表示在i处的颜色上一次出现的位置
void add(int x,int val)
{
while(x<=n)
{
T[x]+=val;
x+=(x&-x);
}
}
int sum(int x)
{
int ret=;
while(x>)
{
ret+=T[x];
x-=(x&-x);
}
return ret;
}
struct ask{int l,r,id;};
ask b[maxn];
bool cmp(ask x,ask y)
{
return x.r<y.r;
}
int main()
{
int x;
n=read();
for(int i=;i<=n;i++)
{
x=read(),nxt[i]=tmp[x],tmp[x]=i;
}
m=read();
for(int i=;i<=m;i++)
b[i].l=read(),b[i].r=read(),b[i].id=i;
sort(b+,b++m,cmp);
int l=;
for(int i=;i<=m;i++)
{
while(l<=b[i].r)
{
//若上一次出现过,要把上一次统计的结果减掉
if(nxt[l])
add(nxt[l],-);
add(l,);
l++;
}
ans[b[i].id]=sum(b[i].r)-sum(b[i].l-);
}
for(int i=;i<=m;i++)
printf("%d\n",ans[i]);
return ;
}
BZOJ1878 洛谷1972 HH的项链题解的更多相关文章
- 洛谷 P1972 HH的项链 题解
题面 本题其实主要就这几点: 1.离线,以右端点排序(从小到大); 2.建立树状数组c[],c[i]表示从1~i中有多少种不同的数字: 3.对于每次查询的答案就是sum(r)-sum(l-1); 4. ...
- 洛谷1972 HH的项链 树状数组查询区间内不同的数的数量
题目链接:https://www.luogu.com.cn/problem/P1972 题意大致是:给定一个序列长度为n,给出m个查询区间,要求响应是区间内不同的数的个数.为此我们考虑到树状数组的区间 ...
- [洛谷 P1972] HH的项链(SDOI2009)
P1972 [SDOI2009]HH的项链 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断 ...
- 洛谷P1972 HH的项链
传送门啦 分析: 题目描述不说了,大意是,求一段区间内不同元素的种数. 看到区间,我们大概先想到的是暴力(然后炸掉).线段树.树状数组.分块. 下面给出的是一种树状数组的想法. 首先,对于每一段区间里 ...
- 洛谷P1972 HH的项链【树状数组】
题目:https://www.luogu.org/problemnew/show/P1972 题意:给定一个长度为n的序列,数字表示珠子的种类.m次查询每次询问给定区间内珠子的种类数. 思路:可以说是 ...
- 洛谷P1783 海滩防御 分析+题解代码
洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...
- 洛谷P4047 [JSOI2010]部落划分题解
洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...
- 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)
洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...
- 洛谷P1972 [SDOI2009]HH的项链 题解
[SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不 ...
随机推荐
- springcloud:Eureka的使用
1.认识Eureka 服务的管理. 问题分析 在刚才的案例中,itcast-service-provider对外提供服务,需要对外暴露自己的地址.而consumer(调用者)需要记录服务提供者的地址. ...
- 跟我一起做一个vue的小项目(十一)
接下来我们进行的是详情页动态路由及banner布局 先看页面的效果 下面是代码部分 <template> <div> <div class="banner&qu ...
- Python之常用文件操作
Python之常用文件操作
- poj 1654 Area(求多边形面积 && 处理误差)
Area Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16894 Accepted: 4698 Description ...
- python 发送邮件短信封装
发送邮件 需要开启163的smtp服务 import smtplib from email.mime.text import MIMEText class MailSender(): def __in ...
- 使用junit单元测试,报Cannot instantiate test(s): java.lang.SecurityException: Prohibited package name: java.com.com.test
在测试类中不能一级包名不能以java开头, 将包改为com.com.test就好了.
- Neo4j与ElasticSearch数据同步
Neo4j与ElasticSearch数据同步 针对节点删除,加了一些逻辑,代码地址 背景 需要强大的检索功能,所有需要被查询的数据都在neo4j. 方案 在Server逻辑中直接编写.后端有一个St ...
- 学习JDK1.8集合源码之--TreeMap
1. TreeMap简介 TreeMap继承自AbstractMap,实现了NavigableMap.Cloneable.java.io.Serializable接口.所以TreeMap也是一个key ...
- javaScript中的事件对象event是怎样
事件对象event,每当一个事件被触发的时候,就会随之产恒一个事件对象event,该对象中主要包含了关于该事件的基本属性,事件类型type(click.dbclick等值).目标元素target(我的 ...
- go 文件操作 io
package main import ( "fmt" "os" ) func main() { //打开文件 //概念说明: file 的叫法 //1. fi ...