妙妙题
CF369E Valera and Queries
题意简述
给定
思路
正难则反。
对于每次询问的点集,我们考虑以其为分割点,转化为一条条线段。例如:
转化完成后按左端点从大到小排序,用树状数组统计答案即可。
P6564 [POI2007] 堆积木KLO
题意简述
有一串数列
思路
我们设
最后一个条件转化后即为
因此,我们将整个序列以
P2757 [国家集训队] 等差子序列
题意简述
给定一个排列,判断一个序列中是否有长度大于等于
思路
首先我们可以将条件转换为:是否有一个长度为
我们考虑从左到右扫描序列,记录下每一个之前扫描过数的位置,那么只要没有关于当前这个数对称,即存在一个长度为
CF19D Points
这种题都不会做,我是不是该退役了
题意简述
有
- 加入一个点
- 删除一个点
- 查询在点
严格右上角的,横坐标最近的,如有多个取纵坐标最近的点的坐标。
保证所有操作合法,即:不会有重复的点,不会删除不存在的点。
思路
一开始想成树套树了,死活做不出来……
首先很显然,坐标需要离散化然后就不会了。
我们注意到,查询的点的第一要求是横坐标最近,那么在查询的时候,我们只需要找到最靠左的横坐标,使得它有点在查询的点的右上方即可。我们建一颗线段树,维护横坐标在这个区间内的点的纵坐标的最大值(最开始都是
1 | il int query(int p, int x, int y) { |
时间复杂度为
ABC219F Cleaning Robot
题意简述
懒得化简了,直接复制了洛谷翻译。
一个清扫机器人被放置在无限扩展的二维网格的方格
给定了一个由四种类型的字符 L
、R
、U
、D
组成的字符串程序。
机器人根据给定的程序,依次读取每个字符,并针对每个字符采取以下行动:
- 将机器人的当前位置设为方格
- 根据读取的字符执行以下移动:
- 当读取
L
时:向左移动到方格。 - 当读取
R
时:向右移动到方格。 - 当读取
U
时:向上移动到方格。 - 当读取
D
时:向下移动到方格。
给定一个由 L
、R
、U
、D
组成的字符串
一旦机器人访问过的方格(包括机器人的初始位置
请输出在机器人执行程序结束后,被清扫的方格的数量。
思路
一看到这题的数据范围,我们可以立马发现:暴力是没有前途的废话。
我们发现,每次循环过一次
答案不太好想:我们把循环的左下角看作起点(如果不是左下角,那就旋转它!),将每个点视作在一条斜率为std::set
存储经过的位置,用 std::map
存储每条线段上有哪些点,时间复杂度为
注意处理
CF940F Machine Learning
题意简述
给定一个数组
- 修改一个位置的值
- 查询
这段区间内元素出现次数的 。
思路
看到对一些区间进行与出现次数相关的查询以及数据范围,我们不难想到带修莫队的做法。那怎么查找出现次数的
视
P4211 [LNOI2014] LCA
题意简述
(我就直接复制题面了)
给出一个
一个点的深度定义为这个节点到根的距离
设
有
思路
这道题要用到我一个不会的经典套路:两个点之间 lca 的深度,就是在其中一个点到根节点的路径上整体加
我们注意到每次要求的是一段连续区间与某个点的 lca 深度之和,我们不难想到对这个区间差分(为什么我想不到),直接从
将询问离线下来后树剖 + 线段树即可,时间复杂度为
[AGC040C] Neither AB nor BA
题意简述
给定一个正偶数A
,B
,C
,组成的,能够被以下方式完全删除的字符串个数,对
删除方式:删除两个相邻的,不是 AB
或 BA
的字符。
思路
这道题要用到一个 Trick:奇偶染色(我瞎胡的名字)。具体的,我们对于一个假想的字符串A
换成 B
,B
换成 A
,那么删除条件就转换为了:不能是两个 A
或 两个 B
一起删除。我们设 A
的个数为B
的个数为C
的情况下,最后会剩下C
的个数为
[AGC052B] Tree Edges XOR
题意简述
给你一棵有
将与这条边有公共点的所有边的边权都异或上这条边的边权,求能否把所有的
思路
首先我们手玩一下,发现什么是不容易变的?就是一条路径的异或和,只要一个端点不是选定的那条边的一个端点,那么异或和就是不变的。那么我们用上一个经典(真的经典吗?)Trick:将边权转为点权。但这里不是简单的一一对应,而是将一个点的点权设为从根到这个点的路径和,那么一条路径的异或和就被转化为了两个端点的权值的异或。我们继续手玩,发现这样一个事实:对于一条边的操作,相当于交换两个点的点权。好,现在你兴冲冲的按照这个去写,判断两棵树的点权集合是否相等,尽管你感觉有些不对劲。一交,好,WA 了。哪里不对劲?在于根节点:它的权值应该保持为
现在该这么处理?我们仔细思考一下为什么根节点是特殊的。答案是显然的(真的吗):因为它没有向上的边。这并不好办,我们在它上面接个虚拟节点不就是了?那么现在的问题是:这个点到根节点的边权应该是多少?我们考虑一下这条边对每个点的点权的影响,其实就是都异或上一个边权。因为
CF1641D Two Arrays
题意简述
给定
思路
做不出来,鉴定为:题做少了。
首先注意到总的数组个数很少,但值域很大,显然首先要离散化。然后我们发现可以使用 std::bitset
来记录每个数字在哪几个序列中出现过,时间复杂度为std::bitset
里统计出现位置,小于
CF618F Double Knapsack
题意简述
给定两个长为
思路
妙妙构造题。
我们注意到值域等于大胆猜测一定有解(虽然确实一定有解)对两个序列做两个前缀和。我们假设
对于
P4587 [FJOI2016] 神秘数
题意简述
定义一个可重集的神秘数为不可以被集合内元素累加表示出来的最小的数。现在给你一个长度为
思路
很有意思的一道题。
我们先不考虑在序列上的询问,想想给了你一个可重集,我们如何求出这个可重集的神秘数。我从小到大加入数字,假如当前可以表示的数的范围是
CF342E Xenia and Tree
题意简述
给定一棵
思路
万物皆可根号分治,记录以下这个套路。
我们把
QOJ 1271 In Search of Gold
题意简述
思路
打模拟赛时遇见的题目,感谢 qyzy 大佬 教我做法,感觉这种二分套 dp 的思路还挺有用的,特此记录下来。
我们首先考虑二分半径长度,那么就把问题转化成了一个判定性问题。我们设
1 | void dfs(int u, int fa, i64 x) { |
最终有解的话,只需要判定
[AT_CF_2018_Final_I] Homework
题意简述
给定
思路
我们先来考虑一个更广为人知的问题:如果时间已经确定,那么能得到的分数的最大值是多少?这就是 P3188 。但那道题的数据范围更小,这迫使我们研究这道题与 P3188 的不同之处:时间的值一定正好是
P7482 不条理狂诗曲
题意简述
给定一长为
思路
我们考虑分治。
对于一个区间
表示从 向左一直到 ,在可以选择 的情况下能选择的和的最大值。 表示从 向右一直到 ,在可以选择 的情况下能选择的和的最大值。 表示从 向左一直到 ,在不可以选择 的情况下能选择的和的最大值。 表示从 向右一直到 ,在不可以选择 的情况下能选择的和的最大值。
那么对于一个这样的区间
P6845 [CEOI2019] Dynamic Diameter
题意简述
有一颗
本题强制在线
思路
好妙的题啊。
我们考虑两点之间距离的表达式:
CF280D k-Maximum Subsequence Sum
题意简述
给定一个长度为
单点修改。
询问区间
内选出至多 个互不相交的子段和的最大值。
思路
小清新数据结构题。
注意到
- 标题: 妙妙题
- 作者: Floze3
- 创建于 : 2024-08-06 18:55:35
- 更新于 : 2024-11-19 10:36:04
- 链接: https://floze3.github.io/2024/08/06/interesting-problems/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。