采花 flower
采花 flower
题目描述
萧芸斓是 Z 国的公主,平时的一大爱好是采花。
今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花。花园足够大,容纳 了 n 朵花,花有 c 种颜色(用整数 1-c 表示),且花是排成一排的,以便于公主采花。
公主每次采花后会统计采到的花的颜色数,颜色数越多她会越高兴!同时,她有一癖好, 她不允许最后自己采到的花中,某一颜色的花只有一朵。为此,公主每采一朵花,要么此前 已采到此颜色的花,要么有相当正确的直觉告诉她,她必能再次采到此颜色的花。
由于时间关系,公主只能走过花园连续的一段进行采花,便让女仆福涵洁安排行程。福 涵洁综合各种因素拟定了 m 个行程,然后一一向你询问公主能采到多少朵花(她知道你是编 程高手,定能快速给出答案!),最后会选择令公主最高兴的行程(为了拿到更多奖金!)。
输入
第一行四个空格隔开的整数 n、c 以及 m。
接下来一行 n 个空格隔开的整数,每个数在[1, c]间,第 i 个数表示第 i 朵花的颜色。
接下来 m 行每行两个空格隔开的整数 l 和 r(l ≤ r),表示女仆安排的行程为公主经 过第 l 到第 r 朵花进行采花。
输出
共m行,每行一个整数,第i个数表示公主在女仆的第i个行程中能采到的花的颜色数。
样例输入
5 3 5
1 2 2 3 1
1 5
1 2
2 2
2 3
3 5
样例输出
2
0
0
1
0
提示
【样例说明】
询问[1, 5]:公主采颜色为 1 和 2 的花,由于颜色 3 的花只有一朵,公主不采;
询问[1, 2]:颜色 1 和颜色 2 的花均只有一朵,公主不采;
询问[2, 2]:颜色 2 的花只有一朵,公主不采;
询问[2, 3]:由于颜色 2 的花有两朵,公主采颜色 2 的花;
询问[3, 5]:颜色 1、2、3 的花各一朵,公主不采。
【数据范围】
对于 20%的数据,n ≤ 102,c ≤ 102,m ≤ 102;
对于 50%的数据,n ≤ 105,c ≤ 102,m ≤ 105;
对于 100%的数据,1 ≤ n ≤106,c ≤ n,m ≤ 106。
来源
解法好牛
首先离线处理询问
按l从小到大排序
维护区间(l,n)
把[l, n]内每种颜色的第一朵花标记成1,其余标记为0,那么[l, r]内标记的和就是区间内花的种类数;
每种颜色的第一朵花标记成1、第二朵花标记成-1,其余标记为0,那么[l, r]内标记的和就是区间内相同颜色只有一朵的花的种类数;
上面两数之差就是答案
树状数组维护即可
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define maxn 1000006
using namespace std;
int n,c,m,s[maxn],a[maxn],b[maxn],num[maxn],t,top[maxn],ans[maxn];
vector<int>g[maxn];
struct no{
int id,l,r;
}q[maxn];
bool cmp(no a, no b){
return a.l<b.l;
}
void pa(int k,int v){
for(int i=k;i<=n;i+=i&-i)a[i]+=v;
}
void pb(int k,int v){
for(int i=k;i<=n;i+=i&-i)b[i]+=v;
}
int aska(int k){
int sum=0;
for(int i=k;i;i-=i&-i)sum+=a[i];
return sum;
}
int askb(int k){
int sum=0;
for(int i=k;i;i-=i&-i)sum+=b[i];
return sum;
}
int main(){
cin>>n>>c>>m;
for(int i=1;i<=n;i++){
scanf("%d",&s[i]);
g[s[i]].push_back(i);
num[s[i]]++;
if(num[s[i]]==1){
pa(i,1),pb(i,1);
}
if(num[s[i]]==2)pb(i,-1);
}
for(int i=1;i<=m;i++){
scanf("%d%d",&q[i].l,&q[i].r);
q[i].id=i;
}
sort(q+1,q+m+1,cmp);
int la=1;
for(int i=1;i<=m;i++){
while(la<q[i].l){
if(top[s[la]]+1<g[s[la]].size()){
int nex=g[s[la]][top[s[la]]+1];
pa(la,-1);pa(nex,1);
pb(la,-1);pb(nex,2);
top[s[la]]++;
if(top[s[la]]+1<g[s[la]].size()){
//cout<<la<<' '<<g[s[la]][top[s[la]]]<<' '<<g[s[la]][top[s[la]]+1]<<endl;
nex=g[s[la]][top[s[la]]+1];
pb(nex,-1);
}
}
la++;
}
int t1=aska(q[i].r),t2=askb(q[i].r);
//cout<<"aaa "<<q[i].l<<' '<<q[i].r<<' '<<t1<<' '<<t2<<endl;
ans[q[i].id]=t1-t2;
}
for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
return 0;
}
采花 flower的更多相关文章
- BZOJ 2743 【HEOI2012】 采花
题目链接:采花 这道题一眼看去,一个很显然的想法就是莫队.但是数据范围是\(10^6\)级别的,莫队显然已经过不去了. 其实感觉这道题和以前写过的一道题HH的项链很像.只不过那道题要求的是区间出现次数 ...
- 【HEOI2012】采花 BZOJ2743
Description 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一 ...
- 采花 bzoj 2743
采花(1s 128MB)flower [题目描述] 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整 ...
- BZOJ 2743: [HEOI2012]采花
2743: [HEOI2012]采花 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 2056 Solved: 1059[Submit][Status ...
- [bzoj2743][HEOI2012]采花(树状数组+离线)
2743: [HEOI2012]采花 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 1832 Solved: 954[Submit][Status] ...
- cdoj 1489 老司机采花
地址:http://acm.uestc.edu.cn/#/problem/show/1489 题目: 老司机采花 Time Limit: 3000/1000MS (Java/Others) M ...
- 数据结构(树状数组):HEOI2012 采花
[题目描述] 萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便 ...
- BZOJ 2743: [HEOI2012]采花( 离线 + BIT )
处理出每个数下一个出现的位置, 然后按左端点排序回答询问.处理当前数去除的影响 ------------------------------------------------------------ ...
- [BZOJ2743] [HEOI2012] 采花 (树状数组)
Description 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一 ...
随机推荐
- 前端安全之XSS和csrf攻击
1.Csrf攻击概念: csrf攻击(Cross-site request forgery):跨站请求伪造; 2.Csrf攻击原理: 用户是网站A的注册用户,且登录进去,于是网站A就给用户下发cook ...
- AOSP常见漏洞类型简介
Heap/Stack Overflow(CVE-2017-0541) 漏洞出现在PushcdlStack函数中,如下所示 # /external/sonivox/arm-wt-22k/lib_sr ...
- nginx反向代理与正向代理的区别
http://blog.csdn.net/m13666368773/article/details/8060481
- iOS开发——应用间跳转
iOS开发过程中,我们经常碰到应用间跳转的情景: 1.使用第三方用户登录,跳转到需授权的App或跳转到分享app的对应页面 *需要用户授权,还需要"返回到调用的程序,同时返回授权的用户名.密 ...
- PowerDesigner导入Excel模板生成实体
在Excel里整理好的表模型数据,可直接导入PowerDesigner.此功能通过PowerDesigner的脚本功能来实现,使用起来也简单.具体操作方法: 打开PowerDesign ...
- pycharm永久激活记录
由于上一年安装的pycharm激活时是用的激活码,有期限的,一直到今年5月4日过期,这两天顺便把版本也更新到最新,一直用的free版,到今天提醒我free快到期了,所以才狠下心来去找解决方案,目前已经 ...
- oracle一些常用的数据类型
字符数据类型 char数据类型 当需要固定长度时,使用char数据类型,此数据类型长度可以使1-2000字节.若是不指定大小默认占1字节,如果长度有空余时会以空格进行填充,如果大于设定长度 数据库则会 ...
- Python 正则表达式 利用括号分组
如果想把区号从匹配的电话号码中分离,可以添加括号在正则表达式中创建分组,再使用group()方法,从一个分组中获取匹配的文本 正则表达式字符串中,第一个括号是第一组,第二个括号是第二组.向group( ...
- 微信小程序navigator的open-type跳转问题
navigator的open-type属性 可选值 'navigate'.'redirect'.'switchTab',对应于wx.navigateTo.wx.redirectTo.wx.switch ...
- 对数据仓库Hive的一些认识
首先我们得明白什么是数据仓库? 数据仓库,英文名称为Data warehouse,可简写为DW或DWH.数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持(Decision Supp ...