bzoj1593/poj3667

HYSBZ - 1593 POJ - 3667

题意:中文题

思路:线段树区间合并裸题,不过lazy初始化搞错了,每次只初始化了叶子节点,wa一年,bzoj和poj又同时来例假,不过洛谷也有这个题,可能是太经典了把,但是居然卡我ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); 无限RE,果然是什么错误都能返回RE。。。

AC代码:

#include "iostream"
#include "string.h"
#include "stack"
#include "queue"
#include "string"
#include "vector"
#include "set"
#include "map"
#include "algorithm"
#include "stdio.h"
#include "math.h"
#define ll long long
#define endl "\n"
#define bug(x) cout<<x<<" "<<"UUUUU"<<endl;
#define mem(a,x) memset(a,x,sizeof(a))
#define mp(x,y) make_pair(x,y)
#define ft (frist)
#define sd (second)
#define pb(x) push_back(x)
#define lrt (rt<<1)
#define rrt (rt<<1|1)
using namespace std;
const long long INF = 1e18+1LL;
const int inf = 1e9+1e8;
const int N=1e5+100;
const ll mod=1e9+7;

int sum[N<<1],lsum[N<<1],rsum[N<<1],lazy[N<<1],n,q;
void push_up(int rt, int m){
    int rm=m>>1, lm=m-rm;
    lsum[rt]=lsum[lrt];
    rsum[rt]=rsum[rrt];
    if(lsum[rt]==lm){
        lsum[rt]+=lsum[rrt];
    }
    if(rsum[rt]==rm){
        rsum[rt]+=rsum[lrt];
    }
    sum[rt]=max(sum[lrt],sum[rrt]);
    sum[rt]=max(sum[rt],lsum[rrt]+rsum[lrt]);
}

void push_down(int rt, int m){
    int rm=m>>1, lm=m-rm;
    if(lazy[rt]==0) lm=rm=0;
    lsum[lrt]=rsum[lrt]=sum[lrt]=lm;
    lsum[rrt]=rsum[rrt]=sum[rrt]=rm;
    lazy[lrt]=lazy[rrt]=lazy[rt];
    lazy[rt]=-1;
}

void creat(int rt, int l, int r){
    if(l==r){
        sum[rt]=lsum[rt]=rsum[rt]=1;
        return;
    }
    lazy[rt]=-1;
    int mid=l+r>>1;
    creat(lrt,l,mid);
    creat(rrt,mid+1,r);
    push_up(rt,r-l+1);
}

void update(int rt, int l, int r, int L, int R, int f){
    if(l==L && r==R){
        int m=r-l+1;
        lazy[rt]=f;
        if(!f) m=0;
        lsum[rt]=rsum[rt]=sum[rt]=m;
        return;
    }
    if(lazy[rt]!=-1) push_down(rt,r-l+1);
    int mid=l+r>>1;
    if(R<=mid) update(lrt, l, mid, L, R, f);
    else if(L>mid) update(rrt, mid+1, r, L, R, f);
    else update(lrt, l, mid, L, mid, f), update(rrt, mid+1, r, mid+1, R, f);
    push_up(rt, r-l+1);
}

int query(int rt, int l ,int r, int b){
    if(lsum[rt]>=b || l==r) return l;
    if(lazy[rt]!=-1) push_down(rt,r-l+1);
    int mid=l+r>>1;
    if(sum[lrt]>=b) return query(lrt,l,mid,b);
    else if(rsum[lrt]+lsum[rrt]>=b) return mid-rsum[lrt]+1;
    else return query(rrt,mid+1,r,b);
}

int main(){
    while(cin>>n>>q){
        creat(1,1,n);
        int a,b,c;
        while(q--){
            cin>>a>>b;
            if(a==2){
                cin>>c;
                update(1,1,n,b,b+c-1,1);
            }
            else{
                if(sum[1]<b){
                    cout<<"0\n";
                    continue;
                }
                c=query(1,1,n,b);
                cout<<c<<"\n";
                update(1,1,n,c,c+b-1,0);
            }
        }
    }
    return 0;
}
时间: 2024-10-15 23:44:11

bzoj1593/poj3667的相关文章

poj3667(bzoj1593)--Usaco08Feb Hotel--线段树区间合并

Description 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 <= N <= 50,000)间客房,它们在同一层楼中顺次一字排开,在任何一个房间里,只需要拉开窗帘,就能见到波光粼粼的湖面. 贝茜一行,以及其他慕名而来的旅游者,都是一批批地来到旅馆的服务台,希望能订到Di (1 <= Di <= N)间连续的房间.服务台的接待工作也很简单:如果存在r满

(线段树) (h) poj3667 (区间合并)

poj3667 Hotel 如在阅读本文时遇到不懂的部分,请在评论区询问,或跳转 线段树总介绍 [题目大意] 有一个旅馆,有N个房间排成一排,现在有两种操作,第一是有X个顾客要入住连续的X个房间, 要求输出最小的左端点的位置,不能满足就输出0,第二是将以L开始,长度为X的连续房间清空. [输入文件] 第一行两个数N,M,表示房间数和操作数 接下来M行,每行有两种情况: 1 X 表示操作1 2 L X 表示操作2 [输出文件] 对于每一个1操作,输出答案. 题即为求最靠左的连续区间并置满以及把一段

poj3667(并查集区间合并&amp;区间查询)

题目链接: http://poj.org/problem?id=3667 题意:第一行输入 n, m表示有 n 间房间(连成一排的), 接下来有 m 行输入, 对于接下来的 m 行输入: 1 x : 询问是否有长度为 x 的连号空房, 若有, 住进最左边并输出对应编号: 2 x y : 将区间 [x, x + y - 1] 的房间清空: 思路: 并查集区间合并&区间查询 下面一段题解摘自: http://www.cnblogs.com/scau20110726/archive/2013/05/0

poj3667 线段树 区间合并

1 //Accepted 3728 KB 1079 ms 2 //线段树 区间合并 3 #include <cstdio> 4 #include <cstring> 5 #include <iostream> 6 #include <queue> 7 #include <cmath> 8 #include <algorithm> 9 using namespace std; 10 /** 11 * This is a document

bzoj1593 [Usaco2008 Feb]Hotel 旅馆

1593: [Usaco2008 Feb]Hotel 旅馆 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 807  Solved: 447[Submit][Status][Discuss] Description 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 <= N <= 50,000)间客房,它们在同一层楼中顺次一字排

POJ3667——线段树区间合并(未搞透)——Hotel

The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a vacation on the sunny shores of Lake Superior. Bessie, ever the competent travel agent, has named the Bullmoose Hotel on famed Cumberland Street as their v

poj--3667 Hotel(线段树+区间合并)

Description The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a vacation on the sunny shores of Lake Superior. Bessie, ever the competent travel agent, has named the Bullmoose Hotel on famed Cumberland Stree

[Usaco2008 Feb][BZOJ1593] Hotel 旅馆|线段树

1593: [Usaco2008 Feb]Hotel 旅馆 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 417  Solved: 243[Submit][Status][Discuss] Description 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 <= N <= 50,000)间客房,它们在同一层楼中顺次一字排

poj3667(线段树)

题目连接:http://poj.org/problem?id=3667 题意:1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 2 a b:将[a,a+b-1]的房间清空 线段树操作:update:区间替换 query:询问满足条件的最左断点 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define LL long long #define M