代码编辑神器VIM


本文转自:http://blog.csdn.net/dinosoft/article/details/6330121

有些牛X的人性格会比较古怪,VIM就是这么一位特立独行,难以琢磨的怪客。但如果熟悉了,你就会发现他的好。

    VIM(VI,VIM,GVIM)这东西不好上手,而且是相当不好上手,基本上新手打开这个编辑器,想试着输入几个字符之后,便会很恼火地把VIM关掉。

    第一次接触vim是上网找工具自动缩进代码。在网上拷的代码因为html的原因,没处理好缩进会全乱掉,手动调那会蛋疼死的。这种机械的话显然要交给机器做。上网搜了一下,居然只找到vim的方法,所以自己就下了一个,gg=G,按了几个奇怪的按键,代码就自动缩进好了。

    我之前用过一下,也去看了一些资料,最后觉得这东西是历史的产物,是当年还没鼠标,图形界面不发达的产物。完完全全违反人机交互啊有木有!!所以便把VIM给抛弃了。不过最近又陆陆续续看到关于VIM的一些调侃,而且在一些IT公司的笔试题里面居然有考关于VIM的!所以我决心要好好研究一下VIM,迈入"使用VIM的装B高级程序员"  行列。毕竟这东西名气这么大,应该名不虚传吧。不花精力研究一下,恐怕就要错失一个好东东了。


自己使用后的体验:

  1. 手不用离开键盘,比较方便。不过因为我自己的Thinkpad笔记本带有小红帽,我后来基本就用那个,不用鼠标,确实手要离开键盘比较不方便。可能vim的一些特性优势就没有那么明显了。
  2. 按键的兼容问题。大部分人肯定都像我一样,win中毒很深,用ctrl+c,ctrl+v复制粘贴。但linux里面ctrl+c是interrupt signal。vim里面还有好几个寄存器,搞得想从系统粘贴还要按好多个键,我是受不了。当然,由于vim强大的自定义功能,按键可以自定义,改到自己合用。而win版的gvim已经更改好按键了。

个人认为最好的入门方法:

  1. 先明白vi有两种模式:命令模式和插入模式,按 i 进入插入模式,可进行一般的编辑;按 ESC 回到命令模式。其实还有一种是可视模式啦,按v。
  2. Vim命令速查卡!!(链接万一挂掉就自己搜吧)http://coolshell.cn/articles/150.html,这个版本直接打印会有问题,因为不是标准的A4,所以只打印出中间的一块,可以用我改好的版本http://ishare.iask.sina.com.cn/f/15406711.html

自己玩一下,先熟悉基本的编辑功能。


vim的扩展基本就是插件和快捷键映射,用gvim的话可以在菜单找到启动设定,会自动打开启动配置文件,在linux下是~/.vimrc


Vim进阶设置 


1.配色

使用vim肯定要选一个自己喜欢的代码高亮配色。
  1. 在线查看并下载(推荐这个) http://code.google.com/p/vimcolorschemetest/
  2. 打包下载,在 http://www.vim.org/scripts/script.php?script_id=625,由于配色很多,要一个一个试也很麻烦。可以使用插件ColorSchemeExplorer查看(选定后回车生效http://www.vim.org/scripts/script.php?script_id=1298)使用命令 :ColorSchemeExplorer  我自己本机上运行出现错误, 打开csExplorer.vim,用双引号注释掉第36行即可"  exe "silent bot ".10."new "."Color Explorer"

2.快速从模板建立文件

原帖地址:http://www.gracecode.com/archives/2414/

最近很多人被我“拉下水”尝试 (g)Vim,为了支持他们,我会编写些 Vim 脚本方便大家。

这里有个现成的需求,就是很多从 Editplus 转过来的同学,想让 Vim 有从模板新建文件的功能。那么,这篇文章可能就是你们想要的。

安装步骤

下载代码包以后,解压缩到$VIMRUNTIME 目录。重新启动 Vim,输入

/*在系统终端看不到这个变量,可以进入vim后输入 :echo $VIMRUNTIME。我的系统上是/usr/share/vim/vim72,注意只是把plugin解压到$VIMRUNTIME 目录,(后记:其实~/.vim/plugin目录才是正道!)template要放到下面提到的对应目录,作者应该是在windows下的,那个插件脚本是win格式的换行,在我的ubuntu上启动的时候报错,我用Geany改成Unix格式的换行就行了。*/

//注意:在我的ubuntu下,更新gvim后,目录的版本号也变了,变成/usr/share/vim/vim73了

:NewTemplate xhtml

就可以建立个 XHTML 模板,如果是 Vim 7.0 以上的版本,还有个命令

:NewTemplateTab xhtml

即可在新的标签页中新建文件。当然可以映射快捷键,快速新建常用的文件类型,比如我的

" 新建 XHTML 的快捷键 map nn :NewTemplateTab xhtml<cr>

在 normal 模式下,连续按两次 n 就可以在新标签页建立 xhtml 文件了。

配置脚本

此插件文件的路径在

$VIMRUNTIME/plugin/Template.vim

下,主要有两个配置选项,默认为

let g:TemplatePath=$VIM.'/vimfiles/template/' let g:TemplateCursorFlag='#cursor#'

其中,g:TemplatePath 为模板路径,而 g:TemplatePathCursorFlag 则为新建模板以后鼠标移动到的位置(如无指定,则移动到文件底部)。

增加模板

//我自己加了c++的模版,注意名字为cpp.tpl,不是c++.tpl。会根据名字语法高亮,所以不能随便起。

脚本支持用户新建模板,找到 g:TemplatePath 中的 xhtml.tpl 目录。参考其中的内容

<html> <body> #cursor# </body> </html>

应该很容易理解。比如需要新建 python 模板。则在 g:TemplatePath 中建立 python.tpl 并加入#cursor# 的位置即可。

 

3.我写acm程序的配置

先说明具体想要达到的功能:

  1. 快速从模版新建c++文件。开头那些include什么的就不用写了。(上面介绍的模版已实现)
  2. 按一下按键把粘贴板的内容(测试数据保存到指定文件)。
  3. 按一下按键编译,按一下按键自动运行(输入重定向到那个测试数据文件)。
  4. gdb调试(这东西涉及进程通讯,所以要通过对源码打补丁,再重新编译,不能直接通过插件安装,我猜想应该是这样)
第二点。配置如下:

<div bg_plain"="" style="font-family: Consolas, 'Courier New', Courier, mono, serif; font-size: 12px; width: 1118px; overflow: auto; padding-top: 1px; margin: 18px 0px !important; background-color: rgb(231, 229, 220);">
[plain] view plaincopy
  1. map <F9> :call SaveInputData()<CR>  
  2. func! SaveInputData()  
  3. exec "tabnew"  
  4. exec 'normal "+gP'  
  5. exec "w! /tmp/input_data"  
  6. endfunc  

按F9之后,会新打开一个tab,然后在正常模式执行“+gP,也就是粘贴,接着w!强制写入到/tmp/input_data文件,放到/tmp,无垃圾,绿色环保!

第三点:

网上一般介绍用按键映射gcc编译命令,但这样会有问题,就是无法使用quickfix窗口(参看附录那篇文章的介绍),也就是出错后我们可以打开quickfix窗口显示出错信息,而不是切换回编辑模式那些出错信息就没了,而且支持直接跳转到出错代码行。

我们把按键映射到命令:make即可。而make是根据set makeprg=g++\ %\ -o\ /tmp/a   自动设置编译参数的。生成到/tmp/a,一样环保!

最后我们这些下面的设置就能一键运行了:

[plain] view plaincopy
  1. -g  
  2. 加入调试代码,可以在完成后使用 strip命令删除用于调试的信息   


well蛋!


附录:

推荐一篇好文章

手把手教你把Vim改装成一个IDE编程环境(图文)

原文地址:http://blog.csdn.net/wooin/archive/2007/10/31/1858917.aspx

 

我自己的 ~/.gvimrc文件(或~/.vimrc)

<div bg_plain"="" style="font-family: Consolas, 'Courier New', Courier, mono, serif; font-size: 12px; width: 1118px; overflow: auto; padding-top: 1px; margin: 18px 0px !important; background-color: rgb(231, 229, 220);">
[plain] view plaincopy
  1. sset encoding=utf8  
  2.   
  3. let g:vimgdb_debug_file = ""  
  4. run macros/gdb_mappings.vim   
  5.   
  6. set langmenu=zh_CN.UTF-8  
  7.   
  8. set imcmdline  
  9.   
  10. source $VIMRUNTIME/delmenu.vim  
  11.   
  12. source $VIMRUNTIME/menu.vim  
  13. set backspace=indent,eol,start  
  14. set whichwrap=b,s,<,>,[,]   
  15. syntax on   
  16.   
  17. set nocompatible  
  18. set number  
  19. set cin  
  20. set autoindent  
  21. set smartindent  
  22. set tabstop=4  
  23. set shiftwidth=4  
  24. set showmatch  
  25. set et  
  26. set autochdir  
  27.   
  28. let Tlist_Show_One_File=1  
  29. let Tlist_Exit_OnlyWindow=1  
  30.   
  31. let g:winManagerWindowLayout='FileExplorer|TagList'  
  32. nmap wm :WMToggle<cr>  
  33.   
  34. filetype plugin indent on  
  35. set completeopt=longest,menu  
  36.   
  37. let g:SuperTabRetainCompletionType=2  
  38. let g:SuperTabDefaultCompletionType="<C-X><C-O>"  
  39.   
  40.   
  41. map <F5> :w<CR>:make<CR>  
  42. imap <F5> :w<CR>:make<CR>  
  43.   
  44. "map <F12> :call CompileCpp()<CR>  
  45. "func! CompileCpp()  
  46. "exec "w"  
  47. "exec "!g++ -g % -o /tmp/a"  
  48. "endfunc  
  49.   
  50. map <F6> :call ExecCpp()<CR>  
  51. func! ExecCpp()  
  52. exec "!/tmp/a < /tmp/input_data"  
  53. endfunc  
  54.   
  55. map <F9> :call SaveInputData()<CR>  
  56. func! SaveInputData()  
  57. exec "tabnew"  
  58. exec 'normal "+gP'  
  59. exec "w! /tmp/input_data"  
  60. endfunc  
  61.   
  62. map <F8> :call RunPython()<CR>  
  63. func! RunPython()  
  64. exec "w"  
  65. exec "!python %"  
  66. endfunc  
  67.   
  68.   
  69. "source $VIMRUNTIME/mswin.vim  
  70. "behave mswin  
  71.   
  72. map <A-c> NewTemplateTab cpp<cr>  
  73. map <A-p> NewTemplateTab python<cr>  
  74.   
  75. "map nn :NewTemplateTab cpp<cr>  
  76. "map np :NewTemplateTab python<cr>  
  77. autocmd FileType python setlocal et sta sw=4 sts=4  
  78.   
  79.   
  80.   
  81. let g:pydiction_location = '/home/dinosoft/.vim/pydiction/complete-dict'  
  82. set makeprg=g++\ -g\ %\ -o\ /tmp/a     
  83. autocmd FileType cpp nmap <C-N> :cn<cr>  
  84. autocmd FileType cpp nmap <C-P> :cp<cr>  
  85. color tango-desert  
  86.   
  87. :inoremap ( ()<ESC>i  
  88. :inoremap ) <c-r>=ClosePair(')')<CR>  
  89. :inoremap { {<CR>}<ESC>O  
  90. :inoremap } <c-r>=ClosePair('}')<CR>  
  91. :inoremap [ []<ESC>i  
  92. :inoremap ] <c-r>=ClosePair(']')<CR>  
  93. ":inoremap " ""<ESC>i  
  94. ":inoremap ' ''<ESC>i  
  95.   
  96. function ClosePair(char)  
  97.   if getline('.')[col('.') - 1] == a:char  
  98.       return "\<Right>"  
  99.   else  
  100.       return a:char  
  101.   endif  
  102. endfunction  
  103.   
  104. nmap <S-Insert> "+gP  
  105. imap <S-Insert> <ESC><S-Insert>i  
  106. vmap <C-C> "+y  
  107. vmap <S-Insert> "+gP  
  108.   
  109. nmap <C-left> gt  
  110. imap <C-left> gt  
  111.   
  112. nmap <C-right> gT  
  113. imap <C-right> gT  
  114.   
  115. nmap <C-S> :w!  
  116. imap <C-S> :w!  
  117.   
  118. map <C-A> ggVG  

~/.vim/macros/gdb_mappings.vim 
<div bg_plain"="" style="font-family: Consolas, 'Courier New', Courier, mono, serif; font-size: 12px; width: 1118px; overflow: auto; padding-top: 1px; margin: 18px 0px !important; background-color: rgb(231, 229, 220);">
[plain] view plaincopy
  1. " Mappings example for use with gdb  
  2. " Maintainer:   <xdegaye at users dot sourceforge dot net>  
  3. " Last Change:  Mar 6 2006  
  4.   
  5. if ! has("gdb")  
  6.     finish  
  7. endif  
  8.   
  9. let s:gdb_k = 1  
  10. map <F7> :call <SID>Toggle()<CR>  
  11.   
  12. " Toggle between vim default and custom mappings  
  13. function! s:Toggle()  
  14.     if s:gdb_k  
  15.     let s:gdb_k = 0  
  16. " easwy add  
  17. if ! exists("g:vimgdb_debug_file")  
  18.     let g:vimgdb_debug_file = ""  
  19. elseif g:vimgdb_debug_file == ""  
  20.     call inputsave()  
  21.    let g:vimgdb_debug_file =  expand("%:r:t")  
  22.    call inputrestore()  
  23. endif  
  24. call gdb("file /tmp/a")  
  25. "call gdb("file " . g:vimgdb_debug_file)  
  26. " easwy end   
  27.   
  28.     map <Space> :call gdb("")<CR>  
  29.     nmap <silent> <C-Z> :call gdb("\032")<CR>  
  30.   
  31.     nmap <silent> B :call gdb("info breakpoints")<CR>  
  32.     nmap <silent> L :call gdb("info locals")<CR>  
  33.     nmap <silent> A :call gdb("info args")<CR>  
  34.     nmap <silent> S :call gdb("step")<CR>  
  35.     nmap <silent> I :call gdb("stepi")<CR>  
  36.     nmap <silent> <C-N> :call gdb("next")<CR>  
  37.     nmap <silent> X :call gdb("nexti")<CR>  
  38.     nmap <silent> F :call gdb("finish")<CR>  
  39.     nmap <silent> R :call gdb("run")<CR>  
  40.     nmap <silent> Q :call gdb("quit")<CR>  
  41.     nmap <silent> C :call gdb("continue")<CR>  
  42.     nmap <silent> W :call gdb("where")<CR>  
  43.     nmap <silent> <C-U> :call gdb("up")<CR>  
  44.     nmap <silent> <C-D> :call gdb("down")<CR>  
  45.   
  46.     " set/clear bp at current line  
  47.     nmap <silent> <C-B> :call <SID>Breakpoint("break")<CR>  
  48.     nmap <silent> <C-E> :call <SID>Breakpoint("clear")<CR>  
  49.   
  50.     " print value at cursor  
  51.     nmap <silent> <C-P> :call gdb("print " . expand("<cword>"))<CR>  
  52.   
  53.     " display Visual selected expression  
  54.     vmap <silent> <C-P> y:call gdb("createvar " . "<C-R>"")<CR>  
  55.   
  56.     " print value referenced by word at cursor  
  57.     nmap <silent> <C-X> :call gdb("print *" . expand("<cword>"))<CR>  
  58.   
  59.     echohl ErrorMsg  
  60.     echo "gdb keys mapped"  
  61.     echohl None  
  62.   
  63.     " Restore vim defaults  
  64.     else  
  65.     let s:gdb_k = 1  
  66. " easwy add  
  67. call gdb("quit")  
  68. " end easwy  
  69. "  
  70.     nunmap <Space>  
  71.     nunmap <C-Z>  
  72.   
  73.     nunmap B  
  74.     nunmap L  
  75.     nunmap A  
  76.     nunmap S  
  77.     nunmap I  
  78.     nunmap <C-N>  
  79.     nunmap X  
  80.     nunmap F  
  81.     nunmap R  
  82.     nunmap Q  
  83.     nunmap C  
  84.     nunmap W  
  85.     nunmap <C-U>  
  86.     nunmap <C-D>  
  87.   
  88.     nunmap <C-B>  
  89.     nunmap <C-E>  
  90.     nunmap <C-P>  
  91.     nunmap <C-X>  
  92.   
  93.     echohl ErrorMsg  
  94.     echo "gdb keys reset to default"  
  95.     echohl None  
  96.     endif  
  97. endfunction  
  98.   
  99. " Run cmd on the current line in assembly or symbolic source code  
  100. " parameter cmd may be 'break' or 'clear'  
  101. function! s:Breakpoint(cmd)  
  102.     " An asm buffer (a 'nofile')  
  103.     if &buftype == "nofile"  
  104.     " line start with address 0xhhhh...  
  105.     let s = substitute(getline("."), "^\\s*\\(0x\\x\\+\\).*{1}quot;, "*\\1", "")  
  106.     if s != "*"  
  107.         call gdb(a:cmd . " " . s)  
  108.     endif  
  109.     " A source file  
  110.     else  
  111.     let s = "\"" . fnamemodify(expand("%"), ":p") . ":" . line(".") . "\""  
  112.     call gdb(a:cmd . " " . s)  
  113.     endif  
  114. endfunction  
  115.   
  116. " map vimGdb keys  
  117. "call s:Toggle()  

博主ma6174对本博客文章(除转载的)享有版权,未经许可不得用于商业用途。转载请注明出处http://www.cnblogs.com/ma6174/

对文章有啥看法或建议,可以评论或发电子邮件到ma6174@163.com


1 字符串处理 5 1.1 KMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.2 e-KMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.3 Manacher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.4 AC 自动机 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.5 后缀数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.5.1 DA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.5.2 DC3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.6 后缀自动机 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 1.6.1 基本函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 1.6.2 例题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.7 字符串 hash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2 数学 25 2.1 素数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.1.1 素数筛选(判断 <MAXN 的数是否素数) . . . . . . . . . . . . . . . . 25 2.1.2 素数筛选(筛选出小于等于 MAXN 的素数) . . . . . . . . . . . . . . . 25 2.1.3 大区间素数筛选(POJ 2689) . . . . . . . . . . . . . . . . . . . . . . . 25 2.2 素数筛选和合数分解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.3 扩展欧几里得算法(求 ax+by=gcd 的解以及逆元) . . . . . . . . . . . . . . . 27 2.4 求逆元 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.4.1 扩展欧几里德法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.4.2 简洁写法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.4.3 利用欧拉函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.5 模线性方程组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.6 随机素数测试和大数分解 (POJ 1811) . . . . . . . . . . . . . . . . . . . . . . . 29 2.7 欧拉函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.7.1 分解质因素求欧拉函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.7.2 筛法欧拉函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.7.3 求单个数的欧拉函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.7.4 线性筛(同时得到欧拉函数和素数表) . . . . . . . . . . . . . . . . . . 32 2.8 高斯消元(浮点数) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2.9 FFT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 2.10 高斯消元法求方程组的解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 2.10.1 一类开关问题,对 2 取模的 01 方程组 . . . . . . . . . . . . . . . . . . . 37 2.10.2 解同余方程组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 2.11 整数拆分 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 2.12 求 A B 的约数之和对 MOD 取模 . . . . . . . . . . . . . . . . . . . . . . . . . . 43 2.13 莫比乌斯反演 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 2.13.1 莫比乌斯函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 2.13.2 例题:BZOJ2301 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 2.14 Baby-Step Giant-Step . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 2.15 自适应 simpson 积分 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 2.16 斐波那契数列取模循环节 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 2.17 原根 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 2.18 快速数论变换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 2.18.1 HDU4656 卷积取模 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 2.19 其它公式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 2.19.1 Polya . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 kuangbin 1 ACM Template of kuangbin 3 数据结构 56 3.1 划分树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 3.2 RMQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 3.2.1 一维 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 3.2.2 二维 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 3.3 树链剖分 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 3.3.1 点权 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 3.3.2 边权 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 3.4 伸展树(splay tree) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 3.4.1 例题:HDU1890 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 3.4.2 例题:HDU3726 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 3.5 动态树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 3.5.1 SPOJQTREE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 3.5.2 SPOJQTREE2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 3.5.3 SPOJQTREE4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 3.5.4 SPOJQTREE5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 3.5.5 SPOJQTREE6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 3.5.6 SPOJQTREE7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 3.5.7 HDU4010 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 3.6 主席树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 3.6.1 查询区间多少个不同的数 . . . . . . . . . . . . . . . . . . . . . . . . . . 95 3.6.2 静态区间第 k 大 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 3.6.3 树上路径点权第 k 大 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 3.6.4 动态第 k 大 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 3.7 Treap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 3.8 KD 树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 3.8.1 HDU4347 K 近邻 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 3.8.2 CF44G . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 3.8.3 HDU4742 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 3.9 替罪羊树 (ScapeGoat Tree) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 3.9.1 CF455D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 3.10 动态 KD 树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 3.11 树套树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 3.11.1 替罪羊树套 splay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 4 图论 130 4.1 最短路 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 4.1.1 Dijkstra 单源最短路 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 4.1.2 Dijkstra 算法 + 堆优化 . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 4.1.3 单源最短路 bellman_ford 算法 . . . . . . . . . . . . . . . . . . . . . . . 131 4.1.4 单源最短路 SPFA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 4.2 最小生成树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 4.2.1 Prim 算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 4.2.2 Kruskal 算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 4.3 次小生成树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 4.4 有向图的强连通分量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 4.4.1 Tarjan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 4.4.2 Kosaraju . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 4.5 图的割点、桥和双连通分支的基本概念 . . . . . . . . . . . . . . . . . . . . . . . 138 4.6 割点与桥 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 4.6.1 模板 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 kuangbin 2 ACM Template of kuangbin 4.6.2 调用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 4.7 边双连通分支 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 4.8 点双连通分支 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 4.9 最小树形图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 4.10 二分图匹配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 4.10.1 邻接矩阵(匈牙利算法) . . . . . . . . . . . . . . . . . . . . . . . . . . 149 4.10.2 邻接表(匈牙利算法) . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 4.10.3 Hopcroft-Karp 算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 4.11 二分图多重匹配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 4.12 二分图最大权匹配(KM 算法) . . . . . . . . . . . . . . . . . . . . . . . . . . 153 4.13 一般图匹配带花树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 4.14 一般图最大加权匹配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 4.15 生成树计数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 4.16 最大流 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 4.16.1 SAP 邻接矩阵形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 4.16.2 SAP 邻接矩阵形式 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 4.16.3 ISAP 邻接表形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 4.16.4 ISAP+bfs 初始化 + 栈优化 . . . . . . . . . . . . . . . . . . . . . . . . . 165 4.16.5 dinic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 4.16.6 最大流判断多解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 4.17 最小费用最大流 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 4.17.1 SPFA 版费用流 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 4.17.2 zkw 费用流 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 4.18 2-SAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 4.18.1 染色法(可以得到字典序最小的解) . . . . . . . . . . . . . . . . . . . . 172 4.18.2 强连通缩点法(拓扑排序只能得到任意解) . . . . . . . . . . . . . . . . 173 4.19 曼哈顿最小生成树 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 4.20 LCA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 4.20.1 dfs+ST 在线算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 4.20.2 离线 Tarjan 算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 4.20.3 LCA 倍增法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 4.21 欧拉路 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 4.21.1 有向图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 4.21.2 无向图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 4.21.3 混合图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 4.22 树分治 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 4.22.1 点分治 -HDU5016 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 4.22.2 * 点分治 -HDU4918 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 4.22.3 链分治 -HDU5039 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 5 搜索 205 5.1 Dancing Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 5.1.1 精确覆盖 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 5.1.2 可重复覆盖 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 5.2 八数码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 5.2.1 HDU1043 反向搜索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 6 动态规划 212 6.1 最长上升子序列 O(nlogn) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 6.2 背包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 6.3 插头 DP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 kuangbin 3 ACM Template of kuangbin 6.3.1 HDU 4285 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 7 计算几何 218 7.1 二维几何 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 7.2 三维几何 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 7.3 平面最近点对 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242 7.4 三维凸包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 7.4.1 HDU4273 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 8 其他 249 8.1 高精度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 8.2 完全高精度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250 8.3 strtok 和 sscanf 结合输入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 8.4 解决爆栈,手动加栈 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 8.5 STL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 8.5.1 优先队列 priority_queue . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 8.5.2 set 和 multiset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 8.6 输入输出外挂 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 8.7 莫队算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 8.7.1 分块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 8.7.2 Manhattan MST 的 dfs 顺序求解 . . . . . . . . . . . . . . . . . . . . . . 260 8.8 VIM 配置 .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值