#include<5.2模拟赛>
namespace 赛时历程{
AM8:10 发题
AM8:15 看题
AM8:30 在T1的下边写上注释:区间长度如果是偶数,答案为0,否则答案为隔一个取一个;
证明也挺简单的。于是直接开始写了,很快就写完了。然后考虑怎么优化暴力。
似乎不能简单的区间操作,想想怎么处理隔一个的事情。算了先不想了,这都55分了,先看后边。
看了会儿T2,先想到一个(O(n^2))算法,类似莫队求区间众数,可以双指针然后开桶,记录MAX和MIN表示出现字符出现次数的最多和最少是多少,然后sk表示这个区间内不同字符的数量。虽然有点麻烦,但这是个练习的好机会。
先把字符串改成数组,这样方便处理,然后(l)降序,(r)根据奇偶升降,删除一个数或者增加一个数,没想到还蛮难调的。调出来大概已经要AM10:00了
然后开始对拍,开始看T3.
感觉T3有点难搞,N的范围似乎是想要一个(O(n^3))的做法,可能是DP,暴力也打不出来,正当自闭的时候,瞅了一眼对拍,发现T2有问题了。
是MAX和MIN的更新有问题,查了查发现在(r)右移增加字符的时候MIN也是会减小的,改了一下继续拍。
过了一会儿发现又错了,发现(l)在改的时候忘记更新MIN了,加上去之后,终于对了。
这个时候我想到,费了这么大功夫好像只有30分啊。感觉应该是写了个麻烦的做法。。不过写都写了,就当是练习莫队了。
思考T3无果的时候,似乎有人说他后两题暴力都没写,我想,后两题不是T2,T3吗?不至于吧?
过了会儿也忘记机房里具体发生了什么对话,大概就是自闭了之类的。又有人说,T3T4暴力还没写了。
这个时候我才猛然发现,这竟然有4道题,我淦。。看了眼T4感觉也挺麻烦的。优先考虑收益大的题目。T2有一个只有两个字符的30分,T1后边的分没准都可以拿。
AM11:00仔细想了想,T1整个序列每次隔一个询问的时候会出现隔一个取一个编号一定都是奇数或者偶数的,那只要分奇数偶数记录前缀和,就有不带修的部分了,再进一步,随便用个数据结构维护区间和,然后单点修改就好了.
脑子里首先想到的是分块,这个数据范围分块也是随便跑的,区间修改单点查询,非常好搞,于是快速实现了一下,不过实现出来已经AM11:35了,也没办法再对拍了,可能它就炸了,估计只有不带修改的75分(结果确实)。
提高级别的模拟赛,大概只有75+30+0+0.....自闭了。
}
namespace 赛后发现{
1 T1果然只有75分,分块的部分是RE了,发现是散块r的问题,最后应该是bl[x+1]和n取一个min的,思考了一下感觉自己的思路没问题,tag打的也没问题.于是尝试对拍。对拍感觉信息很杂乱,于是继续肉眼调试。结果试了试区间更改时散块从x+2开始来替代x+1,竟然就对了。可能在跨块的时候这样会出问题吧。。。自闭了。
2 T2是个前缀和,记录每个字符的前缀和,然后进行一系列判断,方案按道理最多也就(10^{10}),竟然要取模。。。虽然跟我没关系吧。
3 T3果然是个DP {打个当前时间戳: 17:49}, 目前不会。
4 T4dfs竟然能有不少分。不过差不多AM11:00才发现这道题,而且前边还有些牵挂,没得写。
少说废话多做事,少些放空多思考。
}
namespace 简单题解{
记录一下T2题解,T2其实是推柿子的,简单的推柿子可以知道每个区间sum需要等于(frac{r-l+1}{K}) ,(sumr-suml=frac{r-l+1}{K} ightarrow K imes sum_r-r=K imes sum_{l-1}-(l-1)) ,那么只要找到和r这个位置的所有值都相等的点即可,考虑用map存一个vector,记录这样的集合的个数,一个r加上这么多l就是这个r能够匹配的左端点了。
}
return 0;