abc233
这场比赛编号是 233,好玩好玩
D - Count Interval
给出 \(n\) 个数,求有多少个连续段的和为 \(K\).
即求出 \((l,r)\) 的个数,\((l,r)\) 满足
\(1. 1\leq l\leq r\leq n\)
\(2. \sum\limits_{i=l}^{r} a_i=K\)
\(1\leq n\leq 2\cdot 10^5,\ |a_i|\leq 10^9,\ |K|\leq 10^{15}\)
考虑 \(\sum\limits_{i=l}^{r} a_i=\sum\limits_{i=1}^{r} a_i-\sum\limits_{i=1}^{l-1} a_i\) .
考虑用 \(\mathrm{map}\) 维护前缀和的数的数量即可.
时间复杂度 : \(O(n\log n)\)
空间复杂度 : \(O(n)\)
code
#include
using namespace std;
const int N=2e5+10;
int n;
long long k;
long long a[N];
mapcnt;
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>k;
for(int i=0;i>a[i];
for(int i=1;i
E - Σ[k=0..10100]floor(X/10k)
求 \(\sum\limits_{k=0}^{10^{100}}\lfloor \frac{X}{10^k}\rfloor\) .
\(1\leq X\leq 10^{500000}\)
这个式子相当于每次把这个数的最后一位删掉,得到 \(|X|\) 个数,然后把这些数相加.
这样肯定会 ttt,考虑答案中的第 \(i\) 位是原数位数中不大于 \(i\) 的所有加起来.
不能忘记考虑进位.
时间复杂度 : \(O(n)\)
空间复杂度 : \(O(n)\)
code
#include
using namespace std;
const int N=2e5+10;
int n;
long long k;
long long a[N];
mapcnt;
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>k;
for(int i=0;i>a[i];
for(int i=1;i
F - Swap and Sort
给出一个长度为 \(n\) 的排列 \(P\) .
给出 \(m\) 种操作. 第 \(i\) 种操作交换 \(P\) 中的第 \(a_i\) 个和第 \(b_i\) 个.
求是否能在不多于 \(5\cdot 10^5\) 次操作后排列有序.
如果能,给出方案.
\(1\leq n\leq 1000,1\leq m\leq \min(5\cdot 10^5,\frac{n(n-1}{2})\)
考虑 \(a_i\) 和 \(b_i\) 连边构图.
如果存在 \(i\) 和 \(P_i\) 不连通,那么肯定没有解.
对于一个连通块,保留一棵生成树就可以做到所有点都回到原本的位置上.
但是对于生成树的点操作的顺序是有讲究的. 考虑剥叶子,让位于叶子节点处的节点先通过操作回到原本的位置,然后再删掉这个节点.
操作方案即为 \(i\) 到 \(P_i\) 上的边依次 swap.
时间复杂度 : \(O(n^2)\)
空间复杂度 : \(O(n+m)\)
code
```cpp #include
code
```c++ #include21
.....................
.....................
...#.#...............
....#.............#..
...#.#...........#.#.
..................#..
.....................
.....................
.....................
..........#.....#....
......#..###.........
........#####..#.....
.......#######.......
.....#..#####........
.......#######.......
......#########......
.......#######..#....
......#########......
..#..###########.....
.........###.........
.........###.........
haha, Merry Christmas and Happy New Year !
Ex - Manhattan Christmas Tree
给出 \(n\) 棵圣诞树的位置. 给出 \(q\) 个询问.
每个询问问距离 \((x,y)\) 位置曼哈顿距离最近的第 \(k\) 个点.
\(1\leq n\leq 10^5,\ 1\leq q\leq 10^5,\ 0\leq x,y\leq 10^5,\) 圣诞树的坐标不相同.
考虑二分距离 \(d\) , 如果是曼哈顿距离,那么构成的图形是一个斜着的矩形,求这个范围内的点是不好求的.
此时,有一个 trick,就是把切比雪夫转化,相当于逆时针旋转 \(45\) 度之后坐标乘上 \(\sqrt 2\). 在曼哈顿距离下为 \((x,y)\) 的坐标会变成 \((x-y,x+y)\). 但是此时距离当前询问的点小于等于距离为 \(d\) 的位置是一个正方形. 这就非常惹人喜爱.
看到 \(x,y\) 在 \(0\) 到 \(10^5\) 之内,所以切比雪夫之后,\(x,y\) 在 \(-10^5\) 到 \(2\cdot 10^5\) 之内.
考虑建立主席树,线段树上维护横坐标,每次加入一行,多次单点修改,维护新的根节点.
查询的时候只需要区间询问两次做一个差即可.
时间复杂度 : \(O(n\log^2 x)\)
空间复杂度 : \(o(n\log n)\)
code
```cpp #includePowered by .NET 6 on Kubernetes