前言

题目链接:洛谷

题意简述

给出序列 \(a_1 \ldots a_n\) 和常数 \(l \leq n\),定义:

\[\operatorname{dis}(i, j) = \sum _ {k = 0} ^ {l - 1} [a_{i + k} \neq a_{j + k}] \qquad (i, j \in [1, n - l + 1])
\]

每次询问一个 \(k\),求对于所有 \(i \in [1, n - l + 1]\),求 \(\sum \limits _ {j \neq i} [\operatorname{dis}(i, j) = k]\)。

题目分析

暴力不用说,考虑如何优化。这类问题我们思考能不能省略重复的计算。例如,对于 \(l_1 \sim r_1\) 和 \(l_2 \sim r_2\) 的 \(\operatorname{dis}\) 已经求出,那么对于 \(l_1 + 1 \sim r_1 + 1\) 和 \(l_2 + 1 \sim r_2 + 1\) 的 \(\operatorname{dis}\) 只需要在原来基础上减去 \([l_1 \neq l_2]\),再加上 \([r_1 + 1 \neq r_2 + 1]\)。是 \(\Theta(1)\) 的。

具体地讲,对于这两个区间,它们的差值的可能性是 \(\Theta(n)\) 的,我们枚举这个差值,然后将这两个区间向右平移,用上述算法计算,并累加。注意到这样会不重不漏地统计到每一个区间的答案。时间复杂度 \(\Theta(n ^ 2)\)。

另外,由于特殊的空间限制,不妨将询问离线并离散化,空间复杂度就降到了 \(\Theta(nq)\)。

代码

略去了快读快写。

#include <cstdio>
#include <algorithm>
using namespace std; int n, m, q, val[10010];
int cnt[110][10010];
int qry[110], rq[110], who[10010]; signed main() {
fread(buf, 1, MAX, stdin);
read(n), read(m);
for (int i = 1; i <= n; ++i) read(val[i]);
read(q);
for (int i = 1; i <= q; ++i) read(qry[i]), rq[i] = qry[i];
sort(rq + 1, rq + q + 1);
for (int i = 1; i <= q; ++i) who[rq[i]] = i;
who[m + 1] = q + 1;
for (int i = m; i >= 0; --i) !who[i] && (who[i] = who[i + 1]);
for (int i = 1; i + m <= n; ++i) { // 两个区间的差
int tot = 0;
for (int j = 1; j <= m; ++j) tot += val[j] != val[j + i];
for (int l1 = 1, r1 = m, l2 = 1 + i, r2 = m + i; r2 <= n; ++l1, ++l2, ++r1, ++r2) {
++cnt[who[tot]][l1], ++cnt[who[tot]][l2];
tot -= val[l1] != val[l2];
tot += val[r1 + 1] != val[r2 + 1];
}
}
for (int i = 1; i <= q; ++i)
for (int j = 1; j + m - 1 <= n; ++j)
cnt[i][j] += cnt[i - 1][j];
for (int i = 1; i <= q; ++i) {
for (int j = 1; j + m - 1 <= n; ++j)
write(cnt[who[qry[i]]][j]), putchar(' ');
putchar('\n');
}
fwrite(obuf, 1, o - obuf, stdout);
return 0;
}

后记 & 反思

考虑重复计算并优化是关键。另外,枚举两个区间的位置关系,并做到不重不漏的统计也是值得注意的。

[CEOI2018] Lottery 题解的更多相关文章

  1. BZOJ5443:[CEOI2018]Lottery

    我对状态空间的理解:https://www.cnblogs.com/AKMer/p/9622590.html 题目传送门:https://www.lydsy.com/JudgeOnline/probl ...

  2. bzoj5000+的洛谷题号

    前言 闲得没事把 bzoj5000+ 在 Luogu 上可找到的题面整理了一下-- 对于我,bzoj 连账号都没有,所以肯定是不清楚 bzoj 题目总数的--因此其实就是手动翻查. 工作量很大,基本不 ...

  3. UVA10325 The Lottery(容斥原理)

    题意: 给n,m,和m个数(k1~km).求1~n中有多少个数不是(k1~km)中任意一数的倍数. 题解: 容斥模板题.反面考虑,a的倍数有n/a个:既是a,也是b的倍数,即lcm(a,b)的倍数有n ...

  4. EX14 彩票中奖 (lottery.pas/c/cpp)

    [题目描述]小明想试试运气去购买彩票,所以他开始研究彩票大乐透的玩法:超级大乐透是指由购买者从01—35共35个号码中选取5个号码为前区号码,并从01—12共12个号码中选取2个号码为后区号码组合为一 ...

  5. uva - The Lottery(容斥,好题)

    10325 - The Lottery The Sports Association of Bangladesh is in great problem with their latest lotte ...

  6. 浙大pat 1011题解

    With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excite ...

  7. upc组队赛5 Ingenious Lottery Tickets【排序】

    Ingenious Lottery Tickets 题目描述 Your friend Superstitious Stanley is always getting himself into trou ...

  8. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  9. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  10. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

随机推荐

  1. HttpServletRequest获取header参数 sign

    HttpServletRequest获取header参数 sign //从请求头中获取参数 private static Map<String, String> getHeaders(Ht ...

  2. java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 2 path $

    java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 2 path $ pack ...

  3. Linux chmod -bash: ./xx.sh: Permission denied的解决方案

    Linux -bash: ./xx.sh: Permission denied的解决方案启动tomcat命令:./startup.sh之后提示-bash: ./startup.sh: Permissi ...

  4. iOS:长图切割并转为动画gif——精灵表单sprite Sheet的转化

    iOS:长图切割并转为动画gif--精灵表单sprite Sheet的转化 通常的,iOS显示gif可以将文件转为NSData后再对其进行解析,通过CADisplayLink逐帧进行提取.播放,判断N ...

  5. 在SMT32程序HEX文件中加入固件版本信息

    将固件版本信息定义成一个常量存放在程序中,需要的时候可以通过串口等接口查询代码版本信息,另一种,是利用编译器的语法,将固定的信息保存到某地. #define VERINFO_ADDR_BASE (0x ...

  6. 全志科技T3国产工业评估板规格书(四核ARM Cortex-A7,主频1.2GHz)

    1 评估板简介 创龙科技TLT3-EVM是一款基于全志科技T3处理器设计的4核ARM Cortex-A7高性能低功耗国产评估板,每核主频高达1.2GHz,由核心板和评估底板组成. 评估板接口资源丰富, ...

  7. 继续我们的复习之路——webapi

    前面断更几天是因为在住安心复习DOM BOM的内容 不得不说 还得是DOM 在这一章节的复习内容中  涌现出了很多又代表意义 经典的一些小案例 而且 还是有些难度的 有一两个我反正是自己独立完成不了 ...

  8. QEMU + Vscode + Arm Arch's Linux调试小记

    QEMU + Vscode + Arm Arch's Linux调试小记 ​ 前几天看到了一篇讲授如何调试ARM Linux内核的文章,这里现在记录一下调试ARM Linux内核的办法 下载QEMU ...

  9. NewStarCTF 2023 week1

    NewStarCTF 2023 WEEK1|CRYPTO brainfuck http://bf.doleczek.pl/ flag{Oiiaioooooiai#b7c0b1866fe58e12} C ...

  10. [HDCTF 2023]BabyMisc

    BabyMisc ...脑洞坑题(如果7z密码不是那一串超长字符串真不至于0解) 先打开Script.zip,随便打开一个文件夹,得到的是pxx的文件,内容为16进制字节.猜测pxx为对应字节的位置 ...