poi2012 切题记

19th Polish Olympiad in Informatics

Tasks

Festival (Stage I) (100/100)
Letters (Stage I) (100/100)
Distance (Stage I) (100/100)
Rendezvous (Stage I) (100/100)
Well (Stage I) (100/100)
Tour de Byteotia (Stage II - day 0) (100/100)
Vouchers (Stage II - day 1) (100/100)
Cloakroom (Stage II - day 1) (100/100)
A Horrible Poem (Stage II - day 2) (100/100)
Fibonacci Representation (Stage II - day 2) (100/100)
Squarks (Stage III - day 0) (100/100)
Bidding (Stage III - day 1) (100/100)
Salaries (Stage III - day 1) (100/100)
Leveling Ground (Stage III - day 1) (100/100)
Minimalist Security (Stage III - day 2) (100/100)
Warehouse Store (Stage III - day 2) (100/100)
Prefixuffix (Stage III - day 2) (100/100)

       题意bzoj和codevs上都有自己看把。。(除了bidding因为是交互题)

Festival 差分约束,然后floyd判负环。剩下的强连通分量缩点构成DAG,每个强连通分量互不影响,求出各自贡献再加起来即可。

Letters  求出第二个串每一位在第一个串对应的位置然后跑逆序对即可。

Distance  令f(i)表示i的质因数(重复算多个)的个数,显然D(i,j)=f(i)+f(j)-2*f(gcd(i,j)),对于每个数x求出它倍数中最小和次小的f(),然后查询x的时候枚举x的约数即可。

Rendezvous  显然每一个连通块是基环树,那么两个点相遇只有几种情况讨论一下即可。

Well  二分答案后可以递推得到在不满足一个数=0的情况下每个数最大是多少,然后递推就得到点i的答案了。

Tour de Byteotia  先把超过K的连在一起剩下能加就加。。证明不会。

Vouchers  暴力。由调和级数得复杂度O(NlnN)。

Cloakroom  考虑离线,按a排序,然后令f[i]表示容量为i时背包中b最小值的最大值然后比较即可。

A Horrible Poem  假设当前长度为len,它的一个质因子p,如果len/p符合条件,则len/=p。显然正确。枚举所有len的质因子即可,单词查询时间logN。

Fibonacci Representation  令fi为斐波那契第i项,若fi<=x<=fi+1,那么要么用fi+1-x要么x-fi,map下记搜即可。

Squarks  显然最小的是x1+x2,次小的x1+x3,枚举x2+x3是第几(3~n)小的,然后解出x1。假设知道x1~xk,那么就把x1~xk之间两两之和删掉,剩下最小的就是x1+xk+1。重复作就好。如果用hash就是期望O(N^3)的

Bidding  题意,有两个数x=1,y=0,每次选择1.y+=x,x=1;2.x*=2;3.x*=3,如果到某人的时候x+y>=n就输了。你需要打赢交互库。

  设f[i][j][k]为当前y=i,x=2^i*c^j次时能否胜利,状态O(Nlog^2N)。然后按着对方必败的方法不断走下去即可。

Salaries  显然易得每个数必须<=多少,然后对于i如果当前<=i的未确定值只有1个且存在一个数为<=i,那么这个数就是那个未确定值。

Leveling Ground  不妨令a<b且gcd(a,b)=1。差分之后变成每次操作给一个数+a(b),另一个数-a(b),由拓展欧几里得算出一个数x需要u次a和v此b(u.v>0表示加,u,v<0表示减)。同时需要Σu=0,那么考虑对一些数u-=b,v+=a,然后用堆维护修改一个数后答案变小最多的数每次取出修改即可。

Minimalist Security  对每一个连通块定一个原点x,然后这里面的点y要么是p'y=p'x+tag,或者p'y=-p'x+tag,几种情况分类讨论一下即可。

Warehouse Store  用堆维护一下当前满足的顾客中b[]的最大值,然后要么满足当前顾客的要求;或者用当前的b[]去尝试替换最大的b[]。

Prefixuffix  显然要求最大的|A|+|B|,并且字符串满足AB.....BA的形式。枚举前面A的右边界i,设此时B右边界Pi,有Pi+1-Pi<=1然后就随便做了。

        代码戳→这里

by lych

2016.5.12

你可能感兴趣的:(字符串,数学,动态规划,图论,切题记)