poi
Spylft
这个作者很懒,什么都没留下…
展开
-
POI2014Card
这道题的话,想法感觉也是很奇怪的…首先一个想法是如果有了第一个值,那么就可以贪心地去选取数字了,每次都选能选的最小的,这样肯定最优.那么我们就去确定这个数,即可以讨论而得出一段区间右端点最小是什么.我们可以看出,一段区间的左端点,要么是左边的第一个数,要么是左边的第二个数,然后对于一段没有被修改过的区间,它们定下来左端点后,右端点的最小值是固定的.然后用线段树来优化它,每次进行单点更新,区间查询,就原创 2016-11-07 18:30:37 · 529 阅读 · 0 评论 -
POI2014 Solar Lamps
第一件要干的事就是把它给你的坐标用它给你的两个向量表示出来,事实上这件事就够令人发狂了…所以开始解方程.我们有 {a∗x1+b∗x2=Xa∗y1+b∗y2=Y\begin{cases}a*x1+b*x2=X\\a*y1+b*y2=Y\end{cases} 解得: ⎧⎩⎨a=X∗y2−Y∗x2x1∗y2−x2∗y1b=X∗y1−Y∗x1x2∗y1−x1∗y2\begin{cases}原创 2016-11-09 21:11:12 · 550 阅读 · 0 评论 -
Poi2010 Railway
Task: A railroad siding consists of two (dead-end) sidetracks 1 and 2. The siding is entered by track A, and left by track B (see figure below). There are cars on track A, numbered from to原创 2016-10-02 15:06:46 · 922 阅读 · 0 评论 -
POI2014Salad Bar
POI2014 Salad Bar这道题的大意就是给你一个字符串,里面只含有p和j,求一个最长的子串,使得从左边开始,p的个数一直比j多,从右边开始也一样.这道题的话,一开始想歪了,就先对每个字符,算出来以它为起点往右最多能在哪里,然后再算出来以它为起点往左最多能走到哪里,这样的话,一个满足条件的子串一定满足R[l]>=r,L[r]<=lR[l]>=r,L[r]<=l,然后按照左边小的排一下序,然后原创 2016-11-04 20:02:41 · 401 阅读 · 0 评论 -
POI2014Bricks
POI2014 Bricks正解的话是贪心,就是先把剩下最多的放到现在这个地方来,如果有多个最多的,那么就把颜色与最后一个颜色相同的取出来,不然就随便放一个.然后用堆来维护这个信息,所以正解是O(nlogn)O(nlogn)的.#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<queu原创 2016-11-07 15:26:00 · 374 阅读 · 0 评论 -
POI2014Little Bird
首先要想到dp,那么定义dp[i]为走到第i棵树时的最少劳累值.那么dp转移的时候就要考虑到两点之间的高度大小关系,所以要分类讨论.那么这样的dp就是O(n2)O(n^2)的了.所以考虑优化,因为我们发现一个点的dp值只可能够由它的前k个来转移,所以想到使用单调队列来优化dp.然后什么样的值才是最优的呢?首先dp值小的一定更优!因为dp值只能够一个一个地发生变化,所以无论高度差如何,只要dp值小1,原创 2016-11-08 19:24:16 · 540 阅读 · 0 评论 -
POI2014FarmCraft
大意: 就是给你一棵树,然后树上有n个节点,每条边的边权为1,然后每个节点有一个延时t,当你走过这个节点后,过了t时间之后,这个节点就被加入到已经经过的点的集合中,然后从1节点出发,在1节点结束,且1节点的计时只会在最后一次到1节点的时候开始. 求最少时间,能够经过所有的点.这道题的话,感觉就是一个状态定义出来后就只剩下码代码的树形dp了吧…那就开始定义状态.我们定义dp[i]原创 2016-11-08 16:36:01 · 612 阅读 · 0 评论 -
Poi2010 Divine Divisor
Solution:首先我们想到吧所有的数质因子分解,所得到的每个质因子的个数的和的最大值就是要求的k,而我们设这个最大值出现的次数为m,则我们可以知道,任意个这样的质因子的乘积都是可行的一种解,所以第二个答案就是2^m,注意到这个值可能会很大,所以我们要用高精乘法.那么我们再观察一下现在这个数的范围->[1,1e18],根本无法去进行完全的因数分解,但是我们可以知道,如果这个范围内的数有三个或以上的原创 2016-10-02 15:04:37 · 600 阅读 · 0 评论 -
POI2010 Hamsters
Solution首先可以Hash搞出每个名字连在另一个名字后面所需要增加的字母数量.而有些人会担心搞完这个后就超时了,但是如果这个都会超时,这道题目还有什么写的必要?所以大胆去干就好了.那么下面我们给出不会超时的证明:首先对于两个串A,B,我们需要比较的复杂度是min(A.length(),B.length()),那么我们可以知道,当A,B两个串的长度越接近,我们所要比较的次数越多(min(A.le原创 2016-10-02 15:03:24 · 416 阅读 · 0 评论 -
POI2014Criminals
这道题的话,首先是一个小贪心,枚举完在哪个点相遇之后,要得到这个点向左走多远才可以完成左边的序列,向右边走多远才可以完成右边的序列.这两个都取最小,然后再看一下两边之外的地方是不是有相同的元素,这样的话就差不多了.但是这样的话预处理比较麻烦.我的话是使用dp,dp[i]定义为现在这个点开始,是到达了需求序列中第i个点的最右边的开始位置.转移也是很扯淡…if(pl!=1)dp[pl]=dp[pl-1]原创 2016-11-07 22:32:04 · 419 阅读 · 0 评论 -
POI2014 Ant colony
很显然的一个想法就是通过有食蚁兽的那一条边把整棵树分成两棵树.这样就可以两边乱搞了对于一棵子树,我们现在存一下现在的上界r和下界l,遇到一个度为k的节点,分开之后它的上界和下界会变成[l∗k,(r+1)∗k−1][l*k,(r+1)*k-1].然后遇到叶子节点的时候,我们在原序列中询问[l,r][l,r]之间的数有多少个就行了,只用把原序列排个序,二分一下就行了.#include<cstdio>原创 2016-11-11 11:04:41 · 450 阅读 · 0 评论