标题:再发个题给大家娱乐下
只看楼主
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
结帖率:94.44%
已结贴  问题点数:100 回复次数:16 
再发个题给大家娱乐下
谁第一个找出下面代码的那处错误(就一处错误,且是个很白痴的错误) 就得100分^_^
希望大家以后不要范同样的错误, 写程序一定要养成仔细再仔细的习惯啊,不然后果很痛苦啊。
这个错误我搞了2个多小时才发现了, 发现后 诶~~~ 苦笑不得啊。

题目OJ :http://
代码:

#include<iostream>
#include<cstdio>
using namespace std;

int lmax[300000]; //当前区间包含最左边的房间的最长空房间数
int rmax[300000]; //当前区间包含最右边的房间的最长空房间数
int maxlen[300000]; //当前区间连续空房间的最大长度
int flag[300000]; //标记当前区间的状态,0表示没人住,1表示有人住, -1表示有些房间有人住有些房间没人住

//  rt<<1 等价于rt*2;
//  rt<<1|1 等价于 rt*2+1;

void pushUp(int rt,int l,int r){
    int len=r-l+1;
    lmax[rt] = lmax[rt<<1];
    rmax[rt] = rmax[rt<<1|1];
    if(lmax[rt] == len -len/2 ) lmax[rt]+=lmax[rt<<1|1];
    if(rmax[rt] == len/2)  rmax[rt]+=rmax[rt<<1];
    int temp = maxlen[rt<<1] > maxlen[rt<<1|1] ? maxlen[rt<<1] : maxlen[rt<<1|1];
    maxlen[rt] = temp > (rmax[rt<<1] + lmax[rt<<1|1]) ? temp : (rmax[rt<<1]+lmax[rt<<1|1]);
}

void pushDown( int rt, int l, int r ){
    int len = r - l +1;
    if( flag[rt] != -1 ){
        flag[rt<<1] = flag[rt];
        flag[rt<<1|1] = flag[rt];
        maxlen[rt<<1] = lmax[rt<<1] = rmax[rt<<1] = (flag[rt]? 0:len-len/2);
            maxlen[rt<<1|1] = lmax[rt<<1|1] = rmax[rt<<1|1] = (flag[rt] ? 0:len);   
        flag[rt] = -1;
    }
}

void buildTree(int l, int r, int rt){
    flag[rt]=-1;
    lmax[rt] = rmax[rt] = maxlen[rt]=r-l+1;
    if( l == r ) return;
    int mid = (l+r) >> 1;
    buildTree(l,mid,rt<<1);
    buildTree(mid+1,r,rt<<1|1);
}

void add(int l,int r,int c,int L,int R,int rt){
    if( l<= L && r>=R ){
        maxlen[rt] = lmax[rt] = rmax[rt] = c? 0: R-L+1;
        flag[rt]=c;
        return;
    }
    pushDown(rt,L,R);
    int mid = (L+R) >> 1;
    if( l <= mid ) add(l,r,c,L,mid,rt<<1 );
    if( r > mid )  add(l,r,c,mid+1,R, rt<<1|1 );
    pushUp(rt,L,R);
}

int query(int len, int l , int r, int rt){
    if(l==r) return l;
    pushDown(rt,l,r);
    int mid = (l+r) >> 1;
        if(maxlen[rt<<1] >= len ) return query(len,l,mid,rt<<1);
    else if( rmax[rt<<1]+lmax[rt<<1|1] >=len ) return mid - rmax[rt<<1]+1;
    else return  query(len,mid+1,r,rt<<1|1);
}

int main(){
    int n,m;
       scanf("%d%d",&n,&m);{
        buildTree(1,n,1);
        for(int i=0; i<m; ++i ){
            int t;
            scanf("%d",&t);
            if(t==1){
                int len;
                cin >> len;
                if(len > maxlen[1] ) puts("0");
                else{
                    int temp = query(len,1,n,1);
                    printf("%d\n",temp);
                    add(temp,temp+len-1,1,1,n,1);
                }
            }else {
                int l,r;
                scanf("%d%d",&l,&r);
                add(l,l+r-1,0,1,n,1);
            }
        }
    }
    return 0;
}

[ 本帖最后由 草狼 于 2011-8-22 09:38 编辑 ]
搜索更多相关主题的帖子: 100分 娱乐 include 空房间 
2011-08-21 16:29
lin471306489
Rank: 4
等 级:业余侠客
帖 子:136
专家分:247
注 册:2011-8-16
得分:9 
我调试的时候,能够通过编译的。
因为我经验比较少,所以看不明白程序的作用是什么。
如果能每个函数表明一下,就不用那么吃力啦。
2011-08-21 17:13
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
得分:0 
回复 2楼 lin471306489
函数名不能表达起功能么
2011-08-21 18:27
loveshuang
Rank: 9Rank: 9Rank: 9
来 自:湖北武汉
等 级:蜘蛛侠
帖 子:270
专家分:1198
注 册:2010-11-14
得分:9 
      看不懂题目啊。。。
2011-08-21 18:36
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
得分:9 
阁下的算法能力实在是厉害 我还是接着做我的题吧

                                         
===========深入<----------------->浅出============
2011-08-21 18:54
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
得分:9 
的确很难找,也没有注释也没有功能阐述,英文也看不懂

[ 本帖最后由 stophin 于 2011-8-21 20:24 编辑 ]
2011-08-21 20:17
落叶深蓝色
Rank: 8Rank: 8
来 自:山东
等 级:蝙蝠侠
帖 子:319
专家分:807
注 册:2010-12-8
得分:9 
顶了,慢慢看
2011-08-21 22:18
cioky
Rank: 2
来 自:爸爸妈妈
等 级:论坛游民
帖 子:5
专家分:16
注 册:2011-8-20
得分:9 
您还是直接说出来吧。。。
2011-08-21 23:05
jcw08120110
Rank: 8Rank: 8
来 自:南京
等 级:蝙蝠侠
帖 子:272
专家分:742
注 册:2009-6-8
得分:9 
房主 你为什么用位运算来操纵数组的数据;这些数据的跳跃很烦的;刚看到这个程序 编程风格一点都不好!这个算是为难人吗? 你又不说程序想实现什么功能;头文件是C++?? 程序里面获取数据又是c的scanf;编程风格又是c语言的;程序还是数组的计算;
那个网页 的功能我大概看了下 组织下语言  
    先输入2个数 第一个数的意思就是一共有几个房间;
    第二个数的意思就是允许入住与退房的次数;  然后就按这第2个数 输入进出的顺序;  先输入1 3代表:1是入住请求;3是开3间房; 然后计算机输出1代表从1号房间开始; 继续输入1 3;同理1是入住请求;3是开3间房;计算机现在输出的是4因为1 2 3房间已经没了第一次被住了人了;一共10个房间 第4次输入1 3时已经人满了请求不成功;
    第5次 输入2 5 5;2代表退房请求;2个5代表从5号房开始连续的5个房间的退房操作;继续1 3请求;就是从5号开始5 6 7入住;成功计算机输出5;
    每次请求必须房间相连,如果房间不相连输出0;代表入住不成功;没有那么多相连的房间或者已经住满人了;
我试着调试了下你的程序没有问题 运行通过;各种输出都是正常的;
总结了下房主:你耍我们玩呢!!!!!!

君生我未生 我生君以老
2011-08-22 08:48
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
得分:0 
回复 9楼 jcw08120110
编程风格是有问题
用C语言输入和位运算是为了提高效率节省时间
应为这种题目有时用用CIN输入就会超时,

至于你说所有你想的案例都能过
那你运行下这个案例运行下看对否^_^
10 7
1 3
1 3
1 3
2 1 10
1 1
1 3
2011-08-22 09:34



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-348083-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.240676 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved