[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表示),且花是排成一排的,以便于 ...
随机推荐
- 【NOIP模拟赛】chess 建图+spfa统计方案数
似乎弗洛伊德和迪杰斯特拉都干不了统计方案数,spfa的话就是不断入队就好. #include <cstdio> #include <cstring> #include < ...
- POJ2492:A Bug's Life(种类并查集)
A Bug's Life Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 45757 Accepted: 14757 题 ...
- HDU 多校对抗赛 C Triangle Partition
Triangle Partition Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Oth ...
- ubuntu12.04 Qt WebKit编译
转载自:http://my.oschina.net/u/257674/blog/167050 官方文档: http://trac.webkit.org/wiki/BuildingQtOnLinux#D ...
- 调整文本输入框placeholder的颜色等样式
input::-webkit-input-placeholder{ color: white !important;}input:-moz-placeholder{ color: whi ...
- HDU1013 Digital Roots
http://acm.hdu.edu.cn/showproblem.php?pid=1013 #include<iostream> #include "cstdio" ...
- Spring - IoC(7): 延迟实例化
默认情况下,Spring IoC 容器启动后,在初始化过程中,会以单例模式创建并配置所有使用 singleton 定义的 Bean 的实例.通常情况下,提前实例化 Bean 是可取的,因为这样在配置中 ...
- win 7 64 位系统驱动签名
自己开发未经签名的驱动无法加载,关闭Windows 7系统中的驱动签名强制要求 bcdedit.exe -set loadoptions DDISABLE_INTEGRITY_CHECKS
- [POJ1845&POJ1061]扩展欧几里得应用两例
扩展欧几里得是用于求解不定方程.线性同余方程和乘法逆元的常用算法. 下面是代码: function Euclid(a,b:int64;var x,y:int64):int64; var t:int64 ...
- 01-UIDynamic简单演练demo源代码
源代码下载: 01-简单演练.zip72.0 KB // // ViewController.m // 01.简单演练 // // Created by apple on 13-12-24. / ...