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,101位 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只需看ab的素因子种类即可判断

对于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法则

法则种类=17法则 则为7法则

2法则,则为2法则(很容易证明)

类比法不能乱用,一定要全证明,

311法则,不能确定,需在判断

      7法则<=>其它

至此问题已解决,但注意(ba)可能满足多种法则,所以判断顺序还需思量

 

 

 

 

 

 

 

C - Name

题意;用一个字符串s中的所有字母构成比另一字符串t大,且最小的字符串(字典序)。

solution

要求大中最小可直接构造,色最后答案字符串为a

从首字母开始构造ai,对于 ti有三种情况

1s中还有字母ti,那么ai=sti

2s中没有字母ti,但有比ti大的字母sj,则ai=sj

并且此时a可以确定,可把s中剩余字母按字典序排成最小接在后面

3s中没有字母ti,也没有比ti大的字母,那么此处ai无法填(填任何一个a就不合 法了),但是a还是存在,因为对于j<i,aj=tj,,随便举一例可发现,此时该后退,找到某 一位置,按2中方式处理

另外,注意st的长度影响,

枚举完t长度的ai,都是1那种情况,

 此时,s长度大于t长度,补齐

s长度等于t长度,则需像3中那样回退

s长度不可能小于t长度

 

构造法原理在于将问题(要构造的东西)分成许多步,每步都可证明是合乎题意的(最优的)

 

D - Mathematical Analysis Rocks!

题意:只读题的话感觉有歧义,分析样例可发现对于数组a,b

求数组c   abc满足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],操作为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)

(问题用数学语言描述,化简后解决)

这样的话,sumb】是固定的,每次枚举suma】,求数目可先把sumb】排序,然后二分查找suma-1+val在里面的位置即可,

另外由于对应suma-1】,sumb】中小标小于a的都要删除,可用单调思想来保证,每次只删除一个,然后询问区间有多少个(改点问区间--树状数组)(此种树状数组类似最长不下降序列的树状数组)

算法复杂度nlognlogn

 

 

 

 

 

H - Cubes

题意:由N*N个矩阵格子中,第i行第j列格子放置aij)个立方体,问:在极远处往(vx,vy)方向看去,能看到多少立方体

分析:

可以通过翻转,处理下(vxvy)向量,且可先处理vx=0 或 vy=0的情况。

 

然后可以发现,其可以转化为平行光照射问题,

 

 

然后可以发现:按每行的顺序处理格子,就是看这一格子某一边的光线照射情况,此情况可用线段树实现。

 

注意点:

1,按照正常的考虑,状态有平移过程,但线段树没写过平移,所以逆向反射回去看

2,注意要考虑格子的两边,其实可转化为一边

3,用lazy思想必考虑delta数组,修改必有pushdown pushup

4,此处处理的是线而非点,区间划分为[p,q],->[p,mid],[mid,q],最后需加以特判


0 0
原创粉丝点击