洛谷 P2056 采花 - 莫队算法
萧芸斓是 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
说明
对于100%的数据,1 ≤ n ≤10^5,c ≤ n,m ≤ 10^5。
(这题Codevs上也有,只不过,数据范围强制用O(nlog2n)的做法)
分块的数据范围,支持离线,O(1)进行更新,不用莫队还用什么?(我只是建立在降低思考难度和骗分上想的)
Code
/**
* luogu.org
* Problem#2056
* Accepted
* Time:1100ms
* Memory:14179k
*/
#include<iostream>
#include<fstream>
#include<sstream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<ctime>
#include<map>
#include<stack>
#include<set>
#include<queue>
#include<vector>
#ifndef WIN32
#define AUTO "%lld"
#else
#define AUTO "%I64d"
#endif
using namespace std;
typedef bool boolean;
#define inf 0xfffffff
#define smin(a, b) (a) = min((a), (b))
#define smax(a, b) (a) = max((a), (b))
template<typename T>
inline boolean readInteger(T& u) {
char x;
int aFlag = ;
while(!isdigit((x = getchar())) && x != '-' && x != -);
if(x == -) {
ungetc(x, stdin);
return false;
}
if(x == '-') {
aFlag = -;
x = getchar();
}
for(u = x - ''; isdigit((x = getchar())); u = u * + x - '');
u *= aFlag;
ungetc(x, stdin);
return true;
} typedef class Segment {
public:
int from;
int end;
int first;
int id;
Segment():from(), end(), first(), id() { } boolean operator < (Segment b) const {
if(first != b.first) return first < b.first;
return end < b.end;
}
}Segment; int n, c, q;
int m;
int *flo;
Segment* seg;
int *res;
int *counter; inline void init() {
readInteger(n);
readInteger(c);
readInteger(q);
flo = new int[(const int)(n + )];
seg = new Segment[(const int)(q + )];
res = new int[(const int)(q + )];
counter = new int[(const int)(c + )];
m = (int)sqrt(n + 0.5);
for(int i = ; i <= n; i++)
readInteger(flo[i]);
for(int i = ; i <= q; i++) {
readInteger(seg[i].from);
readInteger(seg[i].end);
seg[i].first = seg[i].from / m;
seg[i].id = i;
}
} inline void solve() {
sort(seg + , seg + q + );
int val, mdzz = ;
for(int id = ; id <= m; id++) {
val = ;
int l = , r = ;
memset(counter, , sizeof(int) * (c + ));
for(; mdzz <= q && seg[mdzz].first == id; mdzz++) {
while(r <= seg[mdzz].end) {
counter[flo[r]]++;
if(counter[flo[r]] == ) val++;
r++;
}
while(l < seg[mdzz].from) {
counter[flo[l]]--;
if(counter[flo[l]] == ) val--;
l++;
}
while(l > seg[mdzz].from) {
l--;
counter[flo[l]]++;
if(counter[flo[l]] == ) val++;
}
res[seg[mdzz].id] = val;
}
}
for(int i = ; i <= q; i++)
printf("%d\n", res[i]);
} int main() {
init();
solve();
return ;
}
洛谷 P2056 采花 - 莫队算法的更多相关文章
- 洛谷P2056 采花
P2056 采花 52通过 99提交 题目提供者shengmingkexue 标签云端↑ 难度省选/NOI- 时空限制1s / 128MB 提交 讨论 题解 最新讨论更多讨论 求助莫队为什么被卡 ...
- bzoj 3236: 洛谷 P4396: [AHOI2013]作业 (莫队, 分块)
题目传送门:洛谷P4396. 题意简述: 给定一个长度为\(n\)的数列.有\(m\)次询问,每次询问区间\([l,r]\)中数值在\([a,b]\)之间的数的个数,和数值在\([a,b]\)之间的不 ...
- 洛谷 P4396 (离散化+莫队+树状数组)
### 洛谷P4396 题目链接 ### 题目大意: 有 n 个整数组成的数组,m 次询问,每次询问中有四个参数 l ,r,a,b .问你在[l,r] 的区间内的所有数中,值属于[a,b] 的数的个 ...
- 洛谷P3245 [HNOI2016]大数(莫队)
题意 题目链接 Sol 莫队板子题.. 维护出每个位置开始的字符串\(mod P\)的结果,记为\(S_i\) 两个位置\(l, r\)满足条件当且仅当\(S_l - S_r = 0\),也就是\(S ...
- 洛谷P3246 [HNOI2016]序列 [莫队]
传送门 思路 看到可离线.无修改.区间询问,相信一定可以想到莫队. 然而,莫队怎么转移是个大问题. 考虑\([l,r]\rightarrow[l,r+1]\)时答案会怎样变化?(左端点变化时同理) \ ...
- 洛谷P4396 作业 [AHOI2013] 莫队
正解:莫队 解题报告: 传送门! 天呐太久没做莫队了连板子都认不出来了,,,所以复健下做下莫队的题目QAQ 就很板子鸭,和莫队板子比好像只有一个离散化,,,?就不讲了QAQ 等下直接放代码QAQ ov ...
- 洛谷P3246 序列 [HNOI2016] 莫队/线段树+扫描线
正解:莫队/线段树+扫描线 解题报告: 传送门! 似乎是有两种方法的,,,所以分别港下好了QAQ 第一种,莫队 看到这种询问很多区间之类的就会自然而然地想到莫队趴?然后仔细思考一下,发现复杂度似乎是欧 ...
- 洛谷P3245 大数 [HNOI2016] 莫队
正解:莫队 解题报告: 传送门 这题首先要发现一个结论,是这样儿的: 若p不是10的约数(即2和5) 时,当第i位到第n位组成的数%p==第j位到第n位组成的数%p,那么第i位到第j位上的数组成的数% ...
- P4113 [HEOI2012]采花 (莫队TLE)
思路 update 11.2 树状数组AC 本题莫队过不去,会TLE ----------------------- 但也是个不错的莫队练手题 ------------------------ 毕竟C ...
随机推荐
- CCCC L2-022. 重排链表
题解:直接list模拟,头尾两个指针,分别将头尾元素push到另一个list里面,输处输入方式同上一篇 坑:第一发卡了第二个样例,第二发卡了第4个,莫名其妙,所以把两个代码合起来,然后强行ac了. # ...
- Git:上传GitHub项目操作步骤
git教程:git详解.gitbook #首次上传步骤 首先在工程文件位置处右键git bash here 本地创建ssh key $ ssh-keygen -t rsa -C "your_ ...
- java进程和线程的区别
什么是进程,什么是线程系统要做一件事,运行一个任务,所有运行的任务通常就是一个程序:每个运行中的程序就是一个进程,这一点在任务管理器上面可以形象的看到.当一个程序运行时,内部可能会包含多个顺序执行流, ...
- qt——c++环境下qt编程,类的声明与构造
在c++中创建项目时,会生成以项目名字命名的QMainWindow,以及相应的头文件和CPP文件,作为主要窗口: 在项目中继续生成qt类时,比如类的名称是test,会自动生成一个test.h的头文件, ...
- 一次性从git远程仓库中克隆到本地。
自动化工具 一次性从git远程仓库中克隆到本地. import os # git操作 将远程repo克隆到本地 def git_clone_cd_pull(url): # 获取仓库名称 如fullsp ...
- 群用户通过微信小程序可以更好地协作了
今天,小程序向开发者开放了群ID的接口能力.简单地说,就是当你把小程序分享在群聊中,被点击后开发者可获取群ID和群名称,也方便更好地针对群场景提供个性化服务.不同的群有各自的群ID,那么这个新能力开发 ...
- 图结构练习——判断给定图是否存在合法拓扑序列(sdutoj)
#include<stdio.h>#include<string.h>int d[15],map[15][15],vis[15];int main(){ int i,j, ...
- 【Cocos2dx 3.3 Lua】触屏事件
cocos2dx 3.x触屏时间分为单点触摸和多点触摸: 单点触摸:(即只有注册的Layer才能接收触摸事件) 多点触摸点单用法(多个Layer获取屏幕事件): ...
- python 皮尔森相关系数
皮尔森理解 皮尔森相关系数(Pearson correlation coefficient)也称皮尔森积矩相关系数(Pearson product-moment correlation coeffic ...
- http协议基础(十)实体首部字段
1.定义 包含在请求和响应中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息 2.Allow 通知客户端能够支持的Request-URI指定资源的所有http方法:如果服务器接收到不支 ...