10月做题记录。

不想做题了。。就花点时间整理一下做题记录?。。顺便口胡一下做题方法。。

  • CF52C Circular RMQ

线段树打下标记查个RMQ。。

  • P1840 Color the Axis_NOI导刊2011提高(05)

把黑色点赋值为1 把l~r修改成0
线段树每次修改完查询一下区间和

  • CF1234 A~F 那场比赛差5minAC的F题…(反正是div3 不说了。。)

  • P1640 [SCOI2010]连续攻击游戏

给出俩属性\(a\),\(b\) 问你构造出最长连续的一个序列
贪心一下 满足严格\(a \leq b\)\(a\) 排序然后乱搞搞。
复杂度 \(n \log n\)

  • P2071 座位安排

每个人有想坐的排数 每排坐俩人。。
把每排拆成俩点。。
网络流 把源点跟所有人连边 人再和俩点连边 最后每排拆出来的两个点和汇点连边
跑一个\(dinic\)就出来了。。

  • P3979 遥远的国度

换根树剖
1操作换根 2操作链上修改 3操作子树求RMQ。。
考虑换根的分类讨论 因为链是树中唯一的 无关根的位置 都是同一条链 所以操作二不需要分类讨论
3操作考虑的是根的位置(换根树剖的灵魂?。。)

inline int getfa(int x , int k) {
    for(register int i = 20 ; i >= 0 ; i --)
        if(k >= (1 << i)) k ^= (1 << i) , x = fa[x][i] ;
    return x ;
}
int root = 1 ;
inline void getans(int x) {
    if(x == root) {
        printf("%lld\n" , mn[1]) ;
        return ;
    }
    int y = 0 ;
    int p , q ;
    if(d[x] < d[root] && fa[y = getfa(root , d[root] - d[x] - 1)][0] == x) {
        p = Query(1 , id[y] - 1 , 1 , n , 1) ;
        if(id[y] + size[y] <= n) q = Query(id[y] + size[y] , n , 1 , n , 1) ;
        else q = INT_MAX ;
        printf("%lld\n" , min(p , q)) ;
    }
    else printf("%lld\n" , Query(id[x] , id[x] + size[x] - 1 , 1 , n , 1)) ;
}

默认根为1先跑个DFS1然后让换过根的和1做个比较就好了。。
复杂度 \(n \log^2 n\)

  • P1963 [NOI2009]变换序列

题意是求字典序最小的一个子序列 而一个数可以扩展成两个数 然后直接考虑二分图匹配。。
两个数按值建边 小的后放(前向星是倒着的。。) 然后跑出来肯定就是最小的那个字典序。。

  • P1758 [NOI2009]管道取珠

\(\sum_{i=1}^{tot} {cnt_i^2}\) \(tot\)是能构成的字符串总数。。\(cnt\)是该字符串的出现次数
得出转移方程

int len = i + j - k ;
if(a[i + 1] == a[k + 1]) f[(i & 1) ^ 1][j][k + 1] = (f[(i & 1) ^ 1][j][k + 1] + f[i & 1][j][k]) % Mod ;
if(a[i + 1] == b[len + 1]) f[(i & 1) ^ 1][j][k] = (f[(i & 1) ^ 1][j][k] + f[i & 1][j][k]) % Mod ;
if(b[j + 1] == a[k + 1]) f[i & 1][j + 1][k + 1] = (f[i & 1][j + 1][k + 1] + f[i & 1][j][k]) % Mod ;
if(b[j + 1] == b[len + 1]) f[i & 1][j + 1][k] = (f[i & 1][j + 1][k] + f[i & 1][j][k]) % Mod ;

滚动数组优化一下 内存\(n^2\) 时间\(n^3\)

  • P4130 [NOI2007]项链工厂

操作比较多 听说\(ODT\)好像跑的飞快?。。反正比较早期的题了。。这题用线段树维护一下 自己手工推算一下位置
然后用结构体存一下左右的颜色 然后颜色合并的时候数量-- 最后因为是个环状的再稍微考虑一下。

inline void Make(int & x , int & y) {
    if(! rev) {
        if(x >= tr + 1) x -= tr ;
        else x = n - tr + x ;
        if(y >= tr + 1) y -= tr ;
        else y = n - tr + y ;
    }
    else {
        if(x <= tr + 1) x = tr - x + 2 ;
        else x = tr + n - x + 2 ;
        if(y <= tr + 1) y = tr - y + 2 ;
        else y = tr + n - y + 2 ;
    } return ;
}

复杂度 \(n \log n\)

  • P2264 情书

字符串模拟题?。。不说了

  • P3690 【模板】Link Cut Tree (动态树)

LCT的板子(反正背板子就完事了

  • P2147 [SDOI2008]洞穴勘测

一个LCT的板子题 直接断边连边。。然后 \(findroot\)判断是否连通就行了。。

  • P2173 [ZJOI2012]网络

暴力的想法 建20棵LCT。。
3种操作
修改一个节点的权值
直接修改完 \(splay\)一下完事
修改一条边的颜色
把这条边在原有的地方\(cut\)掉 另一个LCT\(link\) 至于什么出现过没出现过啥的 \(map\) 存下不就好了
查询由颜色c的边构成的图中,所有可能在节点u到节点v之间的简单路径上的节点的权值的最大值 直接\(split\)求这种\(RMQ\)问题。。

  • P4867 Gty的二逼妹子序列

我以为数据很毒瘤?。。然后我就试了一下
直接莫队加上树状数组水过去了。。

就是用一个 \(cnt\) 统计出现次数 出现次数为1的时候增加贡献 为0就减掉贡献。。

P4271 [USACO18FEB]New Barns

大概题意就是合并两个连通块, 查询连通块内点到其他点的最大距离
直接反手一个 LCT 写上去。。动态维护一手。。

猜你喜欢

转载自www.cnblogs.com/Isaunoya/p/11764199.html