zoukankan      html  css  js  c++  java
  • NOI08冬令营 数据结构的提炼与压缩

    无聊随手翻,翻到了一个这样的好东西——据结构的提炼与压缩

    为了防止以后忘记,这里把论文里的题目都纪录一下吧。

    1.二维结构的化简

    问题一:ural 1568 Train car sorting

    定义一个对序列的操作:将这个序列分成两个,然后首尾连起来(我知道我描述得不清楚,自己想一下就好),例子:5 3 2 4 1分成3 4 15 2,然后变成3 4 1 5 2

    求将一个排列变成一个升序序列需要进行的操作次数。

    我觉得不需要像论文一样弄一个什么母矩阵。我觉得可以给一个序列中每个元素一个高度(其实本质还是一样的,囧),比如5 3 2 4 1就有

    5---
    -3-4
    --2-
    ---1
    

    我们要让最高的高度越小,并且每一行都是一个升序序列。

    然后论文就给出了一个算法,但没有说怎样思考得来的。这个算法确实很美妙。什么,你问我算法是什么?在论文里。时间复杂度:(O(n log n))

    问题二:CEOI 2007 Day 2 Necklaces

    我就觉得这题就是一个Trie的进化版。

    2.树形结构的化简

    问题三:浙江2007年省选 捉迷藏

    将树变成括号序列。

    比如这棵树:

    我们可以得到一个这样的序列:[A[B[E][F[H][I]]][C][D[G]]]

    考察两个结点,如E和G,取出介于它们之间的那段括号编码 :]{()()}]()[[
    把匹配的括号去掉,我们看到(2)](2)[,也就是说,在树中,从E向上爬(2)步,再向下走(2)步就到了G。

    对于介于两个节点间的一段括号编码S,可以用一个二元组((a,b))描述它,即这段编码去掉匹配括号后有(a)]和b个[

    这样,就得到了一个十分有用的结论:
    (a2<b1)((a,b)= (a1-b1+a2, b2)),当(a2 geq b1)((a,b)=(a1, b1-a2+b2))
    由此,又得到几个简单的推论:
    (a+b=a1+b2+|a2-b1|=max((a1-b1)+(a2+b2),(a1+b1)-(a2+b2)))
    (a-b=a1-b1+a2-b2)
    (b-a=b2-a2+b1-a1)

    然后就可以用线段树搞搞了。时间复杂度:(O(n log n))

    问题四:2005年国家集训队何林论文 树的统计

    问题描述:给定一棵含有(n)个节点的树,所有的节点分别编号为(1, 2, 3, …, n)。对于编号为(v)的节点,定义(t(v))(v)的后代中所有编号小于(v)的节点个数。求(t(1), t(2), t(3), …, t(n))

    这题的算法太美妙了!

    我们求这棵树的DFS序和逆DFS序。

    DFS序:7 10 14 2 13 1 9 11 6 5 8 3 15 12 4
    逆DSF序:7 4 3 12 15 9 6 8 5 11 1 10 14 13 2

    然后用神奇的加减法就可以得到(t(v))了:
    (t(v)=f(v,)DFS序列中(v)之后的部分()+f(v,)逆DFS序列中(v)之后的部分()+f(v,)(v)的所有祖先()-v+1)

    然后用个栈和树状数组搞搞就算出来了。时间复杂度:(O(n log n))

    其实我觉得可以用DFS序和Splay就可以搞出来了,囧。

    问题五:问题二的遗留问题

    说实话,我觉得论文里的”超级父亲“好像比较显然。

    3.图结构的化简

    问题六:ural 1557 Network Attack

    给定一个无向连通图,若从中删去两条边能使它不连通,求所有这样的方案的总数。图点数n边数m。

    先做一棵DFS树,满足条件的两条边有且只有以下两种情况:

    问题七:ural 1569 Networking the “Iset”

    问题描述:输入一个无向图(G=(V,E)),求这个图的直径最小生成树。

    首先有个很有价值的结论:当属的直径长为偶数,树的中心是唯一;当树的直径长为奇数,树的中心是唯二的。

    证明:定义:l(v)=max{d(u,.v)|u,v是一个图中的点}。当树的直径为2d。设有一条直径是AB,AB中点是P。一方面,对于任意一个点C,设AB上距离C最近的点位Q,不妨Q在AP上,则CP=BC-BP≤AB-BP=d ,同时AP=BP=d ,所以l(P)= d。另一方面,对于任意一个不是P的点C,设AB上距离C最近的点位Q,不妨Q在AP上,则BC=BP+PQ+QC>d ,所以l(C)>d 。所以,P就是这棵树的唯一的中心。

    奇数同理。

    然后我们可以枚举中心了,之后来一个BFS树即可。

  • 相关阅读:
    49. 字母异位词分组
    73. 矩阵置零
    Razor语法问题(foreach里面嵌套if)
    多线程问题
    Get json formatted string from web by sending HttpWebRequest and then deserialize it to get needed data
    How to execute tons of tasks parallelly with TPL method?
    How to sort the dictionary by the value field
    How to customize the console applicaton
    What is the difference for delete/truncate/drop
    How to call C/C++ sytle function from C# solution?
  • 原文地址:https://www.cnblogs.com/wangck/p/4444601.html
Copyright © 2011-2022 走看看