• 开坑了啦啦啦..


    写在前面的0.0..

    poi糊做..
    给自己挖一个无尽的深坑..


    开坑咯

    来看看做了几题..:

    58/?
    ##poi2015

    [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都要挂啊..

    作者:Ra1nbow
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    android实现 服务器功能
    jQuery部分源码帮助理解
    jquery 2.0.3代码结构
    Mac下配置JAVA_HOME
    用户环境变量
    你的apk有多不安全
    JadClipse eclipse反编译插件
    vim 使用笔记
    Makefile简易模板
    Linux watch 监控系统状态
  • 原文地址:https://www.cnblogs.com/darklove/p/5983969.html
Copyright © 2020-2023  润新知