写在前面的0.0..
poi糊做..
给自己挖一个无尽的深坑..
开坑咯
来看看做了几题..:
[2016.8.25] Kinoman
算是水题吧..
先暴力搞个数组表示1~i这段区间的收益
然后从1往n推,只会影响到inext[a[i]]-1,next[a[i]]next[next[a[i]]]-1
用线段树维护这个数组就好了..
[2016.8.27] Logistyka
用splay维护整个数列.. 以权值为下标..
记整个数列大于等于(s)的有(tot)个,小于(s)的数的总和为(sum)
1.如果(tot>c),那么肯定可以操作
2.如果(sumgeq(c-tot) imes s),那也可以操作
3.如果(sum<(c-tot) imes s),那就不行了
[2016.8.27] Pieczęć
暴力搞搞就行了
[2016.8.29] Myjnie
把所有的c离散化
f[i][j][k]表示i~j区间内最小值为k的最大收益
g[i][j][k]表示max(f[i][j][k...m])
h[x][i]表示经过x的区间有多少个
那么递推就是f[i][j][k]=max(g[i][x-1]+g[x+1][j]+h[x][k]*val[k])
然后第二问就随便搞搞
[2016.8.29] Wilcze doły
左右指针搞搞..
单调队列维护一下最大值0.0..
poi2014
[2016.8.30] Salad Bar
用单调栈处理一下每个点往左最多拉多少,往右拉多少..
再用线段树维护一下最左的位置就好了..
[2016.8.30] Hotel
一开始yy了一个好水的dp..
然后就爆空间了0.0.. 数据结构题做多了(逃)
%%%liao
枚举每个点啊.. 就是这个东西多了个n的空间0.0..
然后计算跨过这个点的方案数就行了..
[2016.8.30] Bricks
有个贪心的做法,就是每次都取剩余最多的那个颜色的..
然后随便搞搞..
tips:如果某颜色只有一个,但是前后都是这个颜色,那会怎么样呢0.0..
[2016.8.31] Couriers
比较裸的一道主席树吧0.0..
每个节点维护子树内的个数和,然后每次再问一下这个个数是否大于(r-l+1)/2就可以了..
[2016.8.31] Card
用线段树维护f[0...1][0...1],表示这个区间左端点正反面右端点正反面能否成立..
然后随便搞搞就行了..
[2016.9.1] Around the world
倍长一段,破环成链
用(next_i)记录(i)最远到达位置
优化一下,在搜索过程中像并查集的方法压缩路径..
[2016.9.1] Criminals
记录每个点往左和往右最近拉到的点
维护后缀颜色最初出现位置的最小值..
(O(n))扫一遍就好了..
[2016.9.2] FarmCraft
按照题意,就是所有点只能走一次,那么对于一个点x,我们只需要安排他的子树的遍历顺序即可..
那么作如下考虑:
定义遍历某节点(x)的子树的时间为(f_x),最短安装时间为(g_x)
那么对于某个安排顺序,有且仅当:
(max(s+g_i,s+f_i+g_j)<max(s+g_j,s+f_j+g_i) (j+1=i,s=sumlimits_{k=1}^{i-1}f_k))
此时会产生异议,(i)应该放在(j)的前面
由于(s+f_i+g_j>s+g_j, s+f_j+g_i>s+g_i)
所以我们只需要看(f_i+g_j<f_j+g_i)
所以:(f_i-g_i<f_j-g_j)
那么就把(x)的所有子节点按照(f_i-g_i)排个序就好了..
[2016.9.2]Freight
比较清晰的思路:最优方案一定是一段人过去然后立刻回来..
定义(f_i)为(i)回到原点的最短时间,(T_i)为(i)的最早出发时间..
然后搞一个递推方程:
(f_i=min(max(f_{j-1}+S+i-j,T_i+S)+S+i-j))
然后再化简一下:
(f_i=min(max(f_{j-1}-j,T_i-i)+2(S+i)-j))
记(g_i=f_i-(i+1)),很容易看出(g)是单调不降的,那么我们二分找一个点(p),使得(g_{p...i-1}>T_i-i),然后以(p)为分界线在两边搞搞,用线段树维护一下就行了..
该算法复杂度为(O(nlogn))
tips:用单调队列可以把时间下降到(O(n))
[2016.9.2] Little Bird
用单调队列随便搞搞..
[2016.9.3] Rally
新建(S)和(T),(S)连到所有点,所有点连到(T)..
(f_i)记录从(S)到(i)的最长路,(g_i)记录从(i)到(T)的最长路
那么一条(x)到(y)的边的贡献就是(f_x+g_y)
然后按照拓扑序访问(x)
删去连到(x)的边,求其余边的最大值(这个用线段树维护),加上(x)连出去的边..
[2016.9.3] Solar Panels
如果某个(k)是成立的,当且仅当:
(lfloordfrac{a-1}{k}
floor<lfloordfrac{b}{k}
floor)且(lfloordfrac{A-1}{k}
floor<lfloordfrac{B}{k}
floor)
然后用分块搞搞(lfloordfrac{a-1}{k}
floor)、(lfloordfrac{b}{k}
floor)、(lfloordfrac{A-1}{k}
floor)、(lfloordfrac{B}{k}
floor)就可以了..
[2016.9.3] Supercomputer
首先我们想到最优策略肯定是
(1)如果某一层都不超过(k)的话我们肯定是拿整一层..
(2)如果某一层超过了(k),就要由下面的来补
定义(sum_i)为层数大于(i)的点数个数
那么可以清晰看到:(ans=max(i+lceildfrac{sum_i}{k}
ceil))
然后化简一下就可以用斜率来做了啊0.0..
[2016.9.5] Ant colony
从食蚁兽埋伏的边往叶子节点bfs,记录到每个点的上限(up)和下限(down)
如果某时刻某个点的(down)比最大的蚂蚁群都要大,那么就不用往下搜了..
[2016.9.5] Tourism
定义一个(3^{10})的状态表示(x)到根的状态
(0)表示选了
(1)表示没选 不满足
(2)表示没选 满足
然后从上往下统计从根到(x)的状态(S)所需的最小花费
再从下往上统计从根到(x)的状态(S)并且(x)的子树全部满足的最小花费
然后随便乱搞就可以了..
poi2013
[2016.9.6] Inspector
%%%Claris
多组数据满满都是坑啊0.0..
[2016.9.7] Tales of seafaring
想到一个很贱的做法,就是从(x)走到(y),然后再走出来走进去走出来走进去..
那么就和奇偶性有关了..
[2016.9.7] Bytecomputer
举几个栗子就可以得到:最终数列也只可能有{-1,0,1}三种元素..
然后就dp咯,(f_{i,0...2})就表示到(i)为(0..2)的最小花费咯..
[2016.9.8] Taxis
先留一个大于等于(m-d)的车..
然后从大到小贪心就好了..
[2016.9.8] Tower Defense Game
此题只要输出任意小于等于(k)的方案就可以了.. 掌握一门外语是有多重要..
现在选择某个点就相当于以前选择某个点周围的所有的点.. 那这个绝对不会亏..
乱搞即可..
[2016.9.8] Triumphal arch
二分一下,然后用(f_i)表示要走到(i)这棵子树至少要先染色多少个点..
递推方程就是(f_x=max(sum (f_y+1)-K,0))
[2016.9.9] Take-out
把白的标为(1),把黑的标为(-K)
统计一下前缀和就可以发现,相邻两个相同的距离一定等于(K+1)..
然后乱搞即可..
[2016.9.9] Polarization
第一问答案就是(n-1)..
第二问的话,先找个重心,那么它的任意一棵子树肯定是全部指向它或者远离它..
然后(01)背包,用bitset优化就好了..
poi2012
[2016.9.12] Distance
用(sum_i)表示(i)的质因数总数,那么(d(a,b)=sum_a+sum_b-sum_{gcd(a,b)})
那么对于一个(a),枚举一个(gcd(a,b)),就去找最小的(sum_b)
预处理这个东西就可以了..
tips:调用sqrt时间很长,下面就是本人亲测:
满满都是泪啊..
[2016.9.13] A Horrible Poem
对于每个询问,找该长度的约数进行判断就行了..
优化:
统计每个字符出现的次数,那么重复次数肯定是<=gcd(出现次数)..
然后就乱搞就行了..
三倍经验到手.. 2890 3647
[2016.9.14] Warehouse Store
贪心让库存最大,用堆维护一下乱搞就好了..
[2016.9.14] Vouchers
(别把这题想的太难,其实很水的)
乱搞..
[2016.9.16] Fibonacci Representation
每次找离该数最近的斐波那契数乱搞即可..
[2016.9.16] Tour de Byteotia
先把两端都大于(k)的边全部加入,因为这些都是有用的..
然后再用类似于最小生成树的方法加入其他边..
[2016.9.19] Cloakroom
由(1leq kleq100000)就可以知道这道题肯定是背包什么的0.0..
看(q)这么大也就想到肯定是离线搞搞啦0.0..
那么就把(n)个物品按照(a_i)排个序,把(q)个询问按照(m_i)排个序..
(f_i)表示和为(i)的最小(b_j)是多少..
背包一下就行了..
[2016.9.19] Prefixuffix
毫无素质,直接去看题解了0.0..
问题可以转化成令(s[1..i]=s[n-i+1...n])并且(s[i+1...L]=s[n-L+1...n-i])..
那么定义(f_i)为最长的(f_i)使得(s[i...i+f_i-1]=s[n-i-f_i+2...n-i+1])..
自己推一下就可以得到(f_{i-1}leq f_i+2)
那么就从(f_{n/2})开始递推,用hash验证一下就好了..
[2016.9.22] Festival
为了搞这题还去学了两天的差分约束..
差分约束过后就用强连通缩点,答案就是每个联通块最远的两个点的距离之和..
因为Floyd没清空(dis_{i,i}=0) WA了好多发0.0..
[2016.9.22] Letters
大水题不说了..
[2016.9.25] Rendezvous
据说这叫做内向环套树..
那么就把这个内向环套树的环当做根就好了0.0..
对于每个询问给出的(x)、(y),先找到它在环上的根,那么就可以判断是否可行..
如果它们环上的根相等,那么走到(lca)是最好的
否则再乱搞..
[2016.9.27] Well
二分答案(k),先搞搞如果不一定要降到(0)的情况最小花费
然后再枚举(z)的位置..
具体点就是要先算出当前该位置要减少多少才能把左(右)边拉动..
嗯,接下来就自己想了0.0..
[2016.9.28] Salaries
记录每个点最大可能的值..
那么对于某个点最大为(i),他能够确定当且仅当一定有(i-1)个数比它要小..
就可以乱搞了0.0..
poi2011
[2016.10.17] Meteors
整体二分来判断..
趁机学了一发树状数组的区间修改和区间询问..
涨姿势了..
[2016.10.18] Lightning Conductor
先考虑(i>j>k)的情况
化简式子可得(pgeq max(a_j+sqrt{i-j})-a_i)
然后可以发现这东西是有决策单调性的,就用单调队列维护一下..
二分解个方程差不多就可以了
[2016.10.18] Temperature
很水的尺取法.. 用单调队列维护一个单调下降的(l_i)
[2016.10.18] Difference
一直不知道怎么做.. 知道看了题解,问了问大神才恍然大悟
定义(f_{i,j})为前缀中(i)的个数(-j)的个数的值..
那么只要维护一个前缀最小值就行了
但是只维护前缀最小值会出现相减后(i)的个数或者(j)的个数等于(0)的情况
所以还要维护一个次小值,然后记录最小值时(i)或者(j)的个数..
[2016.10.18] Sticks
比较水吧..
维护最长不同颜色的三根木棒就好了..
[2016.10.18] *Conspiracy
这道是一道非常好的题..
首先2-sat找到一组解,然后就会发现一个性质:
只会有一个人从左边调去右边,也只会有一个人从右边调去左边..
因为两个左边的人中间一定有边,两个右边的人中间一定没边..
接着就分三种情况讨论:1)左边一个去右边 2)右边一个去左边 3)左右一个人交换..
可以先预处理出每个人如果改变将会影响到多少人,影响的人是谁
前两种的话,只要这个人一个人也不影响就行了
后面这一种也要分三种情况讨论:
1)(i)、(j)一个人也不影响..
2)(i)只影响(j),(j)一个人也不影响
3)(i)、(j)只影响一个人且就是对方
按照酱紫还会出现一种很奇妙的状况.. 就是有可能一边会一个人都没有..
这就要好好判断了..
[2016.10.19] *Dynamite
这是一道很经典的树形DP(也可以说是贪心)的好题啊..
丢链接跑.. http://blog.csdn.net/wzq_QwQ/article/details/48881753
[2016.10.21] Inspection
挺水的吧.. 只要(x)的最大子树比剩余子树的和都要大就是无解的..
然后需要考虑的就是最大子树刚好等于剩余节点的时候,这种情况下开始和结束的节点是相对确定的
至于怎么搞就好好想想吧
[2016.10.23] Programming Contest
之前用zkw费用流做的,蜜汁RE..
然后发现费用也就只有那么一条边有,那就不用这么复杂了..
仔细想想分层二分匹配再统计一下答案也是可以的
poi2010
[2016.10.21] Pilots
维护两个单调队列表示最大值最小值就好了..
[2016.10.21] Antisymmetry
跑个manacher就好了..
[2016.10.21] The Minima Game
排个序,可以知道如果一个人要取肯定要取前几个大的..
递推一个(f_i)表示前(i)个数先手的最大差值
[2016.10.21] Guilds
对于一个图,找个生成树黑白染色就是一个合法解,所以不合法的只有当这个联通块只有一个点
那么随便水..
[2016.10.21] Bridges
二分答案,先建边
然后根据度数用网络流反悔就行了..
[2016.10.24] Hamsters
暴力hash搞出(i)和(j)最少要多少字符就可以接上
然后倍增floyd就行了..
(map_{i,i})的初始化有点小坑
[2016.10.24] Monotonicity/Monotonicity 2
大概就像最长上升子序列,分三种情况来做..
至于为什么这样做是对的,我这里有神犇的证明
[2016.10.25] Sheep
一开始想简单了,以为题目的三角形都肯定是有一边在多边形边上的..
自己还一直认为自己的(O(nKlogK+n^3))做法是过不了的 的确过不了
然后%%%Claris.. 就知道了怎么dp了
md最后还智障了一发,自我认为(1)和(n-1)或者(2)和(n)一定要连边..
智商这么低noip都要挂啊..