标题:再发个题给大家娱乐下
只看楼主
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
得分:9 
用cin和cout就是c++了?

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-08-22 11:56
杜撰
Rank: 2
来 自:北京
等 级:论坛游民
帖 子:53
专家分:69
注 册:2011-5-14
得分:9 
没看懂啊!

我的青春我做主,奋斗!
2011-08-22 14:45
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
得分:0 
我感觉是你的坐标错了

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-08-22 19:10
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
得分:0 
回复 13楼 sunyh1999
坐标没错的   是更新的时候某处出错了,你把每个区间长度更新时输出看看就能发现了
纯粗心造成的 呵呵
2011-08-22 19:32
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
得分:9 
我看这不是什么小错误。排错用几个小时挺正常的。
2011-08-22 22:41
倒霉
Rank: 2
等 级:论坛游民
帖 子:12
专家分:20
注 册:2011-8-22
得分:9 
等几个月我在看这题吧
2011-08-22 23:11
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
得分:0 
#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);   //错误在此 len少除了2   
        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-08-23 18:12



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




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

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