日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NKOI 1550 旅馆

發布時間:2024/3/26 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NKOI 1550 旅馆 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【Usaco Feb08 Gold】旅館

Time Limit:10000MS? Memory Limit:65536K
Total Submit:128 Accepted:71?
Case Time Limit:1000MS

Description

奶牛們最近的旅游計劃,是到蘇必利爾湖畔,享受那里的湖光山色,以及明媚的陽光。作為整個旅游的策劃者和負責人,貝茜選擇在湖邊的一家著名的旅館住宿。這個巨大的旅館一共有N (1 <= N <= 50,000)間客房,它們在同一層樓中順次一字排開,在任何一個房間里,只需要拉開窗簾,就能見到波光粼粼的湖面。?

貝茜一行,以及其他慕名而來的旅游者,都是一批批地來到旅館的服務臺,希望能訂到D_i (1 <= D_i <= N)間連續的房間。服務臺的接待工作也很簡單:如果存在r滿足編號為r..r+D_i-1的房間均空著,他就將這一批顧客安排到這些房間入住;如果沒有滿足條件的r,他會道歉說沒有足夠的空房間,請顧客們另找一家賓館。如果有多個滿足條件的r,服務員會選擇其中最小的一個。?

旅館中的退房服務也是批量進行的。每一個退房請求由2個數字X_i、D_i描述,表示編號為X_i..X_i+D_i-1 (1 <= X_i <= N-D_i+1)房間中的客人全部離開。退房前,請求退掉的房間中的一些,甚至是所有,可能本來就無人入住。?

而你的工作,就是寫一個程序,幫服務員為旅客安排房間。你的程序一共需要處理M (1 <= M < 50,000)個按輸入次序到來的住店或退房的請求。第一個請求到來前,旅店中所有房間都是空閑的。

Input

* 第1行: 2個用空格隔開的整數:N、M?

* 第2..M+1行: 第i+1描述了第i個請求,如果它是一個訂房請求,則用2個數字1、D_i描述,數字間用空格隔開;如果它是一個退房請求,用3個以空格隔開的數字2、X_i、D_i描述

Output

* 第1..??行: 對于每個訂房請求,輸出1個獨占1行的數字:如果請求能被滿足 ,輸出滿足條件的最小的r;如果請求無法被滿足,輸出0

Sample Input

10 6 1 3 1 3 1 3 1 3 2 5 5 1 6

Sample Output

1 4 7 0 5

Source

usaco feb2008 金組


仍然用l1,r1,max1分別表示左起最大連續值,右起最大連續值和區間最大連續值,其中增加sum參數表示區間長度

再添加lazy參數,lazy==1表示有人,lazy==2表示沒人,其他細節看下面代碼

#include<cstdio> #include<iostream> using namespace std; const int maxn=50005; int n,m,a,b,tot,k; inline void _read(int &x){char t=getchar();bool sign=true;while(t<'0'||t>'9'){if(t=='-')sign=false;t=getchar();}for(x=0;t>='0'&&t<='9';t=getchar())x=x*10+t-'0';if(!sign)x=-x; } struct wk{int a,b,left,right,sum;int l1,r1,max1,lazy; }tree[2*maxn]; void buildtree(int x,int y){int r=++tot;tree[r].a=x;tree[r].b=y;if(x<y){int mid=(x+y)>>1;tree[r].left=tot+1;buildtree(x,mid);tree[r].right=tot+1;buildtree(mid+1,y);tree[r].l1=tree[r].r1=tree[r].max1=tree[r].sum=y-x+1;}else tree[r].l1=tree[r].r1=tree[r].max1=tree[r].sum=1; } void update(int r){int ls=tree[r].left,rs=tree[r].right;if(tree[ls].sum==tree[ls].max1)tree[r].l1=tree[ls].sum+tree[rs].l1;else tree[r].l1=tree[ls].l1;if(tree[rs].sum==tree[rs].max1)tree[r].r1=tree[rs].sum+tree[ls].r1;else tree[r].r1=tree[rs].r1;tree[r].max1=max(tree[ls].max1,tree[rs].max1);tree[r].max1=max(tree[r].max1,tree[ls].r1+tree[rs].l1); } void putdown(int r){int ls=tree[r].left,rs=tree[r].right;if(tree[r].lazy==1){tree[ls].l1=tree[ls].r1=tree[ls].max1=tree[ls].sum;tree[rs].l1=tree[rs].r1=tree[rs].max1=tree[rs].sum;tree[ls].lazy=tree[rs].lazy=1;}else {tree[ls].l1=tree[ls].r1=tree[ls].max1=0;tree[rs].l1=tree[rs].r1=tree[rs].max1=0;tree[ls].lazy=tree[rs].lazy=2;}tree[r].lazy=0; } void change(int r,int a,int b,int f){if(tree[r].b<a||tree[r].a>b)return;if(tree[r].lazy)putdown(r);if(tree[r].a>=a&&tree[r].b<=b){if(f==1)tree[r].l1=tree[r].r1=tree[r].max1=tree[r].sum;else tree[r].l1=tree[r].r1=tree[r].max1=0;tree[r].lazy=f;return ;}int mid=(tree[r].a+tree[r].b)>>1;if(b<=mid)change(tree[r].left,a,b,f);//交于當前討論的區間的左兒子else if(a>mid)change(tree[r].right,a,b,f);//交于當前討論區間的右兒子else {change(tree[r].left,a,mid,f);change(tree[r].right,mid+1,b,f);}//既交于左兒子,又交于右兒子,就分別遞歸計算update(r); } int ask(int r,int x){int mid=(tree[r].a+tree[r].b)>>1;if(tree[r].lazy)putdown(r);if(tree[r].a==tree[r].b)return tree[r].a;//如果當前區間被壓縮到了一個點,就returnif(tree[tree[r].left].max1>=x)return ask(tree[r].left,x);if(tree[tree[r].left].r1+tree[tree[r].right].l1>=x)return mid-tree[tree[r].left].r1+1;return ask(tree[r].right,x); } int main(){_read(n);_read(m);buildtree(1,n);for(int i=1;i<=m;i++){_read(k);if(k==1){_read(b);if(tree[1].max1<b)puts("0");else {int a=ask(1,b);printf("%d\n",a);change(1,a,a+b-1,2);}}else {_read(a);_read(b);change(1,a,a+b-1,1);}} }

總結

以上是生活随笔為你收集整理的NKOI 1550 旅馆的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。