【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] Transpose File 转置文件
Given a text file file.txt, transpose its content. You may assume that each row has the same number ...
- canvas检测边界和弹动的实例
如图所示的效果,小球相互碰撞会相互弹开,这时要干的事就只有两件事了,一:用二次循环遍历小球是否互相碰撞,二:碰撞之后会弹向什么地方和弹出多少距离,第一件事我想学过二维数组循环的都没问题,第二件事也只是 ...
- java之并发编程线程池的学习
如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间. java.uitl.concurrent.Thre ...
- electron 入门小白贴
electron 入门小白贴 electron demo 跑起来! 毕设准备是做个 跨平台的做题的客户端,打算用 electron 来弄. 然而今天折腾了半天才终于吧demo给跑起来了.经历了许多的问 ...
- cocos2dx3.0的CCCallFunc、CCCallFuncN
来源: http://blog.csdn.net/crayondeng/article/details/18767407 二.在cocos2d-x中,还有一个地方是需要大量使用到回调函数的,这就是回调 ...
- 添加webservice调用日志
之前想用spring的AOP给webservice添加切面的,但是使用around切面后,居然调用端得不到webservice的返回结果,而且报文的详细情况也不得而知,很是尴尬,所以偷了个懒.但是该做 ...
- Javascript实现时间转换为多少天前
//实现时间转换,这篇文章发布时间为 2016/1/20 19:59:30 文章发表时间戳为:1453291170000于:11月前function getDateDiff(dateTimeStamp ...
- wpf 遍历控件及其值
/// <summary> /// 遍历控件及其值 /// </summary> /// <param name="uiControls">界面 ...
- 通过设置CSS属性让DIV水平居中
通过设置CSS属性让DIV水平居中 ---------------------- <html> <head> <title></title> <m ...
- Swift_String的操作
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 24.0px Menlo; color: #4dbf56 } p.p2 { margin: 0.0px 0. ...