首页 > 其他分享 > [USACO08FEB]Hotel G

[USACO08FEB]Hotel G

时间:2023-04-03 11:13:40浏览次数:52  
标签:val int Hotel mid seg tag USACO08FEB id

[USACO08FEB]Hotel G

线段树二分,最大字段和

对于操作二,是很简单的区间赋值

对于操作一,长度为\(len\)的,我们要找到最小的的 \(x\) 满足 \([x, x + len -1]\) 的房间为空

在最大字段和的基础上,我们可以求出最长连续空房间的长度,对于要求长度为\(len\)的房间,可以按顺序判断:

  1. 若左区间的最大长度满足要求,先选择左区间
  2. \(\text{左区间的右端最大长度} + \text{右区间的左端最大长度} \geq len\), 答案为\(mid - \text{左区间的右端最大长度}\), 此处\(mid\)左区间的右端点
  3. 若右区间的最大长度满足要求,选择右区间
//  AC one more times
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define endl '\n'
#define all(x) (x).begin(), (x).end()
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
typedef pair<long long,long long> PLL;
const int mod = 1e9+7;
const int N=5e5+10;

struct info
{
    int s,ls,rs,ms;
};

info operator + (const info &a,const info &b)
{
    info t;
    t.s=a.s+b.s;
    t.ls=a.ls;
    t.rs=b.rs;
    if(a.ls==a.s)
        t.ls=a.s+b.ls;
    if(b.rs==b.s)
        t.rs=b.s+a.rs;
    t.ms=max({a.ms,b.ms,t.ls,t.rs,a.rs+b.ls});
    return t;
}

struct segtree
{
    struct info val;
    int tag,sz;
}seg[N*4];

void update(int id)
{
    seg[id].val=seg[id*2].val+seg[id*2+1].val;
}

void settag(int id,int tag)
{
    seg[id].tag=tag;
    int sz=seg[id].val.s;
    if(tag==0)
        seg[id].val={sz,0,0,0};
    else if(tag==1)
        seg[id].val={sz,sz,sz,sz};
}

void pushdown(int id)
{
    if(seg[id].tag!=-1)
    {
        settag(id*2,seg[id].tag);
        settag(id*2+1,seg[id].tag);
        seg[id].tag=-1;
    }
}

void build(int id,int l,int r)
{
    seg[id].tag=-1;
    seg[id].sz=r-l+1;
    if(l==r)
    {
        seg[id].val={1,1,1,1};
        return;
    }
    int mid=(l+r)>>1;
    build(id*2,l,mid);
    build(id*2+1,mid+1,r);
    update(id);
}

void modify(int id,int l,int r,int ql,int qr,int tag)
{
    if(l==ql&&r==qr)
    {
        settag(id,tag);
        return;
    }
    pushdown(id);
    int mid=(l+r)>>1;
    if(qr<=mid)
        modify(id*2,l,mid,ql,qr,tag);
    else if(ql>mid)
        modify(id*2+1,mid+1,r,ql,qr,tag);
    else 
        modify(id*2,l,mid,ql,mid,tag),
        modify(id*2+1,mid+1,r,mid+1,qr,tag);
    update(id);
}

int query(int id,int l,int r,int cnt)
{
    if(l==r)
    {
        return l;
    }
    pushdown(id);
    int mid=(l+r)>>1;
    if(seg[id*2].val.ms>=cnt)
        return query(id*2,l,mid,cnt);
    else if(
        seg[id*2].val.rs+seg[id*2+1].val.ls>=cnt)
        return mid-seg[id*2].val.rs+1;
    else return query(id*2+1,mid+1,r,cnt);
}
 
void solve()
{
    int n,q;
    cin>>n>>q;
    build(1,1,n);
    while(q--)
    {
        int op; cin>>op;
        if(op==1)
        {
            int x;  cin>>x;
            if(seg[1].val.ms<x)
            {
                cout<<0<<endl;
                continue;
            }
            int pos=query(1,1,n,x);
            cout<<pos<<endl;
            modify(1,1,n,pos,pos+x-1,0);
        }
        else if(op==2)
        {
            int x,y;    cin>>x>>y;
            modify(1,1,n,x,x+y-1,1);
        }
    }
    return;
}
  
int main()
{
    std::ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
  
    int TC = 1;
    
    //cin >> TC;    
    for(int tc = 1; tc <= TC; tc++)
    {
        //cout << "Case #" << tc << ": ";         
        solve();
    }


    return 0;
}

标签:val,int,Hotel,mid,seg,tag,USACO08FEB,id
From: https://www.cnblogs.com/magicat/p/17282481.html

相关文章

  • [USACO08FEB]Hotel G 线段树区间合并|维护最长的连续1
    这个还是看代码,比讲的清楚#include<bits/stdc++.h>#definefastioios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)#definels(rt<<1)#definers(rt<<1|1......
  • 【洛谷】P5904 [POI2014]HOT-Hotels(长链剖分)
    原题链接题意给出一棵有\(n\)个点的树,求有多少组点\((i,j,k)\)满足\(i,j,k\)两两之间的距离都相等。\((i,j,k)\)与\((i,k,j)\)算作同一组。\(1\len\le10^5\)......
  • vulnhub靶场之WORST WESTERN HOTEL: 1
    准备:攻击机:虚拟机kali、本机win10。靶机:WorstWesternHotel:1,下载地址:https://download.vulnhub.com/worstwesternhotel/HotelWW.ova,下载后直接vbox打开即可。知识点:s......
  • How IoT can benefit smart hotels and the hospitality industry
    Roomserviceandmaintenancearekeycomponentsofsmarthotelmanagement.Notonlyaretheycriticaltokeepingavenuerunningsmoothly,butdependingonthe......
  • POJ 3667 Hotel(线段树:区间覆盖+维护最大连续子区间长度)
    HotelDescriptionThecowsarejourneyingnorthtoThunderBayinCanadatogainculturalenrichmentandenjoyavacationonthesunnyshoresofLakeSuperior.Be......
  • P2894 [USACO08FEB]Hotel G
    \(P2894\)[\(USACO08FEB\)]\(Hotel\)\(G\)一、题目描述参考样例,第一行输入\(n,m\),\(n\)代表有\(n\)个房间,编号为\(1-\simn\),开始都为空房,\(m\)表示以下有\(m\)行操作......
  • P2895 [USACO08FEB]Meteor Shower S
    P2895[USACO08FEB]MeteorShowerS#include<iostream>#include<cstring>#include<queue>usingnamespacestd;constintN=310;intx,y,t;intg[N][N];......
  • Luogu 2894 酒店Hotel
    题目链接:​​传送门​​题目描述:参考样例,第一行输入n(1≤n≤50,000),m(1≤M<50,000),n代表有n个房间,编号为1—n,开始都为空房,m表示以下有m行操作,以下每行先输入一个......
  • POJ 3667 Hotel
    题目链接:​​传送门​​虽然是重题但还是要发一篇博客维护最长01串oh我之前写的好良心再放上来#include<iostream>#include<cstdio>#include<cstring>#include<cstdli......
  • P2894 [USACO08FEB]Hotel G
    #include<bits/stdc++.h>usingnamespacestd;classsegment_tree{ public: intn,m; structtree{ intlen; intlm,rm; intmm; intlazy_tag; #d......