题解

105 条题解

  • 0
    @ 2009-03-28 19:30:11

    Accepted 有效得分:100 有效耗时:2711ms

    好麻烦的题目,输出真是……@*……@#&*……

    一开始不知道a大于b时要交换a,b,看了题解才晓得,这是什么题目啊~~~~

  • 0
    @ 2009-03-18 17:35:34

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 119ms

    ├ 测试数据 06:答案正确... 306ms

    ├ 测试数据 07:答案正确... 384ms

    ├ 测试数据 08:答案正确... 369ms

    ├ 测试数据 09:答案正确... 384ms

    ├ 测试数据 10:答案正确... 322ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:1884ms

  • 0
    @ 2009-03-17 16:41:45

    最后还要换行..

    AC经典题了

  • 0
    @ 2009-03-09 17:16:15

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 166ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 478ms

    ├ 测试数据 08:答案正确... 541ms

    ├ 测试数据 09:答案正确... 509ms

    ├ 测试数据 10:答案正确... 541ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:2235ms

    printf("%d",ans);

    一定要这样!!!!

  • 0
    @ 2009-03-02 12:00:54

    变态的题!!

    居然歧视C++!!

    printf("%d ",ans);即可

  • 0
    @ 2009-03-01 08:56:57

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 88ms

    ├ 测试数据 06:答案正确... 228ms

    ├ 测试数据 07:答案正确... 306ms

    ├ 测试数据 08:答案正确... 384ms

    ├ 测试数据 09:答案正确... 384ms

    ├ 测试数据 10:答案正确... 416ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:1806ms

    PUPPY 的力量!

    DOLPHIN 滚!

  • 0
    @ 2009-02-26 20:31:18

    线段树的题啊……

    注意打印个数,要用write(ans,' ');

    数组要开到2000000(楼下人说的)

    还有输入中a可能大于b,要判断并交换。

    最后附上关键部分题解:

    是一个动态求的区间连续一段数最大值的问题,很显然应该用——线段树。

    对于每个区间节点,记录一下maxl,maxr,max,sum,分别表示该区间从左起所能达到的最大值,从右起所能达到的最大值,区间内连续数所能得到的最大值,区间数的总和。

    于是,有递推式子:

    a[t].maxl = max{ a[ a[t].left ].maxl , a[ a[t].left ].sum + a[ a[t].right ].maxl }

    a[t].maxr = max{ a[ a[t].right ].maxr , a[ a[t].left ].maxr + a[ a[t].right ].sum }

    a[t].max = max{ a[ a[t].left ].max , a[ a[t].right ].max , a[ a[t].left ].maxr + a[ a[t].right ].maxl }

    a[t].sum = a[ a[t].left ].sum + a[ a[t].right ].sum

  • 0
    @ 2009-02-24 18:54:07

    换行超时

    空格通过

    对 C/C++ 选手没有什么提示……

  • 0
    @ 2009-02-23 01:26:12

    庆祝一下!

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 228ms

    ├ 测试数据 06:答案正确... 462ms

    ├ 测试数据 07:答案正确... 525ms

    ├ 测试数据 08:答案正确... 494ms

    ├ 测试数据 09:答案正确... 494ms

    ├ 测试数据 10:答案正确... 572ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:2775ms

  • 0
    @ 2009-02-09 16:49:04

    竟然是连续区间没看见。。。

  • 0
    @ 2009-02-04 21:31:06

    区间能A>B

    竟然每个点都有啊。。。。

    害我检查半天

  • 0
    @ 2009-02-01 00:32:41

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案?.. 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 119ms

    ├ 测试数据 06:运行时错误...| 错误号: 202 | 堆栈溢出错

    ├ 测试数据 07:运行时错误...| 错误号: 202 | 堆栈溢出错

    ├ 测试数据 08:运行时错误...| 错误号: 202 | 堆栈溢出错

    ├ 测试数据 09:运行时错误...| 错误号: 202 | 堆栈溢出错

    ├ 测试数据 10:运行时错误...| 错误号: 216 | 存取非法

    ---|---|---|---|---|---|---|---|-

    Unaccepted 有效得分:50 有效耗时:119ms

    把write(ans[i])改成write(ans[i],' '),把范围改成2000000后,就过了,Vijos太过分了。

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 56ms

    ├ 测试数据 06:答案正确... 306ms

    ├ 测试数据 07:答案正确... 400ms

    ├ 测试数据 08:答案正确... 322ms

    ├ 测试数据 09:答案正确... 244ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:1328ms

    似乎我的时间还是比较短的呵呵。

  • 0
    @ 2009-01-26 14:12:15

    哈哈哈!!!AC了!!!

    输出太搞了,一个回车没加就3个点输出格式错误。

  • 0
    @ 2008-12-27 20:21:50

    上帝保佑

  • 0
    @ 2008-12-16 16:03:55

    感谢faintzw...助 我一臂之力.........................AC

  • 0
    @ 2008-12-07 16:21:43

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 41ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 291ms

    ├ 测试数据 06:答案正确... 525ms

    ├ 测试数据 07:答案正确... 572ms

    ├ 测试数据 08:答案正确... 588ms

    ├ 测试数据 09:答案正确... 556ms

    ├ 测试数据 10:答案正确... 681ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:3254ms

  • 0
    @ 2008-11-26 19:30:31

    {Vijos 1083 优秀的线段树习题 这段代码是精华

    procedure updata(var a:Seg;b,c:Seg);

    begin

    with a do

    begin

    sum:=b.sum+c.sum;

    maxl:=maximum(b.maxl,b.sum+c.maxl);

    maxr:=maximum(c.maxr,c.sum+b.maxr);

    max:=maximum(b.max,c.max);

    max:=maximum(max,b.maxr+c.maxl);

    end;

    end;

    }

    const

    nmax=500000;

    infinity=maxlongint;

    type

    int=longint;

    Seg=record

    l,r:int;

    sum:int;

    maxl,maxr:int;

    max:int;

    left,right:int;

    end;

    var

    S:array[1..nmax] of int;

    T:array[0..2*nmax] of Seg;

    root,total:int;

    n,m,i:int;

    k,a,b:int;

    sign:boolean;

    function maximum(a,b:int):int;

    begin

    if a>b then exit(a)

    else exit(b);

    end;

    procedure exchange(var a,b:int);

    var c:int;

    begin

    c:=a;a:=b;b:=c;

    end;

    procedure updata(var a:Seg;b,c:Seg);

    begin

    with a do

    begin

    sum:=b.sum+c.sum;

    maxl:=maximum(b.maxl,b.sum+c.maxl);

    maxr:=maximum(c.maxr,c.sum+b.maxr);

    max:=maximum(b.max,c.max);

    max:=maximum(max,b.maxr+c.maxl);

    end;

    end;

    procedure Build(a,b:int);

    var now:int;

    m:int;

    begin

    inc(total);now:=total;

    with T[now] do

    begin

    l:=a;r:=b;

    if a

  • 0
    @ 2008-11-07 22:50:42

    经过三天三夜的努力,经过无数次的提交与超时,我终于在2008年11月7日星期五 晚上21点31分28秒,AC掉了这一道题。

    我现在不禁长叹一声:这道题目好欠扁!

    下面是我的血泪史:

    首先,我除了知道线段树之外,不知道任何关于这道题的事情,感谢Free_Show大牛的解题报告,我才得以悟到!

    第一次的记录不幸丢失了。

    其结果是:错误。

    没办法,第一次编线段树,有错误是很正常的。经过我不懈的差错,和与Free_Show大牛程序的对比,终于找出了错误,并且修改了过来。

    第二次的结果也丢失了,但是,现存结果中有一次和那一次一模一样的:

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:运行超时...

    ├ 测试数据 04:答案正确... 43ms

    ├ 测试数据 05:运行超时...

    ├ 测试数据 06:运行超时...

    ├ 测试数据 07:运行超时...

    ├ 测试数据 08:运行超时...

    ├ 测试数据 09:运行超时...

    ├ 测试数据 10:运行超时...

    ---|---|---|---|---|---|---|---|-

    Unaccepted 有效得分:30 有效耗时:43ms

    以为我的线段树写的太丑了,于是改改改。。。。。

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:运行超时...

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:运行超时...

    ├ 测试数据 06:运行超时...

    ├ 测试数据 07:运行超时...

    ├ 测试数据 08:运行超时...

    ├ 测试数据 09:运行超时...

    ├ 测试数据 10:运行超时...

    ---|---|---|---|---|---|---|---|-

    Unaccepted 有效得分:30 有效耗时:0ms

    这个很让人郁闷。。。。我维持这种状态大概有1、2天。。。。。

    1个小时前。。。我突然想起了题解中所说的输出问题。。。。。一改。。。

    原始编码:

    for i:=1 to tt do writeln(b[i]);

    更改后编码:

    for i:=1 to tt do write(b[i],’ ‘);

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 134ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 712ms

    ├ 测试数据 08:答案正确... 838ms

    ├ 测试数据 09:运行超时|无输出...

    ├ 测试数据 10:运行超时...

    ---|---|---|---|---|---|---|---|-

    Unaccepted 有效得分:80 有效耗时:1684ms

    仍然很郁闷啊。。。。我狂郁闷。。。又怀疑是线段树编丑了。。。。于是又花了1个小时检查程序。。。未果,再上题解一看。。。。。

    于是我的编码又变成了:

    for i:=1 to tt do

    if itt then write(b[i],' ')

    else writeln(b[i]);

    于是乎:

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 197ms

    ├ 测试数据 06:答案正确... 494ms

    ├ 测试数据 07:答案正确... 1056ms

    ├ 测试数据 08:答案正确... 759ms

    ├ 测试数据 09:答案正确... 853ms

    ├ 测试数据 10:答案正确... 1103ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:4462ms

    我好郁闷啊!!!!!!!!!!!!!!!!!如果哪位同学想做这道题,一定要注意输出啊!

  • 0
    @ 2008-11-03 18:49:20

    靠……无奈了……花了一下午搞这题……输出整死人啊!!!

  • 0
    @ 2008-11-01 15:16:42

    我晕...终于过了...

    C++的效率...不说什么了

    或者说我的线段树写丑了..

信息

ID
1083
难度
7
分类
数据结构 | 线段树 点击显示
标签
(无)
递交数
5011
已通过
977
通过率
19%
被复制
6
上传者