May 13

Ubuntu 9.04入门小结 不指定

felix021 @ 2009-5-13 13:05 [IT » 操作系统] 评论(1) , 引用(0) , 阅读(8120) | Via 本站原创
预计覆盖以下内容:
1。安装基本知识
2。添加源(教育网and电信)
3。完整的中文语言支持(输入法)
4。apt-get基本知识
5。root用户相关
6。nVidia显卡驱动
7。引导相关(Grub,Windows,修复,单用户模式)
8。多媒体相关
9。常用软件推荐

另,发现一篇更全的东西:速配指南
http://wiki.ubuntu.org.cn/index.php?title=%E9%80%9F%E9%85%8D%E6%8C%87%E5%8D%97&variant=zh-cn

-----华丽的分割线-----
May 13
今天回顾WOJ1398,发现了这个当时没有理解透彻的算法。
看了好久好久,现在终于想明白了。
试着把它写下来,让自己更明白。

最长递增子序列,Longest Increasing Subsequence 下面我们简记为 LIS。
排序+LCS算法 以及 DP算法就忽略了,这两个太容易理解了。

假设存在一个序列d[1..9] = 2 1 5 3 6 4 8 9 7,可以看出来它的LIS长度为5。
下面一步一步试着找出它。
我们定义一个序列B,然后令 i = 1 to 9 逐个考察这个序列。
此外,我们用一个变量Len来记录现在最长算到多少了

首先,把d[1]有序地放到B里,令B[1] = 2,就是说当只有1一个数字2的时候,长度为1的LIS的最小末尾是2。这时Len=1

然后,把d[2]有序地放到B里,令B[1] = 1,就是说长度为1的LIS的最小末尾是1,d[1]=2已经没用了,很容易理解吧。这时Len=1

接着,d[3] = 5,d[3]>B[1],所以令B[1+1]=B[2]=d[3]=5,就是说长度为2的LIS的最小末尾是5,很容易理解吧。这时候B[1..2] = 1, 5,Len=2

再来,d[4] = 3,它正好加在1,5之间,放在1的位置显然不合适,因为1小于3,长度为1的LIS最小末尾应该是1,这样很容易推知,长度为2的LIS最小末尾是3,于是可以把5淘汰掉,这时候B[1..2] = 1, 3,Len = 2

继续,d[5] = 6,它在3后面,因为B[2] = 3, 而6在3后面,于是很容易可以推知B[3] = 6, 这时B[1..3] = 1, 3, 6,还是很容易理解吧? Len = 3 了噢。

第6个, d[6] = 4,你看它在3和6之间,于是我们就可以把6替换掉,得到B[3] = 4。B[1..3] = 1, 3, 4, Len继续等于3

第7个, d[7] = 8,它很大,比4大,嗯。于是B[4] = 8。Len变成4了

第8个, d[8] = 9,得到B[5] = 9,嗯。Len继续增大,到5了。

最后一个, d[9] = 7,它在B[3] = 4和B[4] = 8之间,所以我们知道,最新的B[4] =7,B[1..5] = 1, 3, 4, 7, 9,Len = 5。

于是我们知道了LIS的长度为5。

!!!!! 注意。这个1,3,4,7,9不是LIS,它只是存储的对应长度LIS的最小末尾。有了这个末尾,我们就可以一个一个地插入数据。虽然最后一个d[9] = 7更新进去对于这组数据没有什么意义,但是如果后面再出现两个数字 8 和 9,那么就可以把8更新到d[5], 9更新到d[6],得出LIS的长度为6。

然后应该发现一件事情了:在B中插入数据是有序的,而且是进行替换而不需要挪动——也就是说,我们可以使用二分查找,将每一个数字的插入时间优化到O(logN)~~~~~于是算法的时间复杂度就降低到了O(NlogN)~!

代码如下:

//在非递减序列 arr[s..e](闭区间)上二分查找第一个大于等于key的位置,如果都小于key,就返回e+1
int upper_bound(int arr[], int s, int e, int key)
{
    int mid;
    if (arr[e] <= key)
        return e + 1;
    while (s < e)
    {
        mid = s + (e - s) / 2;
        if (arr[mid] <= key)
            s = mid + 1;
        else
            e = mid;
    }
    return s;
}

int LIS(int d[], int n)
{
    int i = 0, len = 1, *end = (int *)alloca(sizeof(int) * (n + 1));
    end[1] = d[0]; //初始化:长度为1的LIS末尾为d[0]
    for (i = 1; i < n; i++)
    {
        int pos = upper_bound(end, 1, len, d[i]); //找到插入位置
        end[pos] = d[i];
        if (len < pos) //按需要更新LIS长度
            len = pos;
    }
    return len;
}


update @ 2016-08-21

没想到7年多了还要更新一下……

有几位同学在评论中问到如何给出一个LIS而不仅是计算长度。具体的代码我没有写过,不过大概可以这么实现:更新B[i]的时候,把记下来数字在原来数组中的下标也记下来(被替换的数据保留在一个后备数组中)。等到得出 B[n] 了以后,用贪心算法往前回溯,每次找出B[i-1]对应后备数组中值小于B[i]、下标小于B[i]下标、且在该后备数组中下标最大的那个。

update @ 2017-04-16

补充一下,由于上面那段代码用的是upper_bound,所以实际上求的是最长不下降子序列;如果要求递增子序列,应该改用lower_bound。
May 12

XeTeX模板 不指定

felix021 @ 2009-5-12 21:09 [IT » 其他] 评论(1) , 引用(0) , 阅读(9441) | Via 本站原创
张文给的模板,很赞~对中文的支持比CJK好得不是一点阿。。。用这个写了自己的简历,很爽~

$ xelatex a.tex
$ xelatex a.tex
$ evince a.pdf

\documentclass[a4paper]{article}
\usepackage{hyperref}%不能有unicode选项,否则bookmark会是乱码

\usepackage{fontspec}
\setromanfont{WenQuanYi Zen Hei}%字体
%中文断行
\XeTeXlinebreaklocale "zh"
\XeTeXlinebreakskip = 0pt plus 1pt

\hypersetup{pdfauthor={},
pdftitle={}}     %注意,在document之外的导言区

\title{}
\author{张文}

\begin{document}
\renewcommand{\today}{\number\year 年\number\month 月\number\day 日}
\maketitle

\pagenumbering{Roman}
\newpage

\renewcommand{\contentsname}{\centerline{目\quad 录}}
\tableofcontents
\newpage
\pagenumbering{arabic}

\section{}


\newpage
\renewcommand{\refname}{参考文献}
\begin{thebibliography}{99}
    \bibitem{Chisnall} D. Chisnall. 2007. \textsl{The Definitive Guide to the Xen Hypervisor.}
\end{thebibliography}

\end{document}
May 11

廉颇老矣 (装B一下) 不指定

felix021 @ 2009-5-11 00:35 [IT » 程序设计] 评论(2) , 引用(0) , 阅读(6592) | Via 本站原创
今天不太想做其他事情,所以就跟着acm集训队做了两场在toj上面的个人选拔赛。

早上的那一场做得比较随便,跟师兄聊着聊着就聊过头了,等聊完都过了十几min了。于是没有看statistics,挑了个逆序数的题目做,数据比较大,所以用归并,但是居然WA了。到WOJ的1046去测试了一下,是AC的啊,郁闷。于是去看Ranklist,发现另外一道简单题大部分人都过了,于是去写,很快1AC。然后回到那题,发现它对付超大数据有问题,于是改成long long,AC。然后又看到最后一个简单的题目,大约花了10min(说明我代码速度还是不行啊),1AC。虽然这个时候罚时比较多了,但是出3题的人不多,所以rank还比较靠前。剩下的时间在对付那个概率论的题目。显然[30][30][1000]的数据硬搞是要TLE的,不过对于我这种DPSB而言,还是老老实实先写一个出来再说。看题目就花了不少时间,然后写了个爆搜,算出了题目test case,但是提交上去就MLE了。然后想试试打表,但是在自己机器上都算不完。
比赛结束后发现成绩还是有点囧,Rank17,铜牌之后的两个。。。sigh。

下午的题目比较多,ABCDEFG。都还有点难度,所以大概20多分钟以后才开始写,把那个切割的题目写了(按照二分的模式去模拟就行了),然后看那个tree的问题,其实思路还是比较清晰的,就是DEBUG用了很久,就那么三四十行的代码啊。。。sigh。然后过了三组test case,提交WA。囧啊囧啊囧。想了很久,发现原来node[1]不一定是root。邪恶的测试数据。。再改一下,就AC了。这时候只剩下一个小时。然后去看A的那个题目。那是去年暑训的题目,当时就完全没有思路,这一次稍微有点思路,枚举+列方程求解,但是最后还是没有搞定。赛后看了jieyu的A和E的代码,然后没什么想法,继续搁置那题。。。。。。
比赛结束后Rank18,除掉那个测试帐号,和上午一样,恨。。。

sigh。我发现我始终还是只把acm当作娱乐项目,就这么混过了3年。
May 10

TIC初赛:3AC 2放弃 不指定

felix021 @ 2009-5-10 01:12 [IT » 程序设计] 评论(2) , 引用(0) , 阅读(6187) | Via 本站原创
对于一个felix能做出4题的比赛,我想这次的题目实在是够简单了。毕竟是初赛。
A题,服务器173上的A题(据测试,至少有4台独立的服务器170~173跑着POJ的程序)
就是那个求和的程序,那显然应该速战速决1AC——这是我机器上14:01:02写完的程序:
#include<iostream>
using namespace std;

int main(){
    int n, i, t, sum = 0;
    scanf("%d", &n);
    for (i = 0; i < n; ++i){
        scanf("%d", &t);
        sum += t;
    }
    printf("%d\n", sum);
    return 0;
}


173上的B题,也就是企鹅豆豆的那题,让我想起了打豆豆的笑话。
一眼看过去,觉得是一个超简单的题目,sort一遍,然后O(n^2)遍历求出一个i,比penguin[i]高且力气大的企鹅是最多的。
通过了test case,然后提交,WA。
暂时忽略之,然后看了CDE题的题意,发现还是应该先搞B。
于是回过头来,仔细想了一下,发现自己SB了:
以H(Height)和S(Strength)建立一个直角坐标系,把所有的企鹅放进去
然后对任意两个企鹅a, b: 如果La < Lb 且 Sa < Sb,那么画一条从a到b的有向线段,于是就构成了一张图,或者是一个有交叉的森林,或者又可以叫做拓扑图?反正就是那么一个东西,然后有那么几个点只有出度没有入度(暂且称之为源点),有那么几个点只有入度没有出度(暂且称之为终点),我们要找一条从某一个源点到某一个终点的最长的路线。顺着这个思路,于是就想到了BFS:对每一个点都BFS过去,最后遍历所有的点,找出最大的深度,就是所求结果了。很快code完,提交,TLE。囧。看了一下,发现自己非常SB地在每次BFS以后都把所有的点的depth初始化了。注释掉这一句,提交,AC,14:32:58。
Apr 29
超赞。有了形象的动画,配上伪代码,算法学起来应该会简单一点吧?

http://www.sorting-algorithms.com
Apr 18
现在只要加入我修改的这个小东西,那么在有访客留言、评论、申请链接的时候,
我的139邮箱就会收到一封邮件,而中国移动139信箱在收到邮件以后会自动往我的手机发邮件主题。。。
噢也~~~

-------------我就是那华丽的分割线---------------

Hack for Bo-blog 2.1.0+
当有访客留言或评论、申请链接时向指定邮箱发送邮件
2009-04-18
By Felix021 @ http://www.felix021.com
Mail: i[at]felix021.com

使用说明:

1。将目录fm放置到blog/inc下面,修改fm/felix_mail.php第4~8行的四个参数。如果你的空间支持SMTP,这么就OK了,如果不支持,可以修改下面的内容,通过你的邮箱提供商的SMTP服务器发送邮件,但是这样在评论和留言的时候会稍稍卡一下。

2。将mod_visit.php中171行到189行的内容(可以适当自定义)放到blog/inc/mod_visit.php的相应位置(不知道v2.1.1是怎样的,反正我的2.1.0测试是OK了,应该可以直接用文件覆盖)。注意不要把177行的16改大,因为phpmailer的限制,UTF-8编码下,邮件主题最大16个字符,不知道是什么问题,如果有谁搞清楚了,一定记得通知我一下~~~

3。将mod_login.php中280行到284行的内容方到blog/inc/mod_login.php的对应位置,注意事项同上。

4。接收邮件的邮箱建议使用中国移动的139邮箱,因为这样可以直接发短信告诉你有新的评论/通知/链接了。

--

本来想发到bo-blog论坛去,但是论坛原先的用户名的密码不记得了,163邮箱没收到重置邮件
新注册一个用户,i@这个邮箱又没收到验证邮件
得,我困得很,还不如去睡觉。
Apr 17

免费邮件推送服务 不指定

felix021 @ 2009-4-17 22:12 [IT » 其他] 评论(3) , 引用(0) , 阅读(8017) | Via 本站原创
前两天还在和sandy讨论怎么整一个免费的山寨版邮件推送,
今天一时兴起,想看看gmail有没有山寨版的已经实现的邮件推送,
于是搜了一下“gmail 新邮件 到达通知”,
没想到我们可亲可敬di中国移动早就提供了条件:
中国移动139免费邮箱,提供免费的短信到达通知
——这不就是告诉我们,有邮件就发到139邮箱吧,我来告诉你!
以前注册的139邮箱居然不知道有这回事,真是浪费阿。
于是赶紧把gmail的邮件转发开起来。。。。
测试了一下,反应还是够快的,1min以内就收到短信了,超赞。
于是felix用上了平民山寨手机邮箱推送服务,再也不用时不时去翻邮箱了grin
分页: 48/103 第一页 上页 43 44 45 46 47 48 49 50 51 52 下页 最后页 [ 显示模式: 摘要 | 列表 ]