[BZOJ 2743] 采花
Link:https://www.lydsy.com/JudgeOnline/problem.php?id=2743
Algorithm:
此题询问区间内出现次数超过1个的数字
明显在线做无从下手,无法在区间两端无序的情况下统计符合要求的数字
但可以发现,如果左端递增,是可以用树状数组维护右端数据的
于是我们采取离线方式,将询问排序,左端点不断右移,树状数组随之更新即可
先预处理出next和first数组
每次走过一个数对nxt[i]--,nxt[nxt[i]]++
Code:
#include <bits/stdc++.h> using namespace std;
typedef pair<int,int> P;
typedef pair<P,int> PP;
#define F first
#define S second const int MAXN=;
int dat[MAXN],bit[MAXN],res[MAXN],nxt[MAXN],cur[MAXN],fst[MAXN],n,c,m;
PP op[MAXN]; inline int read()
{
char ch;int num,f=;
while(!isdigit(ch=getchar())) f|=(ch=='-');
num=ch-'';
while(isdigit(ch=getchar())) num=num*+ch-'';
return f?-num:num;
} inline void write(long long x)
{
if(x<) putchar('-'),x=-x;
if(x>) write(x/);
putchar(x%+'');
} void update(int pos,int x)
{
while(pos<=n)
{
bit[pos]+=x;
pos+=pos&(-pos);
}
} int cal(int pos)
{
int ret=;
while(pos)
{
ret+=bit[pos];
pos-=pos&(-pos);
}
return ret;
} int main()
{
n=read();c=read();m=read();
fill(nxt,nxt+MAXN,MAXN-);
for(int i=;i<=n;i++) dat[i]=read();
for(int i=;i<=m;i++) op[i].F.F=read(),op[i].F.S=read(),op[i].S=i;
for(int i=;i<=n;i++) //预处理
{
if(!cur[dat[i]]) fst[dat[i]]=i;
nxt[cur[dat[i]]]=i,cur[dat[i]]=i;
}
for(int i=;i<=c;i++) if(nxt[fst[i]]) update(nxt[fst[i]],); nxt[]=;op[].F.F=;
sort(op+,op+m+); for(int i=;i<=m;i++) //离线
{
for(int j=op[i-].F.F;j<op[i].F.F;j++) //更新右端点
update(nxt[nxt[j]],),update(nxt[j],-);
res[op[i].S]=cal(op[i].F.S)-cal(op[i].F.F-);
} for(int i=;i<=m;i++) write(res[i]),putchar('\n');
return ;
}
Review:
1、当数据维护与左端点的单调性有关时
考虑排序后离线解题
2、一般涉及询问出现字符个数的问题
要预处理出nxt数组,滑动窗口来解题
[BZOJ 2743] 采花的更多相关文章
- BZOJ 2743 采花(树状数组)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2743 题意:给出一个数列,每个询问查询[L,R]中至少出现两次的数字有多少种? 思路:(1 ...
- BZOJ 2743: [HEOI2012]采花
2743: [HEOI2012]采花 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 2056 Solved: 1059[Submit][Status ...
- BZOJ 2743: [HEOI2012]采花( 离线 + BIT )
处理出每个数下一个出现的位置, 然后按左端点排序回答询问.处理当前数去除的影响 ------------------------------------------------------------ ...
- BZOJ 2743: [HEOI2012]采花 离线树状数组
2743: [HEOI2012]采花 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2743 Description 萧芸斓是Z国的公主, ...
- 洛谷 P2056 BZOJ 2743 [HEOI2012]采花
//表示真的更喜欢洛谷的题面 题目描述 萧芸斓是 Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了 n 朵花,花有 c 种颜色(用整数 ...
- BZOJ 2743 【HEOI2012】 采花
题目链接:采花 这道题一眼看去,一个很显然的想法就是莫队.但是数据范围是\(10^6\)级别的,莫队显然已经过不去了. 其实感觉这道题和以前写过的一道题HH的项链很像.只不过那道题要求的是区间出现次数 ...
- 采花 bzoj 2743
采花(1s 128MB)flower [题目描述] 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整 ...
- [BZOJ 2743] [HEOI 2012] 采花
Description 萧芸斓是Z国的公主,平时的一大爱好是采花.今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了 \(n\) 朵花,花有 \(c\) 种颜色(用整数 \ ...
- [HEOI2012]采花 树状数组 BZOJ 2743
题目描述 萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花. 花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于 ...
随机推荐
- 无人值守安装linux系统
需要使用到的服务:PXE + DHCP+TFTP+ Kickstart+ FTP KickStart是一种无人职守安装方式 执行 PXE + KickStart安装需要准备内容: • DHCP 服务 ...
- Working with large data sets in MySQL
What does working with large data sets in mySQL teach you ? Of course you have to learn a lot about ...
- shell编程---变量赋值
echo $filen | awk -F. '{print $3}' 怎么把上边这行脚本产生的字串赋给一个变量啊,实际上会产生一个数, 这个变量用来存这个数.格式应该是怎么写的? a=`echo $ ...
- React 入门小结
前段时间用 Ant Design 做了一个项目,由于之前没有 React 基础,对于 ES6 也是一知半解,所以也是一边开发一边学习,好不容易把项目完成了,现在终于有时间沉下心来从头开始好好学一下 R ...
- JRE集成到Tomcat
将jdk集成到tomcat里面(不用客户安装JRE) 或者 tomcat使用指定的jdk_ 给客户安装软件的时候,也许客户不想你在人家机器的环境变量里设置来设置去,那么就要在tomcat里指定要使用的 ...
- 51Nod 1256 求乘法逆元--扩展欧几里德
#include<stdio.h> int exgcd(int a,int b,int &x,int &y) { ) { x=; y=; return a; } int r ...
- 51nod 1791 合法括号子段
有一个括号序列,现在要计算一下它有多少非空子段是合法括号序列. 合法括号序列的定义是: 1.空序列是合法括号序列. 2.如果S是合法括号序列,那么(S)是合法括号序列.3.如果A和B都是合法括号序列, ...
- Linux : select()详解 和 实现原理【转】
转自:http://blog.csdn.net/huntinux/article/details/39289317 原文:http://blog.csdn.net/boboiask/article/d ...
- git 提示 Please move or remove them before you can merge 解决办法
解决Git冲突造成的Please move or remove them before you can merge git clean -d -fx其中x -----删除忽略文件已经对git来说不识别 ...
- 【C++】默认构造函数
参考文献: 1.黄邦勇帅 2.http://www.cnblogs.com/graphics/archive/2012/10/02/2710340.html 3.http://blog.csdn.ne ...