要做的题和要看的文章,长期更新

 

我先来存一下我的左偏树的模板,。,,

以后要搞左偏树,左式堆,斐波那契堆,等等。。这个模板很神奇的AC了。。

#include <cstdio>

#include <cstring>

#include <algorithm>

using namespace std;



#define MAXN 111111

#define na -1



typedef struct LiftistTreeNode

{

    int key;

    int l, r, f, dist;

    void init(int k = 0)

    {

        key = k;

        l = r = f = na;

        dist = 0;

    }

}node;



node tree[MAXN];

int n,m,key,x,y;

int iroot(int i)

{

    if(i == na)

        return i;

    while(tree[i].f != na)

        i = tree[i].f;

    return i;

}



int merge(int rx, int ry)

{

    if(rx == na)    return ry;        //如果左堆为空 

    if(ry == na)    return rx;        //如果右堆为空 

    

    if(tree[rx].key < tree[ry].key)    //大项堆 (即性质一)

        swap(rx,ry);

    int r = merge(tree[rx].r,ry);    //左堆的右孩子和右堆合并,并返回根给r 

    tree[rx].r = r;                    //左堆的右孩子更新为合并后的r 

    tree[r].f = rx;                    //更新r的父亲为左堆 

    

    //性质二,节点的左子节点的距离不小于右子节点的距离

    //即 dist[l[i]] >= dist[r[i]] 

    if(tree[rx].l == na || tree[r].dist > tree[tree[rx].l].dist)

        swap(tree[rx].l,tree[rx].r);

    //最后更新距离,左边不更新,因为插入在右边(其实是合并在右边) 

    //这边有一个性质三,节点的距离等于它的右子节点的距离加上1

    //即 dist[i] = dist[r[i]] + 1

    if(tree[rx].r == na)    tree[rx].dist = 0;

    else                    tree[rx].dist = tree[tree[rx].r].dist + 1;

    return rx;

}



//插入操作,本质是合并 

int ins(int i,int key,int rt)

{

    tree[i].init(key);

    return rt = merge(rt,i);

}



int del(int i)

{

    if(i == na)

        return i;

    int x, y, l, r;

    l = tree[i].l, r =tree[i].r, y = tree[i].f;

    tree[i].l = tree[i].r = tree[i].f = na;

    tree[x = merge(l,r)].f = y;

    if(y != na && tree[y].l == i)

        tree[y].l = x;

    if(y != na && tree[y].r == i)

        tree[y].r = x;

    for(;y != na; x = y, y = tree[y].f)

    {

        if(tree[tree[y].l].dist < tree[tree[y].r].dist)    swap(tree[y].l,tree[y].r);

        if(tree[tree[y].r].dist + 1 == tree[y].dist) break;

        tree[y].dist = tree[tree[y].r].dist + 1;

    }

    if(x != na)    return iroot(x);

    else        return iroot(y);

}



node top(int rt)            //获得堆顶部元素,大项堆为最大值 

{

    return tree[rt];

}



node pop(int &rt)            //抛出堆顶部的元素,大项堆为最大值 

{

    node out = tree[rt];

    int l = tree[rt].l, r = tree[rt].r;

    tree[rt].init();

    if(l != na)    tree[l].f = na;

    if(r != na)    tree[r].f = na;

    rt = merge(l,r);

    return out;

}



int add(int i,int val)        //单点修改 tree[i].key += val

{

    if(i == na)        return i;

    if(tree[i].l == na && tree[i].r == na && tree[i].f == na)

    {

        tree[i].key += val;

        return i;

    }

    int key = tree[i].key + val;

    int rt = del(i);

    return ins(i,key,rt);

        

}





void solve(int x,int y)

{

    tree[x].key /= 2;

    tree[y].key /= 2;

    int l = del(x), r = del(y);

    l = merge(l,x);

    r = merge(r,y);

    l = merge(l,r);

    printf("%d\n",tree[l].key);

}



int main()

{

    while(~scanf("%d",&n))

    {

        for(int i=1;i<=n;i++)    

        {

            scanf("%d",&key);

            tree[i].init(key);

        }

        scanf("%d",&m);

        for(int i=1;i<=m;i++)

        {

            scanf("%d %d",&x,&y);

            int fx = iroot(x), fy = iroot(y);

            if(fx == fy)    puts("-1");

            else            solve(fx,fy);

        }

    }

    return 0;

}

 

 

HDOJ-1425    Sort          (简单Hash)
HDOJ-1800    Flying to the Mars   (ELFHash)
HDOJ-1496    Equations       (等式两边Hash)
HDOJ-1228    A + B         (模拟)
HDOJ-1043    Eight        (康托展开,BFS预处理,A*,IDA*,双广,等等)  (还有待优化和提高)
HDU 4648   Magic Pen 6      (dp  Hash)    (目前自己的解法是用的两次排序)

ELFHash BKDRHash 131Hash

HDU 4277 USACO ORZ(DFS+set去重,DFS+Hash去重,DFS+状态压缩)

HDU 4495 Rectangle 多项式hash+二分+dp

HDU 4618 Palindrome Sub-Array 暴力一波流

POJ 3274 Gold Balanced Lineup  (这道题真心是一道好题,包括处理,包括Hash,做了很久!)

POJ 3349 Snowflake Snow Snowflakes 又是一道好题,POJ的都是好题啊。。冲突处理,Hash,我喜欢雪花

 POJ 1743

POJ 1200 Crazy Search 字符串Hash,转换成NC进制的数

POJ 2002

poj2946

POJ 2513

POJ 2758

POJ 3640

POJ 2503   Babelfish        (Trei树,字符串hash  ELFHash)

 

HDU 4334 Trouble 枚举+散列+线性探测解决冲突

HDU 2523 SORT AGAIN  简单Hash

HDU 2648 Shopping   BKDRHash +  vector解决冲突

HDU 4020  (树状数组   , hash)

 

 

//exKMP

HDU 4333  Revolving Digits  (扩展KMP)

HDU 4300  Clairewd’s message  (KMP 或 扩展KMP)

HDU 3613  Best Reward      (拓展KMP求前缀回文串 也可KMP)

HDU 3068  最长回文子串      (manacher算法O(n),扩展KMP递归,或后缀数组)

HDU 2185 (二维的KMP,好题)

 

//需要学习BKDRHash 和 ELFHash

//需要学习二分 + dp

北京邀请赛J题

 

HDU 4670(树基于点的分治算法 + Hash)    树链剖分 

//树基于点的分治算法,可以参见国家集训队论文:2009年漆子超《分治算法在树的路径问题中的应用》

//树链剖分:http://www.cnblogs.com/kuangbin/archive/2013/08/12/3253734.html

kuangbin博客

 

//Trie->后缀Trie->后缀树->后缀数组

//后缀树跟后缀Trie有着一样的布局, 但它把只有一个儿子的节点给剔除了. 这个过程被称为路径压缩, 这意味着树上的某些边将表示一个序列而不是单独的字符.

//后缀树组推荐         后缀树组

高质量三篇博客

http://www.cnblogs.com/wuyiqi/archive/2012/04/27/2473895.html

//http://hi.baidu.com/ahnkftravhdhkyr/item/cc38703dd46547cd392ffab1

//http://blog.csdn.net/nomad2/article/details/7670963

 

 

 

 

http://blog.csdn.net/non_cease/article/details/7292073

http://blog.csdn.net/lyy289065406/article/details/6647413

http://yzmduncan.iteye.com/blog/883843

http://www.cnblogs.com/devil-91/archive/2012/08/22/2650912.html

POJ 2002 Squares

 POJ 2081

NYOJ 138 找球号(二)

 

 

 

http://blog.csdn.net/god_wot/article/details/10522405

http://wuyuans.com/2012/05/github-simple-tutorial/

http://lazynight.me/2898.html

 

说明:小弟才疏学浅,最近发现此文点击率较高,还有一些转载,实在是万分惭愧。
这份题目推荐里面,实在水题烂题太多,上不得台面,等今年赛区赛结束后,本菜一定好好清理下此贴。

POJ 1002 - 487-3279(基础)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1002
题意:略
解法:二叉查找数,map,快排...

POJ 1200 - Crazy Search(基础)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1200
题意:找出不相同的子串数量,字母表大小和子串长度会给定,这题很推荐hash入门者一做
解法:hash(建议karp-rabin)

POJ 1204 - Word Puzzles(基础)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1204
题意:基本多串匹配
解法:多串匹配自动机(单串去弄肯定会超时)

POJ 1229 - Wild Domains(中等)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1229
题意:模糊匹配
解法:dp

POJ 1625 - Censored!(中等)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1625
题意:求长度为n不包括给定模式串的字符串数量。(题意同2778,但不能按2778的方法,建议先做此题,再做2778)
解法:Aho-Corasick自动机 + dp
相关:http://hi.baidu.com/zfy0701/blog/item/c62f41afca8180ca7cd92a19.html

POJ 1743 - Musical Theme(中等)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1743
题意:找一个串中最长不重叠子串
解法:后缀数组+二分枚举答案,后缀数组+栈扫描,RK+二分枚举答案
相关:http://hi.baidu.com/zfy0701/blog/item/f2278a0928991dca3bc763a0.html

POJ 1816 - Wild Words(中等,绝对的Trie应用好题,同时又是搜索好题)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1816
题意:扩展多串模式匹配(含?, *)
解法:Trie + dfs,有兴趣也可用基于位并行的自动机(可参考柔性字符串匹配,扩展匹配章节)

POJ 2185 - Milking Grid(中等)
http://acm.pku.edu.cn/JudgeOnline/problem?id=2185
题意:最小矩型的覆盖
解法:KMP (不多的KMP好题)
相关:http://acm.pku.edu.cn/JudgeOnline/showmessage?message_id=33571

POJ 2513 - Colored Sticks(基础)
http://acm.pku.edu.cn/JudgeOnline/problem?id=2513
题意:转化成欧拉回路
解法:并查集+hash,并查集+Trie

POJ 2774 - Long Long Message(中等)
http://acm.pku.edu.cn/JudgeOnline/problem?id=2774
题意:找两个串的公共最长子串
解法:后缀数组,Oracle Factor自动机,后缀自动机
相关:http://hi.baidu.com/zfy0701/blog/item/f2278a0928991dca3bc763a0.html
http://hi.baidu.com/zfy0701/blog/item/d9fedbd14581113d9b5027ab.html

POJ 2778 - DNA Sequence(中等)
http://acm.pku.edu.cn/JudgeOnline/problem?id=2778
题意:求长度为n不包括给定模式串的字符串数量。
解法:Aho-Corasick自动机(前缀树) + 矩阵快速乘法
相关:http://hi.baidu.com/zfy0701/blog/item/f2278a0928991dca3bc763a0.html
类似于1625,建议先做1625

POJ 1699 - Best Sequence(基础)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1699
题意:转换为TSP问题(注意子串的包含关系!)
解法:回溯,状态dp

POJ 3376 - Finding Palindromes(中等)
http://acm.pku.edu.cn/JudgeOnline/problem?id=3376
题意:找回文串组合
解法:找出规律,然后Trie + kmp推广形式

POJ 3415 - Common Substrings(较难)
http://acm.pku.edu.cn/JudgeOnline/problem?id=3415
题意:统计两个串中长度>=k的公共子串的数量
解法:后缀数组+栈扫描,后缀自动机
相关:http://hi.baidu.com/zfy0701/blog/item/f2278a0928991dca3bc763a0.html

POJ 3080 - Blue Jeans(如果用暴力,就很简单)
http://acm.pku.edu.cn/JudgeOnline/problem?id=3080
题意:求n个串的最长公共子串
解法:后缀数组+栈扫描,后缀数组+二分枚举,暴力
相关:http://hi.baidu.com/zfy0701/blog/item/57ada7edf5f44ed1b31cb1cc.html

POJ 3208 - Apocalypse Someday(较难)
http://acm.pku.edu.cn/JudgeOnline/problem?id=3208
题意:略
解法:有意思的自动机dp

POJ 3261 - Milk Patterns(中等)
http://acm.pku.edu.cn/JudgeOnline/problem?id=3261
题意:求一个串中重复出现至少k次的最长子串
解法:后缀数组+栈扫描,hash + 二分

POJ 3294 - Life Forms(较难,强烈推荐)
http://acm.pku.edu.cn/JudgeOnline/problem?id=3294
题意:n个串中,为大于n/2个串所共有的所有最长子串
解法:后缀数组+栈扫描,暴力(很容易被卡掉),后缀数组+线段树(?)
相关:http://hi.baidu.com/zfy0701/blog/item/57ada7edf5f44ed1b31cb1cc.html

POJ 3576 - Language Recognition(中等)
http://acm.pku.edu.cn/JudgeOnline/problem?id=3576
题意:求一个dfa,它满足两个条件,1、能识别所有词的dfa,2、要求状态数最少。
解法:trie + hash
相关:http://hi.baidu.com/zfy0701/blog/item/b8332b5cd90e7b45fbf2c033.html

POJ 3581 - Sequence(中等)
http://acm.pku.edu.cn/JudgeOnline/problem?id=3581
题意:把原串分三段并反转,求字典序最小的那串
解法:后缀数组
本来觉得很水,但却是我目前做得最失败的一道后缀数组题

 

POJ 3630 - Phone List(基础,强烈推荐用此题练Trie)
http://acm.pku.edu.cn/JudgeOnline/problem?id=3630
题意:给n个串,看是否有一个串是另一个串的前缀
解法:快排,Trie

POJ 3690 - Constellations(基础)
http://acm.pku.edu.cn/JudgeOnline/problem?id=3690
题意:二维串匹配
解法:转换为一维,或者用多串匹配

POJ 3691 - DNA repair(中等)
http://acm.pku.edu.cn/JudgeOnline/problem?id=3691
题意:修复非法字符串需要替换的最少字符数
解法:动态规划,如果使用AC自动机去做dp的话比较简单且只需要二维,用dp[i][j]表示第i个字符时,第j种状态(不是非法状态)所需要最小的修改量

POJ 3693 - Maximum repetition substring(难)
http://acm.pku.edu.cn/JudgeOnline/problem?id=3693
题意:求最循环节最多的子串
解 法:我所知道的最好的做法应该是先做s-factorization(也就是lempel-ziv),然后在分解之后的每一段中枚举周期,周期可以通过推 导关系式确定是否合法,然后可确定循环次数,取最大的,中间还用到了对kmp的扩展。具体来说有KK算法,和ML算法两种,其中ML不能遍历所有的 runs。

其他OJ:

SPOJ 2743 - Prefix Tiling
http://www.spoj.pl/problems/PRETILE/

找规律

空罐 Cans(这个自动机dp还是有意思的)
http://cat.nknush.kh.edu.tw/ZeroJudge/ShowProblem?problemid=b179

HDOJ 2471 - History of Languages(杭州现场赛)
http://acm.hdu.edu.cn/showproblem.php?pid=2471
自动机的等价性,划分集合的dp

HDU 2967 - Morphing is fun
http://acm.hdu.edu.cn/showproblem.php?pid=2967
UVA上也过得人比较少的一道题,需要分情况讨论几种情况,我09年过的最得意的题

 

 

 

你可能感兴趣的:(更新)