常州培训 day1 解题报告

第一题:

题目大意:给出一个字符串,找出满足条件A的区间的个数。A:字符A,B,C的出现次数相同。 都出现0次也算,区间的长度可以是0(就是只有一个数).
30% |S| ≤ 100 。
70% |S| ≤ 1000 。
100% 1 ≤ |S| ≤ 1000000 。

解题过程:

1.考场上想不出AC算法,但是70分是很好拿的,最先想到先求出A,B,C出现次数的前缀和,枚举区间的两个端点,O(1)时间判断,枚举O(n^2)。

2.一看后面的题目都不是很好写,就先来优化一下这题,由于只有A,B,C是有用的,所以把其他字母拿掉,并把每个有效字母(A,B,C)后面的无效字母的个数保存下来,然后方法和前面一样,加些细节处理,这样就可以把区间的长度大大缩短。但是实际证明,这样是在做无用功,还是只有70分,还不如直接朴素算法省力。

3.AC算法:假设区间[i,j]符合要求,那么SUMA[j]-SUMA[i-1]=SUMB[j]-SUMB[i-1]=SUMC[j]-SUMC[j-1],变形一下得到

SUMA[j]-SUMB[j]=SUMA[i-1]-SUMB[i-1];

SUMB[j]-SUMC[j]=SUMB[i-1]-SUMC[i-1];

也就是说 如果区间[i,j]符合要求,必须满足j和i-1的  A-B的个数相等,j和i-1的B-C的个数相等。

那么只要把一个点 描述成一个二元组{SUMA-SUMB,SUMB-SUMC}, 找到一个和它完全相等的,就可以当成一个符合要求的区间的两个端点。

那么只要把所有二元组排个序,以SUMA-SUMB为第一关键字,SUMB-SUMC为第二关键字。如果有连续的n个相等的二元组,那么就表示有n*(n-1)/2个合法区间,累加到答案里就好。

但是这样还不完善,这样是没法找出 区间长度为0的。 2种处理办法,一种是虚拟一个二元组{0,0},还有一种是 扫一遍,找出所有{0,0}的二元组,累加到ans。

成绩不是很理想,3个题目加起来才120分。

常州培训 day1 解题报告

时间: 2024-11-29 04:17:18

常州培训 day1 解题报告的相关文章

常州培训 day3 解题报告

第一题: 给出数轴正半轴上N个点的坐标和其权值,给出初始体力值M,人一开始在位置0,体力值会随着走过路程的增加而增加,走多少个单位的路消耗多少体力值.到每个点可以打掉,消耗的体力值就是其权值.求 最多能打掉多少点. N<=10000,其他<=10^18; 解题过程: 1.一开始就直接想到是贪心,首先人是不可能往左走的,否则不会最优.枚举最后停在哪个点,减去到这个点需要的体力,然后把这个点之前的所有点(包括这个店)的权值排个序,从小到大一个一个打,打到体力没有为止.复杂度分析:枚举N次,每次快拍

常州培训 day2 解题报告

第一题: 题目大意: 给出一个M面的骰子,投N次,求最大期望值. 最大期望值的定义: 比如M=2,N=2, 那么 2次可以是 1,1,最大值为1: 1,2最大值为2: 2,1最大值为2: 2,2 最大值为2: 最大期望值就是  (1+2+2+2)/4=1.75 也就是把所有情况的最大值加起来,除以方案数.M,N<=5000 解题过程:1.这题只能说自己数学水平不够,只能找找规律骗点分,竟然混了个40分.小的数据直接模拟,拿40分. 2.正解: 考虑最大值为1的情况,sum=1*(1^N-0^N)

常州培训 day5 解题报告

第一题:(贪心) 题目大意:给出N*M的矩形,要用正方形将它铺满(正方形之间不能重叠),相邻的正方形颜色不能相同,颜色用ABCD表示.要求从上到下从左到右字典序最小. N,M<=100 解题过程: 1.首先感觉是能放就尽可能使正方形边长大,但是很明显有反例(见图A) 2.然后想到从上到下从左到右,依次检查,如果还没被铺上,那么就先铺上1*1的X,然后检查它右边能填什么,如果他右边能填的比它大(Y),那么就把1*1的改成尽可能大,如果他右边的比它小,那么它只要放1*1的X,然后右边放尽可能大的Y.

NOIp 2013 Day1 解题报告

NOIp 2013 Day1 解题报告 1.   转圈游戏 不难看出答案就是(x+m*10k) mod n 用快速幂算法,复杂度O(log2k) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 8 //variable// 9 int n,m,x,

暑训day1解题报告

A - Painting the sticks 因为不能覆盖涂/涂两次,所以就数数有几个三个一块儿就行了. #include<cstdio> int a[100],ans ; int main() { int n , t = 0 ; while (scanf("%d",&n)!=EOF) { for (int i=1; i<=n; ++i) scanf("%d",a+i); ans = 0 ; for (int i=1; i<=n ;

2016.8.25 NOIP2012 day1 解题报告

考试总结: 1.  显然第一道送分题,我差一点直接打表来对拍了,后来发现我们的pdf有问题不能复制,并且我没有YJQ大神那样足够的时间每道题都对拍,就只能试过样例就遁,(其实这种密码我玩过,密码学入门密码,当时好像叫凯撒密码233):对了,ASCII的掌握也很重要,我之前一直以为大写在小写后面啧.(之间漏掉过大于以后减的步骤,这种简单题还是做少了居然耗了30min,以后好好检查争取一次过): 2.  这道题我拿到的第一反应就是贪心,马上想了一个贪心规则但自己总觉得是错的,花了很长的时间举反例举不

CH Round #54 - Streaming #5 (NOIP模拟赛Day1)解题报告

最近参加了很多CH上的比赛呢~Rating--了..题目各种跪烂.各种膜拜大神OTZZZ T1珠 描述 萌蛋有n颗珠子,每一颗珠子都写有一个数字.萌蛋把它们用线串成了环.我们称一个数字串是有趣的,当且仅当它的第1位是2,且除了第1位以外的每一位都是3.例如,2,233,2333333都是有趣的数字串.现在,你可以从这串珠子的任意一颗开始读,沿着顺时针或逆时针方向,到任意一颗珠子停止.这样,你就可以读出一个数字串来.萌蛋想知道,所有能读出的有趣的数字串当中,最长的是哪一个数字串.当然,你也可能读不

2017.7.15清北夏令营精英班Day1解题报告

成绩: 预计分数:20+10+40 实际分数:100+10+40. 一百三十多人的比赛全场rand7还水了个鼠标+键盘 unbelievable! 考试题目链接: https://www.luogu.org/team/show?teamid=1353 T1 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm&

NOIp 2011 Day1 解题报告

1.    铺地毯 送分题…… 枚举给定矩形,判定给定点是否在矩形内.求出标号最大的哪个矩形即可. 复杂度O(N) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 8 //variable// 9 int n,a[10010],b[10010],g