【HEOI2012】采花 BZOJ2743
Description
Input
Output
共m行,每行一个整数,第i个数表示公主在女仆的第i个行程中能采到的花的颜色数。
Sample Input
1 2 2 3 1
1 5
1 2
2 2
2 3
3 5
Sample Output
0
【样例说明】
询问[1, 5]:公主采颜色为1和2的花,由于颜色3的花只有一朵,公主不采;询问[1, 2]:颜色1和颜色2的花均只有一朵,公主不采;
询问[2, 2]:颜色2的花只有一朵,公主不采;
询问[2, 3]:由于颜色2的花有两朵,公主采颜色2的花;
询问[3, 5]:颜色1、2、3的花各一朵,公主不采。
HINT
【数据范围】
对于100%的数据,1 ≤ n ≤ 10^6,c ≤ n,m ≤10^6。
思路
话说HE是哪里。。
一开始打算用莫队做的,结果nsqrt(n)果断TTTTTTTTTT
然后知道这种题在线是不可做的。。果断离线处理。
将所有的询问[st,ed]按照st为第一关键字,ed为第二关键字排序。
然后预处理记录下每个位置的花的下一个相同颜色的花的位置在哪里,i号位上的花的下一个记为next[i]
首先对于所有的颜色的花next[next[pos[i]]++;(POS[i]是第一个第i种颜色的花的位置)
然后由于询问的st被排过序,是递增的,那么我们维护一个变量L,每次处理新的询问的时候往右扫,对于那些原本在询问范围内但更新了询问范围后不在的花相应更新树状数组。
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
#include <vector>
#include <ctime>
#include <functional>
#define pritnf printf
#define scafn scanf
#define sacnf scanf
#define For(i,j,k) for(int i=(j);i<=(k);(i)++)
#define Clear(a) memset(a,0,sizeof(a))
using namespace std;
typedef unsigned int Uint;
const int INF=0x3fffffff;
const double eps=1e-;
///==============struct declaration==============
struct Querys{
int st,ed,No;
bool operator <(const Querys &rhs) const{
return st==rhs.st?ed<rhs.ed:st<rhs.st;
}
};
///==============var declaration=================
const int MAXN=;
int n,c,m;
int color[MAXN],pos[MAXN],next[MAXN];
int A[MAXN],ans[MAXN];
Querys Query[MAXN];
///==============function declaration============
void Add_Bit(int x,int v);
int Query_Bit(int x);
int lowbit(int x){return x&-x;}
///==============main code=======================
int main()
{
#define FILE__
#ifdef FILE__
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
#endif
scanf("%d%d%d",&n,&c,&m);
for(int i=;i<=n;i++) scanf("%d",color+i);
for(int i=n;i>=;i--){
next[i]=pos[color[i]];
pos[color[i]]=i;
}
for(int i=;i<=c;i++)
if (next[pos[i]])
Add_Bit(next[pos[i]],);
for(int i=;i<=m;i++){
scanf("%d%d",&Query[i].st,&Query[i].ed);
Query[i].No=i;
}
sort(Query+,Query++m);
int L=;
for(int i=;i<=m;i++){
while (L<Query[i].st){
if (next[next[L]])
Add_Bit(next[next[L]],);
if (next[L])
Add_Bit(next[L],-);
L++;
}
ans[Query[i].No]=Query_Bit(Query[i].ed)-Query_Bit(Query[i].st-);
}
for(int i=;i<=m;i++)
printf("%d\n",ans[i]);
return ;
}
///================fuction code====================
void Add_Bit(int x,int v){
while (x<=n){
A[x]+=v;
x+=lowbit(x);
}
}
int Query_Bit(int x){
int res=;
while (x>){
res+=A[x];
x-=lowbit(x);
}
return res;
}
BZOJ1878
【HEOI2012】采花 BZOJ2743的更多相关文章
- [HEOI2012]采花 BZOJ2743
分析: 听说主席树和莫队可以做,前者不想写,后者我不会... 我们考虑将询问离线,按照左端点排序,之后先处理好从1开始选的答案,之后枚举从1到n,之后依次删除nxt[i],添加nxt[nxt[i]], ...
- 【BZOJ2743】[HEOI2012]采花 离线+树状数组
[BZOJ2743][HEOI2012]采花 Description 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花, ...
- [bzoj2743][HEOI2012]采花_树状数组
采花 bzoj-2743 HEOI-2012 题目大意:给定n朵花,每朵花有一个种类,m次询问:一段区间中至少出现两朵花的种类的个数. 注释:$1\le n,m\le10^6$. 想法:这个题超级像H ...
- [bzoj2743][HEOI2012]采花(树状数组+离线)
2743: [HEOI2012]采花 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 1832 Solved: 954[Submit][Status] ...
- 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]采花_离线+树状数组
BZOJ_2743_[HEOI2012]采花_离线+树状数组 Description 萧芸斓是Z国的公主,平时的一大爱好是采花.今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花 .花园足够大 ...
- BZOJ 2743: [HEOI2012]采花 离线树状数组
2743: [HEOI2012]采花 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2743 Description 萧芸斓是Z国的公主, ...
- cogs:1619. [HEOI2012]采花/luogu P2056
1619. [HEOI2012]采花 ★★☆ 输入文件:1flower.in 输出文件:1flower.out 简单对比时间限制:5 s 内存限制:128 MB [题目描述] 萧薰儿是 ...
- 1619. [HEOI2012]采花
1619. [HEOI2012]采花 ★★☆ 输入文件:1flower.in 输出文件:1flower.out 简单对比 时间限制:5 s 内存限制:128 MB [题目描述] 萧薰儿 ...
随机推荐
- [LeetCode] Valid Number 验证数字
Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...
- JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(四):自定义T4模板快速生成页面
前言:上篇介绍了下ko增删改查的封装,确实节省了大量的js代码.博主是一个喜欢偷懒的人,总觉得这些基础的增删改查效果能不能通过一个什么工具直接生成页面效果,啥代码都不用写了,那该多爽.于是研究了下T4 ...
- 求n!最后一位非零数
引子:求n!末尾0的个数 n!末尾的0来源只有2,5两个质数相乘.所以只需要考察n!中包含多少个2和多少个5.然后取其较小值即为所求.即ans=min(cnt(2),cnt(5)).而转念一想,cnt ...
- navicat注册码
1. navicat for mysql 9 注册码 ::: NAVL-EHNC-7N7P-W6GM 2. navicat for mysql 9.17中文版 注册码 :: NAVM-5ZC ...
- 工作邮件loop的用法
examples come from native speaker Put john in the loop about this. He will have good advice. Why hav ...
- sql三维数据
今天有个钢铁项目在导入数据时 存货规格各种缺 相吐血 原表结构是这样的 编码.规格.名称 三种存货 三种都有想同的规格 规格对分厚度和宽度 那么问题来了 简简单单的几个厚度宽度 三种商品 就到了 10 ...
- Oracle XE手动建立数据库实例
参考资料为: [Oracle XE系列之三]使用OMF方式手工创建Oracle XE数据库 - 王立夫 - 博客园http://www.cnblogs.com/opfo/p/5056122.html ...
- python gettitle.py
#!/usr/bin/env python # coding=utf-8 import threading import requests import Queue import sys import ...
- CodeForces 261B Maxim and Restaurant 解法汇总
题意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a3-+ai,问满足Si<=p的i的最大值的期望.(p<=50) 这道题在网上有一些不同 ...
- 【总结】.Net面试题集锦 (二)
一.前面的话 本文的面试题不是很难,这里只是想记录个人的思考过程,另一方面希望有更好的解决办法的大牛留下宝贵的思路,大家共同学习进步. 二.题目 思路:第一步:把一维数组的值和次数存入Dictiona ...