「Solution Set」 4.6 小记
P3964 [TJOI2013]松鼠聚会
首先小松鼠们对距离的概念是切比雪夫距离。
切比雪夫距离可以转化为曼哈顿距离。
切比雪夫距离原点为
然后这个正方形旋转一下再稍微放缩一下就可以变成这样:
我们发现正好对应曼哈顿距离为
于是我们可以总结出切比雪夫距离转曼哈顿距离的式子:
同时我们也可以总结出曼哈顿距离转切比雪夫距离的式子:
这道题要找一个点使得其他所有点到他的切比雪夫距离之和最小。我们转化成曼哈顿距离之后可以将两维分开计算。
对于
然后这样前缀和求一下就行
Submission
[ARC065E] へんなコンパス
这道题给的是曼哈顿距离。
曼哈顿距离不好求的地方在于两维加起来求和。而切比雪夫距离比较好的是只需要求
对于一个点,和他切比雪夫距离相等的就是两种情况。
或
我们枚举每个点,假如钦定
这样对
Submission
[ABC280G] Do Use Hexagon Grid 2
我们通过手玩(我玩了一个半小时没玩出来)可以得到一个点到原点之间的距离的定义:
然后我们发发现就是在一个大小为
我们转化之后可以钦定两维
这样显然会算重。我们用一些容斥原理,只需要减掉前两维在
Submission
[ABC280Ex] Substring Sort
给若干个字符串,求所有子串中的第
显著是板子题。
但是广义 SAM。
就是当
void add(char c)
{
int p=lst;
if(st[lst].ch.count(c))
{
int q=st[p].ch[c];
if(st[q].len==st[p].len+1) lst=q;
else
{
int clone=++tot; st[clone].len=st[p].len+1; st[clone].fa=st[q].fa;
st[clone].ch=st[q].ch;
while(p!=-1&&st[p].ch[c]==q) st[p].ch[c]=clone,p=st[p].fa;
st[q].fa=clone; lst=clone;
}
return;
}
int cur=++tot; st[cur].len=st[lst].len+1;
while(p!=-1&&!st[p].ch[c]) st[p].ch[c]=cur,p=st[p].fa;
if(p==-1) st[cur].fa=1;
else
{
int q=st[p].ch[c];
if(st[q].len==st[p].len+1) st[cur].fa=q;
else
{
int clone=++tot; st[clone].len=st[p].len+1; st[clone].fa=st[q].fa;
st[clone].ch=st[q].ch;
while(p!=-1&&st[p].ch[c]==q) st[p].ch[c]=clone,p=st[p].fa;
st[cur].fa=st[q].fa=clone;
}
}
lst=cur;
}
然后是求第
一种是跳 ch 。这样就是每次直接可最小的跳,不重复跳。每次加上这个状态表示的子串数量,这样就知道每种状态表示的子串的 lower_bound 的。
另外一种是取反,建后缀树。然后求出每种状态表示的位置,然后对后缀树上的儿子排序,之后按顺序遍历后缀树,就能知道每种状态表示的
Submission
P9169 [省选联考 2023] 过河卒
身败名裂.jpg
说句闲话,今天 cc0000 在小图灵数据上喜提全国最菜女队。
我们观察到棋盘大小为
然后我们发现这样可能成环。我不会判环。所以我们可以考虑逆向推,从必胜或必败状态推到初始状态。
我们用拓扑排序搜。
如果我们从状态 bfs ,所以
然后巨大卡常。
一个重要的优化就是状态里不用设此时红子还是黑子先走。因为我们可以通过当前的三个位置推到当前走了奇数步还是偶数步知道当前谁先走,这样省掉了一半状态。
写了 5k /jk
Submission
P5105 不强制在线的动态快速排序
我们可以考虑到重复的数字只有一个是有用的。所以本质还是个不可重集合。
然后我们考虑一段连续区间内的权值怎么计算。
我们先考虑从
相当于奇数的异或和。
相当于把最后一位的
就是
所以原式就是
这样一段区间
然后一段连续区间的就能求了。
我们可以用珂朵莉树维护线段,然后加加减减边界上的权值。再计算每个连续段的权值就行。
用珂朵莉树写细节有点多。
Submission
CF986C Willem, Chtholly and Seniorious
珂朵莉树就行。都是基本操作。
用我自己那个有病的珂朵莉树好像很麻烦。
Submission