Day-2【游记】
8:00
心情平稳,反正还是啥都不会
开T1,发现是傻逼题,做做做
然后发现自己傻逼,做法假了,之后又重构
之后拍拍拍
10:30
终于跑过自己造的数据了,我心情愉悦,心想今天怎么着分数还是三位数
这样想着,我拿题面给的样例跑了一下,不出所料,WA
我并没有心慌,因为这种小样例WA了往往能查出来,而且能发现代码潜在的bug
好嘞,我们来看看这个方案的花费是多少
(1+2+2=5)
卧槽样例给的是 (6) 啊,我不会hack了吧...
赶紧问问兔队
哦,原来是...
我TMD读错题了!
这还了得?合着我2h20min啥事没干呗...
++可不能没分啊,我赶紧去看T2,暴力 (O(n^3))
一看卷积式,不管了拿NTT碾,(O(n^2log n))
调出来已经是11:30了,然后我赶紧回去打T1
急急慌慌中成功没有看出来T2 (O(n^2)) 的做法,而这正是推出正解所需要的
然后去干T1,然后发现还是傻逼题,很快的打好
最后要做的就是输出方案了!
卧槽那个天杀的出题人想出来要输出方案的
发现自己完全不会输出方案啊...
最后还是使劲做了做,至少题面的样例过了
T3一看不可做,部分分似乎也不好做
放弃.jpg
结束,估分 ([8,100]+[20,60]+0=[28,160])
拿满能很高,FST能很惨
我更相信我会FST,因为T1的输出方案是真的要命
14:30
出分,好家伙挂成狗了,(10+35+0=45)
失去高光.jpg
然后有意思的是T2直接输出998244352然后-rand()能 (75)
自己的T1真就nmd全部挂在输出方案上了
今天真就要命round
自己还是太弱了啊...
Day-2【题解】
我已经完全理解了 DFS 序线段树(segtree)
CF的这题跟T1差不多(输出方案的形式与判定不同),于是我们直接拿这题来做
Q:原题呢?
A:算了不管了
完全没有想到最小生成树
我一开始用的树形dp,比较简单,但是方案输出毒瘤,不做叙述
事实上根据题目名称我们可以知道利用dfs序
怎么利用呢?根据树链剖分时的思想,dfs序可以将树上的子树变成序列的形式
而这题正是序列操作
于是我们将每个点控制的子树化为差分,并从 (l) 向 (r+1) 连边
之后求MST
在求MST的过程中,对于每个能加入集合的权值,循环遍历有没有与其相等并且也可以加入集合的,将其也累计至答案中
然后本题就做完了
我已经完全理解了字符串哈希(strhash)
状态:Accepted | 难度:Easy+/Medium-
因为T1看错题面而没思考这题,说到底还是我菜
首先对于
不要被这个卷积式所迷惑,事实上,后面是可以 (O(n^2)) 枚举,然后 (O(1)) 计算的
具体的,设 (h_i) 为从开头到第 (i) 个位置形成的子串的hash值
(s_{l,r}) 表示从第 (l) 个位置到第 (r) 个位置上的字符连成的字符串
那么对于一个子串 (s_{l-1,r}),它的hash值为 (h_r- ext{base}^{r-l}h_l)
对于随机的 (Theta(n^2)) 个变量,其最大值的期望在 (m-dfrac{m}{n^2}) 附近
因此我们可以枚举模数,然后判断是否可行
(h_r- ext{base}^{r-l}h_l=x)
这东西很好处理,类似BSGS,移项然后乘一乘,得:
( ext{base}^{n-r}(h_r-x)= ext{base}^{n-l}h_l)
插入hash表然后查询即可,因为并没有在线提交地址所以放上代码
卡nm的常数啊(
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<unordered_map>
#define N 2000010
#define M 5001
#define INF 1100000000
#define Kafuu return
#define Chino 0
#define R register
#define C const
#define U unsigned
#define fx(l,n) inline l n
#define set(l,n,ty,len) memset(l,n,sizeof(ty)*len)
#define cpy(f,t,ty,len) memcpy(t,f,sizeof(ty)*len)
using namespace std;
C int mod=998244353,base=2333333;
fx(int,gi)(){
R char c=getchar();R int s=0,f=1;
while(c>'9'||c<'0'){
if(c=='-') f=-f;
c=getchar();
}
while(c<='9'&&c>='0') s=(s<<3)+(s<<1)+(c-'0'),c=getchar();
return s*f;
}
int T,len,bpow[N],ha[N],bg[N],ans,i,o;
char s[N];
unordered_map<int,bool>hs;
bool can;
signed main(){
freopen("strhash.in","r",stdin);
freopen("strhash.out","w",stdout);
T=gi();bpow[0]=1;
for(R int i=1;i<2000001;i++) bpow[i]=1ll*bpow[i-1]*base%mod;
while(T--){
scanf("%s",s);
len=strlen(s);ans=0;
ha[0]=s[0]-'a'+1;
for(i=1;i<len;i++){
ha[i]=(1ll*ha[i-1]*base%mod+(s[i]-'a'+1))%mod;
bg[i]=1ll*ha[i]*bpow[len-i]%mod;
}
if(len<=4000){
for(i=0;i<len;i++){
for(o=i;o<len;o++){
ans=max(1ll*ans,(ha[o]-1ll*(i-1<0?0:ha[i-1])*(o-i+1<0?0:bpow[o-i+1])%mod+mod)%mod);
}
}
printf("%d
",ans);
} else {
for(i=mod-1;i;i--){
hs.clear();can=0;
for(o=0;o<len;o++){
if(hs[1ll*(ha[o]-i+mod)*bpow[len-o]%mod]==1){
can=1;break;
}
hs[bg[o]]=1;
}
if(can){
printf("%d
",i);break;
}
}
}
}
}
我已经完全理解了多源 BFS(multbfs)
CodeForce *3500的题,暂时不可做
Orz tyy场切并吊打标算,唐椰叶yyds!
Day-2【补题】
补题的题解并不放在这里,具体来说,它放在了题目泛刷记录3