hit_training_20130328
来源:互联网 发布:redis和mysql结合 编辑:程序博客网 时间:2024/06/06 05:22
A CF180A
构造
B CF180B
发现性质,
简化 证明
C CF180D
构造
完整讨论各种情况
D CF180F
数组映射水题
E CF191B
逆向思维
F CF191C
Lca,区间修改查询
G CF191E
二分+二分树状数组
使用数学语言描述问题
H CF 243D
平行光,线段树
Lazy,处理线,
A - Defragmentation题意:
一些文件存储在磁盘上(占据了磁盘的一些块),现要求使用最少的操作步数将每个文件变成连续存储,而且空白块留到最后(保证至少有一个空白块)
solution:
抽象理解,如果第i块是空块,那么把合法块移到此处只需一次的代价
如果第i块不是空块,
是合法块,则不需改变
不是,那么把合法块移到此处只需二次的代价,
至此,已发现合乎题意的解法,而且与最后文件在磁盘上的顺序无关
B - Divisibility Rules题意:
我们看能否整除时,发现一些法则,如2,4,5,只需看末几位能否整除,3,9,计算各位数字之和,11则是看奇偶位数字之和之差,6则转化为2,3处理,7则没有规律,
现求b进制下,a的整除法则属于哪种类型,2,3,6,11,7
分析:
初看可能没什么想法,可先放弃某些约束,将题目化简,此处先只考虑10进制的情况
怎么考虑呢?我们已知某些样例,可先分析其性质,然后看由此是否可反推(即,已有定理A,样例ai,由ai=>bi,抽象化得定义B,然后看B是否=>A,且B是否可编程)
此处2,4,8满足2法则,为什么3不行,
我们发现8看后3位,后三位全是0时....
很快2,10,1位 4,100,2位,8,1000,3,位——》
2法则<=>^i能被a整除
同理发现9,99,999,9999,99……9都能被3,9,整除
则 3法则<=>b^i-1能被a整除
注意此时的B,需要检验其正确性(A=>B B=>A)以及是否适合计算机处理
证明时可理论与样例相结合
设一个数为x1*b^y1+……xi*b^yi+……xn*b^yn;
对于2法则有b^k能被a整除
对于后k位,显然
数多于k位的,可写成p*b^k+q 显然
而且code只需看a,b的素因子种类即可判断
对于3法则
xi*b^yi=xi*(b^yi-1 +1)=xi*(b^yi-1)+xi 明显只需看xi能否被a整除,显然
但code不好判断条件,
上面推理中一下到了各位,我们发现
xi*b^yi=xi*(b-1 +1)*b^(yi-1)
即3法则<=>b-1能被a整除
类比法
11法则<=>b+1能被a整除
至此,问题可以说解决了大半
2法则<=>^i能被a整除 code分解质因数
3法则<=>b-1能被a整除
11法则<=>b+1能被a整除
6法则<=>分解质因数(注意分类讨论完全)
质因数法则种类必大于0
法则种类>1,有7法则 则为7法则
否则,6法则
法则种类=1,7法则 则为7法则
2法则,则为2法则(很容易证明)
类比法不能乱用,一定要全证明,
3,11法则,不能确定,需在判断
7法则<=>其它
至此问题已解决,但注意(b,a)可能满足多种法则,所以判断顺序还需思量
C - Name
题意;用一个字符串s中的所有字母构成比另一字符串t大,且最小的字符串(字典序)。
solution:
要求大中最小可直接构造,色最后答案字符串为a
从首字母开始构造ai,对于 ti有三种情况
1,s中还有字母ti,那么ai=sti
2,s中没有字母ti,但有比ti大的字母sj,则ai=sj
并且此时a可以确定,可把s中剩余字母按字典序排成最小接在后面
3,s中没有字母ti,也没有比ti大的字母,那么此处ai无法填(填任何一个a就不合 法了),但是a还是存在,因为对于j<i,aj=tj,,随便举一例可发现,此时该后退,找到某 一位置,按2中方式处理
另外,注意s,t的长度影响,
枚举完t长度的ai,都是1那种情况,
此时,s长度大于t长度,补齐
s长度等于t长度,则需像3中那样回退
s长度不可能小于t长度
构造法原理在于将问题(要构造的东西)分成许多步,每步都可证明是合乎题意的(最优的)
D - Mathematical Analysis Rocks!
题意:只读题的话感觉有歧义,分析样例可发现对于数组a,b
求数组c a,b,c满足bi=a[ci]
分析:
理清数组映射关系即可
E - Demonstration
题意:题目有些复杂,需耐心读题
游行者每天占一个未使用的广场
此时政府
该广场是否最坏(广场优劣从左到右越劣,最坏其实就是最靠右的一个)
是,不管,游行者占领成功
不是,看是否有钱
有钱就必须占用该广场,并把游行者赶到最坏广场(然后其实游行者不管接不接受最后一个广场其实都无所谓)
没钱,游行者占领成功
问:游行者最后能占领的最优广场
构造法,找贪心策略,但发现两种贪心策略不能共存
前期尽量耗钱,与选较优广场
逆向思维法,按时间来说是倒着来或者说是假设已知结果倒推
假设最后一天(第k天)游行者能选的最优广场为xk,则有
(假设然后推出充要条件,枚举答案用充要条件判断)
Sum-<money[xk]
很快我们便有算法,枚举x,看上不等式能否满足即可
要是上式满足,就须使最大,就是把money从大到小排序选前k-1个即可
至此算法已出
从左往右枚举xK
xK是否在按排好序的前k-1个中
分别验证不等式即可
F - Fools and Roads
题意:一棵树,m条路径,问每条边都有多少条路径经过
分析:找路径可用lca,但??
想到树链剖分可以把一棵树拆分映射到一个一维数组上,树上的一条路径可由数组上不超过logL个区间表示,然后可在此一维数组上用数据结构进行操作
此题完全可如此做,每次操作给路径上的边次数加1,=>给logL个区间值加1
最后询问问每条边-----改点问区间,可由树状数组实现
算法复杂度为nlognlogn可过
但此题还有更简单解法,上题我们忽略树,那么题就是 给区间累加某个值,最后询问某点值
这可用累加数组修改区间来解决,[a,b]加1 ,操作为d[a]++,d[b]--, 最后d[i]=sum[i];
但此题是在树上,不过也可以做,c=lca(a,b), d[a]++,d[b]++,d[c]-=2, 最后 d[i]=子树中的累加值,注意树的叶子是起始点,
即c=lca(a,b), d[a]--,d[b]--,d[c]+=2, 最后 d[i]=从根走到此的累加值 是有问题的
此算法复杂度 nlogn+n
G - Thwarting Demonstrations
题意:有一个数列(既有正数也有负数),求第k大的区间和
分析:明显答案是有序的,可以考虑二分答案
二分的上下界可由连续最大(小)和简单DP算出
对于二分出的值val,我们需判断其是第几大,等价于,求区间和大于val的区间个数
[a,b]的区间和可用sum[b]-sum[a-1]描述,枚举所有区间是n^2的算法
不可能全枚举,我们很容易想到单调思想,
左端点右移时(先枚举左端点a),发现以计算出的值再减去原先左端点的值即可
(i->i+1 ,he(i+1,j)=he(i,j)-d[i]),可以发现在右移过程中,大小关系不变,
不过这对我们没帮助,因为我们要知道其值是否大于val,????
再描述下问题,求满足 sum[b]-sum[a-1]>=val的有多少对(a,b)
我们把式子移项,求满足 sum[b]>=sum[a-1]+val的有多少对(a,b)
(问题用数学语言描述,化简后解决)
这样的话,sum【b】是固定的,每次枚举sum【a】,求数目可先把sum【b】排序,然后二分查找sum【a-1】+val在里面的位置即可,
另外由于对应sum【a-1】,sum【b】中小标小于a的都要删除,可用单调思想来保证,每次只删除一个,然后询问区间有多少个(改点问区间--树状数组)(此种树状数组类似最长不下降序列的树状数组)
算法复杂度nlognlogn
H - Cubes
题意:由N*N个矩阵格子中,第i行第j列格子放置a(i,j)个立方体,问:在极远处往(vx,vy)方向看去,能看到多少立方体
分析:
可以通过翻转,处理下(vx,vy)向量,且可先处理vx=0 或 vy=0的情况。
然后可以发现,其可以转化为平行光照射问题,
然后可以发现:按每行的顺序处理格子,就是看这一格子某一边的光线照射情况,此情况可用线段树实现。
注意点:
1,按照正常的考虑,状态有平移过程,但线段树没写过平移,所以逆向反射回去看
2,注意要考虑格子的两边,其实可转化为一边
3,用lazy思想必考虑delta数组,修改必有pushdown 和pushup
4,此处处理的是线而非点,区间划分为[p,q],->[p,mid],[mid,q],最后需加以特判
- hit_training_20130328
- 数据库设计范式深入浅出
- centos 中文乱码解决办法
- 物理地址与总线地址
- 服务器对html静态页面及图片的处理——如何将静态html页面发送给浏览器端
- Driver porting: the workqueue interface.
- hit_training_20130328
- Android 天气
- 线程创建的三种方法
- linux 下route命令
- 黑马程序员_Java异常处理
- hdu 1075 What Are You Talking About (map)
- 对数字地和模拟地的理解和分析(原理图设计和pcb布线时需要考虑)
- java中一个值得注意的问题---类成员初始化与变量初始化的区别
- python整数与IP地址转换 [转]