[The 2011 ACM-ICPC Asia Chengdu Regional Contest]G.GRE Words

2011年成都赛区G题的题解。

很容易想到一个朴素的,O(n^2)的动态规划(把做KMP的时间当做常数)。

显然,这样做太慢了,要想想应该怎么优化。

关于字符串的匹配,很容易想到用后缀数组来优化。

但是只用后缀数组的话,还是没有用的。

要优化转移使每次转移的代价由O(n)变成O(logn)甚至O(1)。那么时间复杂度就自然降低了。

于是很容易就想到了线段树。

接着,把它们组合起来。

首先把输入的所有字符串连接起来,中间用’#’分割(这样可以减少用倍增法做后缀数组的时间复杂度的,不添加的话会超时,不过如果你是用其他一些O(n)的算法来构造后缀数组或者后缀树的话就可以不用分割)。

再做后缀数组。

然后开始动规。

用f[i]表示第一个单词为word[i]的最优解。

那么f[i]=max{f[j]|j>i and word[i] is a substring of word[j]}+W[i],可以用线段树来优化max操作。

设suffix(i)表示从第i位到最后所构成的后缀,rank[i]表示suffix(i)的排名,p[i]表示word[i]在拼接后的字符串中的位置,用len[i]表示word[i]的长度。

线段树记录排名在某个区间的所有串的开头部分(即’#’前部分)所在单词的f值。

求f[i]时,用二分法(需要利用高度数组,并需要用到RMQ)求得L=min{i|LCP(suffix(SA[j]),suffix(p[i]))=len[i]},R=max{i|LCP(suffix(SA[j]),suffix(p[i]))=len[i]}。

然后f[i]=排名在L到R之间的所有f的最大值+W[i],这一步用线段树来求。 

最后更新线段树,将排名为rank[p[i]+j](0<=j<len[i])的f值更新为f[i]。

这道题就做出来了。

CODE:

/*

PROGRAM: $PROGRAM

AUTHOR: Su Jiao

DATE: 2011-11-10

DESCRIPTION:

$DESCRIPTION

*/

#include <cstdio>

#include <cstring>

using namespace std;

 

namespace sujiaos_lab

{

const int LOG2_MAXLENGTH=19;

const int MAXLENGTH=320003;

const int MAXALPHABET=129;

typedef char string[MAXLENGTH];

typedef int* int_pointer;

int_pointer sort;

int _SA[MAXLENGTH],_rank[MAXLENGTH],_TSA[MAXLENGTH],_Trank[MAXLENGTH];

int_pointer SA=_SA,rank=_rank,TSA=_TSA,Trank=_Trank;

void get_SA(string s,int length)

{

     sort=Trank;

     for (int i=0;i<MAXALPHABET;i++) sort[i]=0;

     for (int i=1;i<=length;i++) sort[s[i]]++;

     for (int i=1;i<MAXALPHABET;i++) sort[i]+=sort[i-1];

     for (int i=1;i<=length;i++) SA[sort[s[i]]–]=i;

     rank[SA[1]]=1;

     for (int i=2;i<=length;i++)

         if (s[SA[i]]==s[SA[i-1]]) rank[SA[i]]=rank[SA[i-1]];

         else rank[SA[i]]=rank[SA[i-1]]+1;

     for (int block=1;rank[SA[length]]!=length;block<<=1)

     {

         sort=Trank;

         for (int i=1;i<=length;i++) sort[rank[SA[i]]]=i;

         for (int i=length;i>=1;i–)

             if (SA[i]-block>=1)

                TSA[sort[rank[SA[i]-block]]–]=SA[i]-block;

         for (int i=length-block+1;i<=length;i++)

             TSA[sort[rank[i]]–]=i;

         int_pointer swap;

         swap=SA,SA=TSA,TSA=swap;

         swap=rank,rank=Trank,Trank=swap;

         rank[SA[1]]=1;

         for (int i=2;i<=length;i++)

             if (Trank[SA[i]]==Trank[SA[i-1]]

                &&Trank[SA[i]+block]==Trank[SA[i-1]+block])

                rank[SA[i]]=rank[SA[i-1]];

             else rank[SA[i]]=rank[SA[i-1]]+1;

     }

}

int_pointer height;

void get_height(string s,int length)

{

     height=TSA;

     for (int i=1,h=0;i<=length;i++)

     {

         if (h) h–;

         if (rank[i]!=1)

         {

            int j=SA[rank[i]-1];

            while (s[i+h]==s[j+h]) h++;

         }

         height[rank[i]]=h;

     }

}

int_pointer log2;

int rmq[LOG2_MAXLENGTH][MAXLENGTH];

void get_RMQ(int length)

{

     log2=Trank;

     log2[1]=0;

     for (int i=2;i<=length;i++) log2[i]=log2[i-1]+(i==(i&(-i)));

     for (int i=1;i<=length;i++) rmq[0][i]=i;

     for (int log=1;log<=log2[length];log++)

     {

         int exp=1<<log,exp_div_2=exp>>1;

         for (int i=1;i<=length-exp+1;i++)

         {

             int a=rmq[log-1][i];

             int b=rmq[log-1][i+exp_div_2];

             rmq[log][i]=height[a]<height[b]?a:b;

         }

     }

}

int RMQ(int a,int b)

{

    int log=log2[b-a+1];

    int exp=1<<log;

    a=rmq[log][a],b=rmq[log][b-exp+1];

    return height[a]<height[b]?a:b;

}

int LCP(int a,int b)

{

    a=rank[a],b=rank[b];

    if (a>b) return height[RMQ(b+1,a)];

    else return height[RMQ(a+1,b)];

}

}

using namespace sujiaos_lab;

const int MAXN=20003;

sujiaos_lab::string s;

int W[MAXN];

int p[MAXN];

int len[MAXN];

 

const int MAXNODE=MAXLENGTH*4+1;

int st[MAXNODE];

void insert(int p,int value,int L,int R,int root=1)

{

     if (p<L||R<p) return;

     else

     {

         if (value>st[root])

            st[root]=value;

         if (L==R) return;

         int LL=L,LR=(L+R)>>1,Lroot=root<<1,

             RL=LR+1,RR=R,Rroot=Lroot|1;

         insert(p,value,LL,LR,Lroot);

         insert(p,value,RL,RR,Rroot);

     }

}

int query(int l,int r,int L,int R,int root=1)

{

    if (r<L||R<l||L>R) return 0;

    else if (l<=L&&R<=r) return st[root];

    else

    {

        int LL=L,LR=(L+R)>>1,Lroot=root<<1,

            RL=LR+1,RR=R,Rroot=Lroot|1;

        int LV=query(l,r,LL,LR,Lroot);

        int RV=query(l,r,RL,RR,Rroot);

        return LV>RV?LV:RV;

    }

}

int main()

{

    int TC;

    scanf(“%d”,&TC);

    for (int tc=1;tc<=TC;tc++)

    {

        int N;

        scanf(“%d”,&N);

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

        {

            p[i]=p[i-1]+len[i-1];

            s[p[i]++]=’#’;

            scanf(“%s%d”,s+p[i],&W[i]);

            len[i]=strlen(s+p[i]);

        }

       

        int length=strlen(s);

        get_SA(s,length);

        get_height(s,length);

        get_RMQ(length);

       

        int answer=0;

        memset(st,0,sizeof(st));

        for (int i=N;i>=1;i–)

        {

            int L,R,l,r;

            L=0,R=rank[p[i]];

            while (L+1!=R)

            {

                  int mid=(L+R)>>1;

                  if (height[RMQ(mid+1,rank[p[i]])]>=len[i]) R=mid;

                  else L=mid;

            }

            l=R;

            L=rank[p[i]],R=length+1;

            while (L+1!=R)

            {

                  int mid=(L+R)>>1;

                  if (height[RMQ(rank[p[i]]+1,mid)]>=len[i]) L=mid;

                  else R=mid;

            }

            r=L;

            int get=query(l,r,1,length)+W[i];

            if (get>answer) answer=get;

            for (int j=0;j<len[i];j++)

                insert(rank[p[i]+j],get,1,length);

        }

        printf(“Case #%d: %d\n”,tc,answer);

    }

}

 

[The 2011 ACM-ICPC Asia Chengdu Regional Contest]B.Break the Chocolate

2011年成都赛区B题的题解。

水题不解释。

CODE:

/*

PROGRAM: $PROGRAM

AUTHOR: Su Jiao

DATE: 2011-11-09

DESCRIPTION:

$DESCRIPTION

*/

#include <iostream>

using namespace std;

 

int cut(long long int x)

{

    for (int i=0;;i++)

    {

        if (x<=0) return i;

        x-=1ll<<i;

    }

}

 

int main()

{

    int TC;

    cin>>TC;

    for (int tc=1;tc<=TC;tc++)

    {

        long long int x,y,z;

        cin>>x>>y>>z;

        cout<<“Case #”<<tc<<“: “<<(x*y*z-1)<<” “<<(cut(x-1)+cut(y-1)+cut(z-1))<<endl;

    }

    return 0;

}

 

[The 2011 ACM-ICPC Asia Chengdu Regional Contest]A.Alice and Bob

2011年成都赛区A题的题解。

这是一道博弈动规题目。

首先,我们把数字分成4类,1,,2,大于1的奇数,大于2的偶数。

一个大于3的奇数是等价于3的,因为,总可以对手减一个,你也减一个,就又变成了一个大于3的奇数或者3,总可以让它变成3。因此所有大于1的奇数都等价于3。同理,所有大于2的偶数等价于4。

所以我们用f[a][b][c][d]表示有a个1,b个2,c个3,d个4是不是一个必胜态,然后动规求解就好了。

CODE:

/*

PROGRAM: $PROGRAM

AUTHOR: Su Jiao

DATE: 2011-11-09

DESCRIPTION:

$DESCRIPTION

*/

#include <iostream>

using namespace std;

 

bool calced[51][51][51][51];

bool f[51][51][51][51];

int F(int a,int b,int c,int d)

{

    if (!calced[a][b][c][d])

    {

       if (a>=1&&!F(a-1,b,c,d)) f[a][b][c][d]=true;

       if (b>=1&&!F(a+1,b-1,c,d)) f[a][b][c][d]=true;

       if (c>=1&&!F(a,b+1,c-1,d)) f[a][b][c][d]=true;

       if (d>=1&&!F(a,b,c+1,d-1)) f[a][b][c][d]=true;

      

       if (a>=2&&!F(a-2,b+1,c,d)) f[a][b][c][d]=true;

       if (b>=2&&!F(a,b-2,c,d+1)) f[a][b][c][d]=true;

       if (c>=2&&!F(a,b,c-2,d+1)) f[a][b][c][d]=true;

       if (d>=2&&!F(a,b,c,d-2+1)) f[a][b][c][d]=true;

      

       if (a>=1&&b>=1&&!F(a-1,b-1,c+1,d)) f[a][b][c][d]=true;

       if (a>=1&&c>=1&&!F(a-1,b,c-1,d+1)) f[a][b][c][d]=true;

       if (a>=1&&d>=1&&!F(a-1,b,c+1,d-1)) f[a][b][c][d]=true;

       if (b>=1&&c>=1&&!F(a,b-1,c-1+1,d)) f[a][b][c][d]=true;

       if (b>=1&&d>=1&&!F(a,b-1,c,d-1+1)) f[a][b][c][d]=true;

       if (c>=1&&d>=1&&!F(a,b,c-1+1,d-1)) f[a][b][c][d]=true;

      

       calced[a][b][c][d]=true;

    }

    return f[a][b][c][d];

}

 

int main()

{

    int TC;

    cin>>TC;

    for (int tc=1;tc<=TC;tc++)

    {

        int N,a=0,b=0,c=0,d=0;

        cin>>N;

        for (int i=0;i<N;i++)

        {

            int t;

            cin>>t;

            if (t==1) a++;

            else if (t==2) b++;

            else if (t%2==1) c++;

            else d++;

        }

        cout<<“Case #”<<tc<<“: “<<(F(a,b,c,d)?“Alice”:“Bob”)<<endl;

    }

    return 0;

}

 

OI的结束,ACM的开始[2011年10月26日]

去年的八月份,参加了NOI2010,以一枚银牌结束了自己的OI生涯,然后又回去参加了高考,可惜没考好啊,还不如当时现场保送走。(所以,能现场保送的同学们,最好还是直接走吧。)

然后,来到了人大,一个ACM弱校。不过也好,要是到清华北大复旦上交之类的学校就不那么容易进ACM队了。
在这个月,我有幸参加了2011 ACM/ICPC 上海赛区现场赛,和队友zx及wyw一起得到了一个银奖。也算我的ACM生涯的开始吧。
(附图,拿气球的是我。)
OI的结束,ACM的开始 - Boleyn Su - @Boleyn Sus 

我如何看待宗教

一个月前,我去见了我的一个老师,她告诉我她成基督徒了。当然我听到后的第一反应是吃惊,这是因为她是我认识的第一个基督徒,以前最多见到过信佛的。然后她送了两本书给我,一本是《圣经》,一本是里程写的《游子吟》,并让我去解放碑的圣爱堂听了一次证道。再加上最近看的很多美国的电影与基督教有关系,以及和同学的一次聊天,我觉得我差不多可以写这篇文章了。
1.我的信仰
在和同学的聊天中,她问我信什么,基督?科学?我的回答是,最理想的状况是都不信,是质疑一切。
为什么要质疑一切呢?因为不论是基督教的观点,科学的观点,都不过是为了解释那些终极问题(世界从何而来?我是谁?之类)而存在的学说,它们都可以差不多自圆其说,也都可以漏洞百出。
本质来说它们是相同的,盲目的相信任何一个都是迷信。而唯有质疑,我们才能接近“上帝”(请参考什么是“上帝”,以后文中加引号的上帝均指此意,以区别宗教意义上的上帝)。可能很多人都会把信教的人说成迷信的人,认为自己是无有神论者就怎样怎样。首先,你不能说明别人信的教是骗人的,虽然很多科学证据证明圣经中的很多历史事件根本是虚构的,但是那些证据是很容易被推翻的,比如有科学家用技术手段测出地球的年龄与《圣经》写的完全不同,但是很快就有人说如果上帝可以创造世界,他难道就不能在造地球时让它看起来比实际老些吗?
而我,可以说我是一个没有信仰的人,或者说我信“上帝”。
2.什么是“上帝”
其实上帝不只是宗教所说的那样,其实我们可以这样理解上帝,“上帝”是绝对真理,是宇宙发展的规律。
所以才说“上帝”创造了万物,“上帝”主宰这世界。并且如果有人违背“上帝”的旨意,就会受到惩罚。
3.为什么现在的人们更相信科学
就我看来,其原因应该是科学看起来更接近“上帝”,即科学看起来更接近绝对真理。
科学在乎一点,就是一个理论不光能解释过去,还能预言未来。而后者正是宗教的软肋,宗教的许多预言是经不起考验的。
然而能预言未来是很重要的,人类物质生活上的进步很大程度上依赖于此。
所以更相信科学的人越来越多。
4. 我眼中的宗教
关于宗教中最受人质疑的问题,到底有没有神或者上帝。对于这个问题,正确的态度是我不知道。任何人都不能证明神或者上帝的存在与不存在,因为他们即使存在也是无法感知的,即他们的存在与不存在对我们来说看起来是没有区别的。当然,这里有一个例外,就是有些人讲他遇见过神或者上帝,如果他没说谎,他就知道神或者上帝是存在的,但是如果他来告诉你他遇见上帝了,你就需要质疑了。而还有一些更极端的哲学家提出了连人的感官都要质疑,如果到了这个程度,即使你真的见到神或者上帝也同样要质疑(比如,这可能是你的一个朋友玩的恶作剧)。也就是说如果你质疑一切,就不可能知道神或者上帝的存在与否。
如果质疑宗教中关于神的那部分,那么通常就谈不上信教了,那宗教还有什么意义呢?
并且虽然宗教在现在已然没有以前的地位了,但是为什么还有这么多人信教呢?
我认为,其原因一部分是人们还有对科学的质疑,人们发现还有一些问题是科学无法解释的(比如宇宙起源,现在只有假说),还有一些科学所给出的结论是无法被接受的(比如进化论,有些人无法接受人是猴子的近亲这个结论,准确的说它还不能叫结论,而是假说);一部分是因为科学更多的满足了人的物质需求,而有点忽视人的精神需求;还有一部分就是迷信了。
而我对宗教的态度更侧重于第二点,就是宗教可以丰富人的精神生活。
在圣爱堂听证道时,看到了许多虔诚的基督教徒,融入其中听牧师讲,教徒应和,只是这样就会让我有一些内心的震撼。而牧师所讲的内容多是一些故事,或取自《圣经》,或取材于现实,都在传播着如何做一个好人。而这不就是在丰富人们的精神生活吗?它让人们觉得做一个普通好人的意义大于一个黑心富商或腐败贪官。当然宗教活动不只是讲这一点,这是我听的那次我得到的感悟。
而这些正是我认为的宗教在现在最大的意义。
对于《圣经》,我认为,读《圣经》时,应该质疑其内容的真实性(否则就是迷信了),不可否认的是它的确宣扬着一些正确的价值观,也不能否认其中落后的思想,要学会有自己的判断。如果能做到这点,就能够真正得到《圣经》所传达的一直都适用的道理(也就是说,忽略掉了那些只适用于旧时代的道理),才能够从中得到上帝的正确的启示。

读韩寒的《给李彦宏先生的一封信》有感

3月26日的时候上微博,看到@新周刊的微博“韩寒给李彦宏先生的一封信——百度文库完全可以成为造福作家的基地,而不是埋葬作家的墓地。倘若百度文库始终不肯退一步,那我可以多走几步,也许在不远的某天,在您北京的办公室里往楼下望去,您可以看见我。http://t.cn/h11Mrm ”。便马上前往韩寒的博客,发现又有两篇更新,一篇是《为了食油,声讨百度》,还有一篇是《给李彦宏先生的一封信》。

读完后的感觉便是,百度太过分了!虽然承认我也用百度文库下载过韩寒的书,但是至少我这样做的时候还是怀着歉意的,而且我也到书店买过韩寒的书,算是道歉。而从韩寒的文中我们看到的是百度的狂妄自大。“于是昨天开始谈判了,您派来几个高傲的中层,始终不承认百度文库有任何的侵权行为。”我为百度的厚颜而感到伤心,因为这居然是中国最有技术的互联网巨头的态度,这叫人情何以堪。作为一个搞技术的公司,就应该像Google那样,要学习Google的不作恶,还有创新。而不是打着共享的口号招摇撞骗。

想起@冯小刚的一条微博。“有网友问我看过盗版吗?我得诚实的说,看过。但我决不敢理直气壮说看盗版有理。贪便宜人之常情,但你总得表现出有点不好意思吧?总不能以此为荣当美德显摆吧?就好比孩子嘴馋偷吃了别家的东西,你不追究他但也不至于鼓励他再接再厉吧。你横不能对孩子说,谁让他们家东西好吃呢?咱买不起你偷得对。”百度就是那个鼓励偷盗的家长,它想把大家都教成贼。

更让人伤心的便是,居然有人觉得当贼很好。“支持百度!作家只不过是想要点钱。”这样的评论出现在百度的《版权方绿色举报通道》下面。我这不知道这些人是怎么想的,人家百度自己都觉得理亏了,你跟着瞎嚷嚷什么,谁不想要钱,你不想要吗?不想要给我。别人想要钱,那是要的他们自己的,你当然觉得没什么。如果哪天大家都到你家来抢钱,你不反抗?除非你是一条狗,只会摇尾巴的那种!

好在,现在百度有所行动,虽然作用可能不会太大,但至少说明它知道做贼是不对的了。希望百度还要为维护作者的知识产权做更多的努力,希望中国的互联网巨头们都多创新,少作恶,多为广大用户着想,同时也多为那些利益被你损害到的少数人着想。

P.S.最新的一期《Vista看天下》讲百度文库的事情的时候居然没有花大篇幅写写韩寒,好失望哦。加油韩寒,支持你!

哲学启蒙[2009年8月14日-8月24日]

8月14日
==序==
在小徒弟的推荐下买了这本讲哲学的书,《苏菲的世界》。然后今天一口气就看了70多页,觉得这是一本很有意思的书。因为读这本书感觉像在看故事一样。看那位神秘的哲学家写给苏菲的信,以及那些古怪的问题,就不自觉的思考起来。
==读《伊甸园》==
苏菲的哲学课开始于一封神秘的信,信中只有两行字:
你是谁?
世界从何而来?
这两个问题使我想起了《武林外传》中吕秀才让姬无命自杀的那一段对话。你是谁?宇宙从何而来?又走向何方?
对于我,我是Su Jiao?可拿掉这个代号,我又是谁?我,是物质的我,还是精神的我。我的克隆算是我吗?灵魂,是否真的存在?
世界有真的是由一次无聊的爆炸而开始的吗?
很多的问题,疑惑。但是,很少有人去想这些,如果不是看到这本书,我才不会闲得无聊来思考这种问题。
==读《魔术师的礼帽》==
有一句话,“要成为一个优秀的哲学家只有一个条件:要有好奇心。”然后,记得在高一的一段时间里常常对同桌说:“不要有好奇心。”这是一件可悲的事,更可悲的是几乎所有人都在成长过程中一点一点的失去好奇心。
当有人告诉我们冰化了就会变成水之后,我们就会习惯“冰化了就会变成水”,而不会觉得冰变成水是一件奇妙的事了。或许这个例子举的不好,那么,讲一个书中的故事(书中称作思想上的测试):
有一天早上,爸、妈和小同正在厨房里吃早餐。过了一会儿,妈妈站起身来,走到水槽边。这时,爸爸飞起来了,在天花板下飘浮。小同坐在那儿看着。你想小同会说什么?也许他会指着父亲说:“爸爸在飞。”小同当然会觉得吃惊,但是他经常有这样的经验。爸爸所做的奇妙的事太多了,因此这回他飞到早餐桌上方这件事对小同并没有什么特别的。每天爸爸都会用一个很滑稽的机器刮胡子,有时他会爬到屋顶调整电视的天线。或者,他偶尔也会把头伸进汽车的引擎盖里,出来时脸都是黑的。好了,现在轮到妈妈了。她听到小同说的话,转身一瞧。你想她看到爸爸像没事人一般的飘浮在餐桌的上方会有什么反应?她吓得把果酱罐子掉在地上,然后开始尖叫。等到爸爸好整以暇地回到座位上时,她可能已经需要急救了。
为什么会这样?书中写的是,因为习惯。妈妈已经知道了人不可能飞起来,而小同仍不确定人能做什么以及不能做什么。
当我们习惯了一些事物,然后思维就会受起束缚吧。
8月15日
==读《神话》==
神话,原来是用来解释这个世界为何是这个样子的。因为古人不知道世界从何而来,于是有了盘古开天,有了上帝创世。因为不知道雷是什么,就有了雷公,有了索尔和他的铁锤。
因为无法用已有的知识解释一些现象,于是只有用非自然的力量来解释,然后就出现了神话。
现在,尝试着忘记所学过的所有知识,然后编写一个美丽的传说。
==读《自然派哲学家》==
又是几行文字,几个问题:
万事万物是否由一种基本的物质组成?
水能变成酒吗?
泥土与水何以能创造出一只活生生的青蛙?
试着忘掉我所学的东西,然后想。如果世界由一种物质构成,那么为何世界会缤纷多彩?是因为感官的幻觉?或者是因为他们的不同组合导致的,就好像用砖可以砌成各式各样的建筑,然后,是什么把他们组合在一起,什么来充当水泥的角色?还有,他们是如何移动,变化的。看样子还需要引入一些东西,那或许就是我们所谓的力了。如果世界由多种物质组成,我不同意。因为如果有多种物质,那么他们也应该可以分割为更小的更基本的物质。就好像水分子可以分割成氢原子和氧原子,氢原子又可以分隔成质子和电子(有时会还有中子)。然后我想到一个更合理的观点,世界应该由两种最基本的物质组成,然后他们就可以组合成万物,而且这样也不会需要引入力这个未知的概念(因为我在试着忘记这些东西,然后来思考这个问题,就像古人一样思考)。
水能变成酒吗?如果按照前一个问题所得出的结论,答案是可能。然后,回到现实,想起了初中化学老师讲的一个笑话:
中国差点将“把水变石油”这个课题拿来研究,想制造一台机器,灌水给它,就流出石油了。后来因为有科学家讲这不合理(不符合原子守恒,至少水中没有炭原子),才被终止。但事实上这从理论上讲是可能的,原子是可变的,例如氢原子聚变就可以变成氦原子,而且在元素周期表中所有铁之前的元素对应的原子都有聚变的趋势,之后的都有裂变的趋势。只是有的快有的慢。快的,比如原子弹的铀235的裂变,以及太阳和氢弹的氢的聚变。而且在太阳中氢“变”氦后,氦还会继续“变”。
该看第三个问题了。如果把泥土和水当作两栋建筑,青蛙当作一栋待建的建筑。那么要做的就是拆东墙补西墙了。
8月16日
==读《德谟克里特斯》==
又是一个问题,积木为何是世界上最巧妙的玩具。
苏菲起先并不认为积木是世界上最巧妙的玩具,但当她玩了一阵后,改变了看法,积木似乎真的很好玩。然后,为什么呢?苏菲的结论是积木可以随意组合,还可以随便拆散。并且积木几乎不会摔坏。
然后,这个问题有什么意义呢?往下看,来到了原子理论。看看古人如何仅仅凭借理性的思考就得出了这个结论。
德谟克里特斯,这个人,他认为世界是由无数原子组成的(原子,atom,本意“不可分割的”)。这些原子形状各异,然后它们就像积木一样,可以组成各种事物,也可以分解掉。原子可以分散然后重组。
慢慢地,古代哲学家的思想开始向现代靠拢,由假想神话开始转向了理性的思考。
==读《命运》==
信中又有三个问题。最感兴趣的是这一个,“你相信命运吗?”
对于这个问题,我的观点是,我相信。我相信未来是已经确定了的。我过去、现在、以及将来做的事在宇宙一开始的时候就已经确定了,而且没法改变。我如此认为原因是某一时刻各个质点的状态是确定的,宇宙的法则是确定的,所以以后的状态也是确定的。那么,宇宙的0时刻的状态是确定的,以后的时刻也是确定的,那么,宇宙中的所有事物在任何时候的状态都是确定的。因此,我觉得我相信命运。但是,从另一个角度来说,如果一切早已命中注定,那么我们是不是不需要努力了(因为刚才的结论是我们的命运早已注定,不可改变)。我认为事实上真的是这样,不过有一个好消息,我们是否会努力也是命中注定了的。而且由于我们并不知道未来我们会怎样,所以感觉上是我们努力了,就有收获了。
然后,一个题外话,霍金说过,“即使是一个相信命运的人,过马路时也会左右看看。”他的意思是一个人如果相信命运,那么那个人过马路时就不必左右张望,因为如果命中注定他要被撞死的话,望也没有用。但是,其实那个人是否会张望本身也是命中注定了的。
好累啊,我要睡觉了。这也是命中注定的。
8月17日
==读《苏格拉底》==
很喜欢文中的一句话,最聪明的是明白自己无知的人。还有苏格拉底讲的一句话,“我只知道一件事,就是我一无所知。”
记得应该是政治课上,老师有讲古希腊的奴隶主不用干活,一天就找人辩论,所以西方出现了比东方先进的理论。然后,看到这一章,发现苏格拉底就是这样一个人。
==读《雅典》==
苏菲收到了一卷录影带,录影带中是那个神秘的哲学家在雅典拍摄的内容,现在的,和以前的雅典。
8月19日
==读《柏拉图》==
柏拉图是苏格拉底的学生之一,他开办了一个哲学学校,并以传奇中的希腊英雄阿卡戴慕士为名,这个学校被称为Academy(也就是以后的“学院”)。
然后,同样是对话式的上课,之所以说同样,是因为东方的孔子也是这样教学的。这使我想把他们拿来比较了。
读过论语就知道,孔夫子所谈论的是仁、义、礼、信之类的,大多是讲如何做人,如何格物,致知,修身,齐家,治国,平天下。那么,柏拉图又谈论什么呢?读了一阵,出现了一个词,理型。因为书中有一句“柏拉图称这些形式为‘理型’或观念”。所以“理型”应该是和“观念”等价的。继续看,有一个例子。老师问学生们最喜欢哪种颜色,答案会很多。老师问3乘8得多少,答案只有一个。后者之所以只有一个答案,是因为理性在起作用,理性只表达永恒不变、宇宙共通的事物。然后,值得一提的是在柏拉图的学校的三个科目中有数学(另两个是哲学和体育)。柏拉图认为数学很吸引人,因为数学是理性的。同时,想,中国对数学这方面的理性的研究相比于西方是很落后的吧。
柏拉图还将世界分为感官世界和理性的世界。他相信人有肉体与灵魂之分。并且肉体是感官的,灵魂是理性的。然后他也提出了自己的理想国。
信的最后,提到了一个人,柏拉图的学生,亚理士多德,将会在后面写他。
8月21日
==跳过《少校的小木屋》==
==读《亚理士多德》==
亚理士多德对柏拉图的理型论提出了质疑,柏拉图的理型论指出事物要存在于理型世界后才能存在于自然世界。就是先有X的“理型”,再有X。而亚理士多德的疑问就是如果柏拉图的理论正确,那么,我们设有一个事物A,设函数f(x)表示x的理型,那么,先前的那句话就是,All  A,Exist  B(B=f(A)),即对于所有A,存在B,满足B=f(A)。而得出有一个C=f(B),又有一个D=f(C)…所以会导致事物数目无限制的增长,也就是说会导致无穷多的事物出现,因此不合理。亚理士多德认为我们是通过感官,归纳(即理性的整理与分类)而得到概念(即“理型”)。
一个好玩的东西是一个亚理士多德提出的错误(强调,这是不符合因果律的,是错的)的理论,“目的因”。用“目的因”解释一些问题会很好玩。比如,“天为什么要下雨呢?”“因为它淋到我,我会觉得凉快些。”这就是“目的因”,也就是说天下雨的目的是让我觉得凉快,所以天下雨的“目的因”是让我觉得凉快。
那为什么我还没睡呢?
哦,因为我数羊还没数到一百只呢。
8月22日
==读《希腊文化》==
亚历山大大帝建立了一个跨亚欧非的庞大帝国,使得各种文化相互交融。出现了百家争鸣的情景。
介绍了四个学派,其中伊比鸠鲁学派的一个观点很有趣,“死亡和我们没有关系。因为我们存在一天,死亡就不会来临;而当死亡来临时,我们也不再存在了”。
==跳过《明信片》==
==读《两种文化》==
这一章里讲到了印欧民族的文化和闪族文化。讲的是关于宗教信仰的内容。
其中闪族文化下的宗教,犹太教、基督教、伊斯兰教,是西方三大宗教。
花了很大篇幅讲了一个人,耶稣。耶稣以“救世主”的姿态出现,他告诉世人要宽恕别人,别人打了你的脸,你要把另外一边脸转过来让别人打。还要悔改自己的过失,并祈求上帝的宽恕。后来,耶稣被钉上了十字架,之后保罗四处传教,之后的三四百年之间,整个希腊文化地区都成为基督教的世界。 
8月24日
==结束==
前天晚上看这本书看到了12点,才极不情愿的被叫着去睡觉了,然后,昨天有一口气看了可能有一百页吧。就快看完了。
这部分中的内容更加故事化,就是讲的更像故事而不是哲学,情节很迷人,仿佛上帝的影子在慢慢浮现。
本来打算写完整本书的读后感,但是由于还要赶作业的缘故,可能不能完成了。所以,打算今天就结束这篇日志。
在之后的内容里,还会讲到达尔文的进化论,以及伽利略和牛顿提出的一些定律,然后还讲了弗洛伊德在心理学的一些观点,马克思的想法……
总之,这是一本不错的书。