• 思维的体操


    博主现在是一位(ACMer)萌新,目前阶段在CF上找1800分左右的思维题做做。

    在此记录一下吧。

    CF1010C -1800'

    由裴蜀定理可知,由这(n)个数能得到的余数集和他们的(gcd)一个数得到的余数集是相同的

    CF1096D -1800'

    (f[i][j])表示前(i)个数最多拼到(hard)的前(j)位的最小代价
    (s[i]==h[j+1]),那么(f[j]=min(f[i-1][j]+a[i],f[i-1][j-1]))
    要么删要么让(hard)中断嘛。
    否则(f[i][j]=f[i-1][j])
    显然第一维可以滚掉。

    CF1283E -1800'

    贪心
    最小值:把所有坐标从小到大排序,从左到右扫一遍,对于有人的坐标,如果左边一个单位没有人就左移,然后还有1个人就不动,还有2个或以上的话就右移一个
    最大值:从左到右每碰到一个有人的坐标就把以这个坐标为起点的3个点合并

    CF813B -1800'

    暴力
    把所有(x^a+b^y)放到一个数列里两两区间和([L,R])求交集即可。

    CF358D -1800'

    DP
    (f[i][1])表示前(i)个先拿第(i)个再拿第(i-1)个的最大值
    (f[i][0])表示前(i)个先拿第(i-1)个再拿第(i)个的最大值
    边界(f[1][1]=0),其它均为(-inf)

    CF911D -1800'

    对于长度为(len)的区间,数对个数为(sum=len*(len-1)/2)
    设翻转后逆序对数量为(rest),则翻转前逆序对数量为(sum-rest)
    两者只差也就是变化量为(sum-rest*2)
    后者显然是偶数,于是只要判断(sum)的奇偶性即可判断奇偶性是否变化

    CF909C -1800'

    DP
    (f[i][j])表示前(i)个,第(i)个缩进到(j)的方案数
    若第(i-1)位是(for)的话,那第(i)位必须缩进,(f[i][j]=f[i-1][j-1])
    若第(i-1)位不是(for)的话,(f[i][j]=sum_{k=j}^{n}f[i-1][k])
    维护一下后缀和即可

    CF1446B -1800'

    DP
    最大子序列的思路,设(f[i][j])表示以(a_i,b_j)结尾的最大值,然后考虑继不继承前面的答案就行

    CF543A -1800'

    完全背包,注意模数别开(long long)

    CF1221D -1800'

    DP
    首先一个很重要的结论就是每个栅栏加1的次数只能是(0,1,2)
    于是令(f[i][j])表示前(i)个栅栏,第(i)个栅栏加长(j)次使得没有相邻相等的情况的最小花费,然后按情况转移即可。
    答案就是(min {f[n][0], f[n][1], f[n][2]})

    CF1381B -1800'

    观察可以发现,(n*2)及以后的数肯定在一段里的,然后(n*2-1~n*2)区间内也是在一段里的。
    于是就将原数列分成了若干段,然后跑(01)背包看能不能拼出(n)就行了。

    CF1509C -1800'

    DP
    把原数列排序,令排序后的数列为(a),显然最终数列前(i)位一定是(a)中连续的一段。
    于是令(f[i][j])表示把(i~j)这一段作为最终数列的答案,
    (f[i][j]=min(f[i+1][j],f[i][j-1])+a[j]-a[i])
    答案就是(f[1][n])

    CF478C -1800'

    具体方案无需考虑,显然当数量最多的气球不超过其它2种颜色的时候答案就是总气球数除以(3),否则答案为其它2种颜色气球数的和。

    CF687C -1900'

    DP
    (f[i][j])表示一堆为(i)一堆为(j)的情况是否存在,然后就是(01)背包的那一套了。
    最后对每个(i)(f[i][k-i])是否非零即可。

    CF1117C -1900'

    二分答案
    判断(mid)秒能不能行先让风刮(mid)秒,再看和终点的距离在不在(mid)以内即可。

    CF1114D -1900'

    DP
    读入的时候把颜色相同的区间合并,然后
    (f[i][j])表示区间([i,j])变成颜色一样的最小次数。

    [f[i][j]=left{ egin{aligned} f[i+1][j-1]+1, a[i]=a[j] \ min(f[i+1][j], f[i][j-1]) + 1, a[i] eq a[j] end{aligned} ight.]

    CF535C -1900'

    二分答案
    一个(R)是可行的当且仅当(A+(R-1)*B<=T)([L,R])的食物总量(<=M*T)

    CF803C -1900'

    显然(n)一定是最大公约数(d)的倍数,于是枚举(d),判断(k>=d*n*(n+1)/2)是否成立即可。
    直接判断会爆long long,移项即可。

    CF10C -2000'

    一个关键性的结论就是(s(x)=xmod 9),所以

    [d(x)=left{ egin{aligned} xmod 9, xmod 9 eq 0 \ 9, xmod 9=0 end{aligned} ight.]

    于是用桶统计余数为(0 o 9)的个数,然后枚举(A,B,C)的余数,统计即可。
    最后要减去(A*B=C)的情况,数论分块一下就行。

    CF59E -2000'

    这种有限制的最短路,而且边权为(1)的,用(bfs)就好了。
    用哈希表记录三元组,最后队列里存边,最短路和前驱都用边存。

    CF15C -2000'

    显然每一辆车都是一个独立的(nim)游戏,直接求异或和就好了。
    暴力求当然会(T),考虑到偶数和下一位的异或和肯定是(1),于是处理一下首尾即可。

    CF1601B -1900'

    (f[i])表示跳到(i)(也就是滑到(i+b[i]))处的最小步数。
    定义(l[i])为深度为(i)处能跳到的最高点,显然

    [l[i]=max(i-a[i], 1) ]

    然后考虑转移,

    [f[i]=min_{l[j+b[j]]<=i}{f[j]}+1 ]

    至于(j)怎么求,可以用树状数组维护前缀最大值

    CF1601C -2300'

  • 相关阅读:
    SP375 QTREE
    「2017 山东一轮集训 Day5」字符串 (后缀自动机, 拓扑排序)
    [SDOI2016]生成魔咒(后缀自动机)
    bzoj3252: 攻略(贪心)
    bzoj2961 共点圆 (CDQ分治, 凸包)
    [CTSC2012]熟悉的文章 (后缀自动机 单调队列)
    bzoj3622: 已经没有什么好害怕的了
    [SDOI2013]泉(容斥)
    [SHOI2012]信用卡凸包(计算几何)
    CF1139D Steps to One (莫比乌斯反演 期望dp)
  • 原文地址:https://www.cnblogs.com/Qihoo360/p/15403959.html
Copyright © 2020-2023  润新知