poi2012 切题记
2016-05-12 15:33
429 查看
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) |
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
相关文章推荐
- 如何更改textField的placeholder的左边距以及颜色字号等
- Dr.Elephant FAQ 常见问题
- 【多线程-创建新线程】
- Android 中ListView 嵌套 ListView
- Sql日期时间格式转换
- MVC中form提交和在控制器中怎样接受
- 个性化推荐漫谈
- 01.安装maven
- 点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
- 【OpenCV】中cvCreateImage、cvSaveImage、cvReleaseImage
- robotframework 初识
- c++简单线程池实现
- 自定义动画Animation
- Python通过Zabbix API获得数据
- iOS上传图像到服务器,以及服务器PHP接收的几种方法
- 设计模式
- [从头学声学] 第212节 辅音的数据
- Java垃圾回收机制
- 浏览器中音频兼容性问题(上)
- maven webapp后无法添加src/main/java和src/main/test