SD省队集训day

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)

状态:Accepted | 难度:Medium

CF的这题跟T1差不多(输出方案的形式与判定不同),于是我们直接拿这题来做

Q:原题呢?

A:算了不管了

完全没有想到最小生成树

我一开始用的树形dp,比较简单,但是方案输出毒瘤,不做叙述

事实上根据题目名称我们可以知道利用dfs序

怎么利用呢?根据树链剖分时的思想,dfs序可以将树上的子树变成序列的形式

而这题正是序列操作

于是我们将每个点控制的子树化为差分,并从 (l)(r+1) 连边

之后求MST

在求MST的过程中,对于每个能加入集合的权值,循环遍历有没有与其相等并且也可以加入集合的,将其也累计至答案中

然后本题就做完了

我已经完全理解了字符串哈希(strhash)

状态:Accepted | 难度:Easy+/Medium-

因为T1看错题面而没思考这题,说到底还是我菜

首先对于

[h(s)=left(sumlimits_{i=1}^{|s|} ext{base}^{|s|-i}s_i ight)mod m ]

不要被这个卷积式所迷惑,事实上,后面是可以 (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)

状态:Unaccepted | 难度:Hard

Luogu链接

CodeForce *3500的题,暂时不可做

Orz tyy场切并吊打标算,唐椰叶yyds!

Day-2【补题】

补题的题解并不放在这里,具体来说,它放在了题目泛刷记录3

原文地址:https://www.cnblogs.com/zythonc/p/14726162.html