rmq

2018"百度之星"程序设计大赛

≡放荡痞女 提交于 2021-02-15 17:03:29
调查问卷 Accepts: 1546 Submissions: 6596 Time Limit: 6500/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Problem Description 度度熊为了完成毕业论文,需要收集一些数据来支撑他的论据,于是设计了一份包含 m m 个问题的调查问卷,每个问题只有 'A' 和 'B' 两种选项。 将问卷散发出去之后,度度熊收到了 n n 份互不相同的问卷,在整理结果的时候,他发现可以只保留其中的一部分问题,使得这 n n 份问卷仍然是互不相同的。这里认为两张问卷是不同的,当且仅当存在至少一个被保留的问题在这两份问卷中的回答不同。 现在度度熊想知道,存在多少个问题集合,使得这 n n 份问卷在只保留这个集合的问题之后至少有 k k 对问卷是不同的。 Input 第一行包含一个整数 T T,表示有 T T 组测试数据。 接下来依次描述 T T 组测试数据。对于每组测试数据: 第一行包含三个整数 n n, m m 和 k k,含义同题目描述。 接下来 n n 行,每行包含一个长度为 m m 的只包含 'A' 和 'B' 的字符串,表示这份问卷对每个问题的回答。 保证 1 \leq T \leq 100 1 ≤ T ≤ 1 0 0, 1 \leq n \leq

Codeforces Round #466

为君一笑 提交于 2021-02-15 06:22:32
A. Points on the line 题意 给定一条直线上$n$个点,要求去掉最少的点,使得直线上相距最远的两个点的距离$\leq d$. 思路 枚举长度为$d$的区间。 Code #include <bits/stdc++.h> #define F(i, a, b) for (int i = (a); i < (b); ++i) #define F2(i, a, b) for (int i = (a); i <= (b); ++i) #define dF(i, a, b) for (int i = (a); i > (b); --i) #define dF2(i, a, b) for (int i = (a); i >= (b); --i) using namespace std; typedef long long LL; int a[110]; int main() { int n, d; scanf("%d%d", &n, &d); F(i, 0, n) { int x; scanf("%d", &x); ++a[x]; } F2(i, 1, 100) a[i] += a[i-1]; int ans = min(a[100]-a[d], a[99-d]); F(i, 1, 100-d) { int l = i, r = i+d; ans = min(ans, a[l

ZJOI2018R2游记

允我心安 提交于 2021-02-13 08:42:18
这次ZJOI在余姚 从4.23到4.26 4.23-4.25讲(ge)课(mo),4.26考试 我们学校其他人都去隔膜了 但是我前3天只能苦逼的参加期中考试 4.25下午考完赶去余姚 4.26考试 4.26早上 我来到余姚中学 发现我的考场”社区机房“这里没有 问了若干同学 都不知道在哪里 我打电话给同校同学和老师 都不接电话 唯一一个接电话的yjs居然在南京没来ZJOI 我非常慌 但是之前一个我问的不认识的同学居然查到了跑来找我 告诉我位置 非常感动 我快到考场时遇到yjz csl wsy遂同行 到了考场 差点迟到 (结果发现我校其他人都因为早上看电影迟到了0.5h) 先看t1 不太会 肝了半天 还是不太会只好先写10分继续肝 突然发现旁边人写了好长 然后好像还过了 再看他pdf好像是t2的题面 于是改肝t2 想了1min然后会了 就是对于每个ai 它能更新到的肯定是一个区间 我们二分它的左右端点 以左端点为例 假设我们二分出来这个点为x 我们只需要判断是否在[k*2-a[i],a[i])里所有的源点更新x点 都比a[i]来更新差 可以用rmq解决 要注意一个特别情况就是2个源点距离同一个点距离和点数都相同 只能算一个 O(nlog 2 n) 结果我写了一下发现没过大样例??? 然后发现我左边的人其实只写了20分…… 我调了3h 发现我的错居然是 st表把一个+1写成-1了???

ACM/IOI 国家队集训队论文集锦

你离开我真会死。 提交于 2021-01-10 10:12:47
转自:https://blog.csdn.net/txl199106/article/details/49227067 国家集训队1999论文集 陈宏:《数据结构的选择与算法效率——从IOI98试题PICTURE谈起》 来煜坤:《把握本质,灵活运用——动态规划的深入探讨》 齐鑫:《搜索方法中的剪枝优化》 邵铮:《数学模型的建立、比较和应用》 石润婷:《隐蔽化、多维化、开放化——论当今信息学竞赛中数学建模的灵活性》 杨帆:《准确性、全面性、美观性——测试数据设计中的三要素》 周咏基:《论随机化算法的原理与设计》 国家集训队2000论文集 陈彧:《信息学竞赛中的思维方法》 方奇:《动态规划》 高寒蕊:《递推关系的建立及在信息学竞赛中的应用》 郭一:《数学模型及其在信息学竞赛中的应用》 江鹏:《探索构造法解题模式》 李刚:《动态规划的深入讨论》 龙翀:《解决空间规模问题的几种常用的存储结构》 骆骥:《数学模型的建立和选择》 施遥:《人工智能在围棋程序中的应用》 肖洲:《数据结构的在程序设计中的应用》 谢婧:《规模化问题的解题策略》 徐串:《论程序的调试技巧》 徐静:《图论模型的建立与转化》 杨江明:《论数学策略在信息学问题中的应用》 杨培:《非最优化算法初探》 张辰:《动态规划的特点及其应用》 张力:《类比思想在解题中的应用》 张一飞:《冗繁削尽留清瘦——浅谈信息的充分利用》

【赛后总结+部分题解】2019中国大学生程序设计竞赛(CCPC)

浪尽此生 提交于 2021-01-04 08:03:07
赛后总结:   T:今天状态一般,甚至有点疲惫。然后12点比赛开始,和队友开始看题,从最后往前面看,发现数学题公式看不懂。然后发现队友已经双开做1001和1006了,我看着1007有人A,开始做1007。看了一会发现这是一个简单签到题,构造一下就完事了。然后一遍A,结束。在他们看1008的时候,我回去看1002和1003,1002的题意没看清楚,队友说的也有点模糊,然后不知道怎么下手。开始看1003,因为A的人真的好多呜呜呜。从AC自动机一直re转为后缀自动机,然后不会。结束了。今天对队伍的贡献太少了,复杂度也没算好,一直在re。做题策略还是有点问题,不该纠结自己不会的领域。然后也有很多不会的知识需要去弥补。 P:lucky,从中间看到的第一题就是一道签到题。但由于读题不完整,在输出格式上WA了2-3次。所幸,过了。然后,就去看了钓鱼那题,将题意告诉了队友,队友有思路直接开做,我负责着错误样例。期间,我考虑到的一个点跟队友说,队友无法理解,我就想着自己打打看。AC后,才发现,队友这次想复杂了。接着的1002,1003,只能说自己的知识储备不够,大概从题目能够知道用了什么算法,但无法解决。   J:今天状态贼差,1008WA了七八次还是没A出来,结果是我想复杂了,队友一下就A了,还是太弱了,1002是线段树,但是不知道该怎么做,看来应该做一下线段树专题了。 部分题解: 1001 ^&

[科技] 假装是ETT的ETT

社会主义新天地 提交于 2021-01-02 19:18:07
[科技] 假装是ETT的ETT [科技] 假装是ETT的ETT Codechef 的 April Challenge 2019 Division 1 的 Sonya and Queries 这题的$45$分部分分,似乎是一个出栈入栈序$ETT$,看着似乎还挺好的,就写了写。那么这里就讲一讲这个假装是$ETT$的$ETT$。 $ETT$,全称$Euler-Tour-Tree$。实际上真实的$ETT$是用树上的欧拉回路来写的,但是也有这种省略欧拉回路为入栈出栈序列的$ETT$,个人感觉可能后者更容易实现,但是与前者的不同就是似乎后者不能换根,但是可以进行链上操作……如果要学欧拉回路的$ETT$的话可以看 这个文章 。 首先出栈入栈序列,或者叫做括号序这个东西,用处还是挺多的,比较常见的就是用在$RMQ\ LCA$的问题上,可以做到$O(nlogn)$预处理,$O(1)$查询$LCA$的优秀复杂度。其主要的性质就是对于每一个点的出栈与入栈时间$in[x]$和$out[x]$,都有$[in[x], out[x]]$中所有的节点都是$x$的子树中的节点。这个还是比较显然的,这也是$ETT$能够在某些地方代替$LCT$维护动态树的基础。 于是我们尝试用括号序$ETT$实现一些$LCT$的操作。 首先是最基础的$Link / Cut$: 考虑到$Link / Cut$就是把$x$的子树和$x

POJ 3264.Balanced Lineup-RMQ(ST)详解

被刻印的时光 ゝ 提交于 2020-12-12 22:42:41
先写一道水题的博客,为后面要写的博客做一个铺垫。 ヾ(◍°∇°◍)ノ゙ RMQ(Range Minimum/Maximum Query),即区间最值查询,对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值。 时间复杂度: 1、朴素(即搜索),O(n)-O(qn) online。 2、 线段树 ,O(n)-O(qlogn) online。 3、ST(实质是 动态规划 ),O(nlogn)-O(q) online。 ST算法(Sparse Table),以求最大值为例,设d[i,j]表示[i,i+2^j-1]这个区间内的最大值,那么在询问到[a,b]区间的最大值时答案就是max(d[a,k], d[b-2^k+1,k]), 其中k是满足2^k<=b-a+1(即长度)的最大的k,即k=[ln(b-a+1)/ln(2)]。d的求法可以用 动态规划 ,d[i, j]=max(d[i, j-1],d[i+2^(j-1), j-1])。 传送门: 一篇写的容易理解的博客 2/21/2018 5:12:00 PM -------------------------------------------------------分割线-------------------------------------------------------

一类树上问题的解决办法

感情迁移 提交于 2020-12-05 01:41:41
[TOC] 本文参考自 梁晏成《树上数据结构》 ,感谢他在雅礼集训的讲解。 转化成序列问题 dfs序 按照 $dfs$ 的入栈顺序形成一个序列。 例如对于这棵树 它的 $dfs$ 序就是 $1~2~3~4~5~6~7~8$ 。(假设我遍历儿子是从左到右的) 树链剖分的运用 对于这个我们常常配合 树链剖分 来使用。 这样对于一个点,它的子树编号是连续的一段区间,便于做子树修改以及查询问题。 重链上所有节点的标号也是连续的一段区间。 所以我们可以解决大部分链或子树修改以及查询的问题,十分的优秀。 也就是常常把树上问题转化成序列问题的通用解法。 括号序列 $dfs$ 时候,某个节点入栈时加入左括号,出栈时加入右括号。 也就是在 $dfs$ 序旁边添加括号。 同样对于上面那颗树 。 为了方便观看,我们在其中添入一些数字。 它的括号序列就是 $(1(2)(3(4)(5(6(7))))(8))$ 。 求解树上距离问题 这个可以对于一些有关于树上距离的问题有用,比如 BZOJ1095 [ZJOI2007] Hide 捉迷藏 (括号序列 + 线段树) 也就是对于树上两点的距离,就是他们中间未匹配的括号数量。这个是很显然的,因为匹配的括号必定不存在于他们之间的路径上,其他的都存在于他们的路径上。 也就是说向上路径的括号是 $)$ 向下路径的括号就是 $($ 。 树上莫队转化成普通莫队 令 $L_x$

LCA ST表

落花浮王杯 提交于 2020-12-02 07:05:21
// LCA // ST表 在线 #include<iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #define maxn 500001 using namespace std; int n,m,cnt,root,head[maxn],depth[maxn]; int order[ 2 *maxn],first[maxn]; // order[x]dfs中第x次遍历的点(重复) first[x]记录点x在dfs中首次遍历顺序(不重复) int lg[ 2 *maxn],f[ 2 *maxn][ 21 ]; // lg[x]记录log2x的向下取整值 f[x][k]表示包含x点共2^k个点中最小值 struct uio{ int next,to; }edge[ 2 * maxn]; void add( int x, int y) { edge[ ++cnt].next= head[x]; edge[cnt].to = y; head[x] = cnt; } void dfs( int x, int pre) // pre为上次遍历过节点 防止走重 { order[ ++cnt]= x; first[x] = cnt; for

LOJ129 Lyndon 分解

风流意气都作罢 提交于 2020-11-06 04:47:04
Lyndon 分解 样例 样例输入 1 ababa 样例输出 1 2 4 5 样例输入 2 bbababaabaaabaaaab 样例输出 2 1 2 4 6 9 13 18 样例输入 3 azAZ0129 样例输出 3 2 4 8 数据范围与提示 $1\le |s| \le 2^{20}$ OZY 的题解 冷门东西,但是今天考到了,做个记录。 记号 $s[l : r]$ 表示字符串$s$ 从第$l$ 个字符到第$r$ 个字符的子串(从$1$ 开始标号),$|s|$ 表示$s$ 的长度。 当$l = 1$ 时$s[l : r]$ 简写为$s[: r]$ ,表示$s$ 的一个前缀。当$r = |s|$ 时$s[l : r]$ 简写为$s[l :]$ ,表示$s$ 的一个后缀。 $st, s +t$ 表示两个字符串$st$ 的拼接,$s^k$ 表示$k$ 个$s$ 拼起来,特别地,$s^{\infty}$ 表示$s$ 的无限循环。 定义 Lyndon 串 :如果一个串$s$ 满足$s = \min{s[i :]|1 \le i \le |s|}$ 那么我们称串$s$ 为Lyndon 串。定义字符串的大小关系就是字典序的大小关系 性质 当$u,v$均为Lyndon Words,且$u<v$,那么$uv$也是一个Lyndon Words。 证明还是比较显然的,这里就不证了 Lyndon