cf-64d(Parking Lot)成段更新+區間合併
題目看了一個小時,想了半個小時,敲了一個小時,debug將近三個半小時。。。。。。//還是看資料的
將停車分成兩個操作,先找出停車的起始點位置,然後再成段更新。
這裡用線段樹維護區間最多能停多長的車(包括前距和後距)
找其實點時,先判斷能否放在起點,此時它要放的長度只需lth(+f也無妨),
如果可以,就找到了。
否則要放的長度需要lth+b+f(當放在末尾時,其實不需要+f,但為了方便,我們可以將區間延長b+f,然後對求出的起始點判斷是否可行即可),如果求出結果可行,就以該起點到車的末尾成段更新,否則輸出-1.
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#include <stack>
#include <vector>
#include <string.h>
#include <queue>
#define msc(X) memset(X,-1,sizeof(X))
#define ms(X) memset(X,0,sizeof(X))
typedef long long LL;
using namespace std;
const int MAXN=1e5+1050;
#define lson tn<<1,l,mid
#define rson tn<<1|1,mid+1,r
struct _Tree
{
int len,lmax,rmax,amax,lazy;
}tree[MAXN<<2];
void PushUp(int tn)
{
tree[tn].lmax=(tree[tn<<1].lmax==tree[tn<<1].len?
(tree[tn<<1].len+tree[tn<<1|1].lmax):tree[tn<<1].lmax);
tree[tn].rmax=(tree[tn<<1 |1].rmax==tree[tn<<1|1].len?
(tree[tn<<1].rmax+tree[tn<<1|1].len):tree[tn<<1|1].rmax);
tree[tn].amax=max(tree[tn<<1].amax,tree[tn<<1|1].amax);
tree[tn].amax=max(tree[tn].amax,tree[tn<<1].rmax+tree[tn<<1|1].lmax);
}
void build(int tn,int l,int r)
{
tree[tn].len=tree[tn].lmax=
tree[tn].rmax=tree[tn].amax=r-l+1;
tree[tn].lazy=-1;
if(l==r) return ;
int mid=(l+r)>>1;
build(lson);
build(rson);
}
void PushDown(int tn)
{
if(tree[tn].lazy!=-1){
int flg=tree[tn].lazy;
tree[tn<<1].lazy=tree[tn<<1|1].lazy=flg;
tree[tn<<1].amax=tree[tn<<1].lmax
=tree[tn<<1].rmax=(flg?0:tree[tn<<1].len);
tree[tn<<1|1].amax=tree[tn<<1|1].lmax
=tree[tn<<1|1].rmax=(flg?0:tree[tn<<1|1].len);
tree[tn].lazy=-1;
}
}
int query(int tn,int l,int r,int len)
{
if(l==r) return l;
PushDown(tn);
int mid=(l+r)>>1;
if(tree[tn<<1].amax>=len)
return query(lson,len);
else if(tree[tn<<1].rmax+tree[tn<<1|1].lmax>=len)
return mid-tree[tn<<1].rmax+1;
else return query(rson,len);
}
void update(int tn,int l,int r,int x,int y,int flg)
{
if(x<=l&&r<=y){
tree[tn].lazy=flg;
tree[tn].amax=tree[tn].lmax
=tree[tn].rmax=
(flg?0:tree[tn].len);
return;
}
PushDown(tn);
int mid=(l+r)>>1;
if(x<=mid) update(lson,x,y,flg);
if(y>mid) update(rson,x,y,flg);
PushUp(tn);
}
struct _Query
{
int frm,to;
}qry[110];
int main(int argc, char const *argv[])
{
int L,b,f;
scanf("%d %d %d",&L,&b,&f);
build(1,1,L+b+f);
ms(qry);
int q;
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
int typ,lth;
scanf("%d %d",&typ,<h);
if(typ==1){
if(lth+b+f>tree[1].amax) {puts("-1");
continue;}
int pos=query(1,1,L+b+f,lth+f);//特殊處理
if(pos==1){
pos--;
if(pos+lth<=L){
update(1,1,L+b+f,pos+1,pos+lth,1);
printf("%d\n",pos );
qry[i].frm=pos+1,
qry[i].to=pos+lth;
}
}
else {
pos=query(1,1,L+b+f,lth+b+f);
if(pos!=-1){
pos+=b-1;
if(pos+lth<=L){
update(1,1,L+b+f,pos+1,pos+lth,1);
printf("%d\n",pos );
qry[i].frm=pos+1,
qry[i].to=pos+lth;
}
else puts("-1");
}
else puts("-1");
}
}
else
update(1,1,L+b+f,qry[lth].frm,qry[lth].to,0);
}
return 0;
}
/*
2 2 3
1
1 2
10 0 0
11
1 1
1 1
1 1
1 1
1 1
2 5
1 1
1 1
1 1
1 1
1 1
1 1
20 1 2
10
1 3
1 2
2 2
2 1
1 4
1 2
1 2
2 7
1 2
1 1
*/
相關推薦
cf-64d(Parking Lot)成段更新+區間合併
題目看了一個小時,想了半個小時,敲了一個小時,debug將近三個半小時。。。。。。//還是看資料的 將停車分成兩個操作,先找出停車的起始點位置,然後再成段更新。 這裡用線段樹維護區間最多能停多長的車(包括前距和後距) 找其實點時,先判斷能否放在起點,此時它
poj 3667 Hotel(線段樹,成段更新,區間合併,Lazy思想)
題意: 有n個連續的房間,m個操作,共有兩種: 1 num 詢問是不是有連續長度為num的空房間,若有,輸出連續房間的最左邊端點。 2 st num 將 [st,st+num-1]的房間清空。 本來想自己敲出這道題,敲到查詢的時候沒有思路,最後看解題報告,然後自己敲,一
線段樹詳解(單點更新與成段更新\區間更新操作)
本文純屬原創,轉載請註明出處,謝謝。 距離第一次接觸線段樹已經一年多了,再次參加ACM暑假集訓,這一次輪到我們這些老傢伙們給學弟學妹們講解線段樹了,所以就自己重新把自己做過的題目看
HDU 1698 Just a Hook(線段樹成段更新)
there clas class rec std sts present script metal 題目網址:http://acm.hdu.edu.cn/showproblem.php?pid=1698 題目: Problem Description In the ga
hdu 1698 Just a Hook (成段更新線段樹)
題目連結:哆啦A夢傳送門 題意:首先給出n個掛鉤,每個掛鉤的值都為1,接著Q次詢問,每次 X,Y,Z,代表在區間 [X,Y]的掛鉤都改為Z, 模板參考連結:https://www.cnblogs.com/TenosDoIt/p/3453089.html 題解:很顯然
HDU 3974 Assign the task(dfs時間戳+線段樹成段更新)
題意:給定點的上下級關係,規定如果給i分配任務a,那麼他的所有下屬。都停下手上的工作,開始做a。 操作 T x y 分配x任務y,C x詢問x的當前任務; Sample Input 1 5 4 3 3 2 1 3 5 2 5 C
POJ 2528 Mayor's posters 線段樹(成段更新+離散化)
題意: 給出N個海報,每個海報有一個長度區間(a,b).按順序貼在牆上。 問最後可以看到幾張海報。 思路: 一想到的就是線段樹,對每個區間進行染色,最後查詢一共有多少種顏色。 第一次寫玩沒看資料大小。MLE了。。仔細一看,海報長度1QW。 然後寫了個離散化的,300MS+。
HDU1698 Just a Hook(成段更新)【模板】
題目連結 Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 32198
hdu1698 Just a Hook(成段更新+懶惰標記)
線段樹成段更新,這裡用到了懶惰標記,簡單說一下。 單點更新只是針對一個點,所以改了該點即可。但是成段更新一旦改一個區間,那麼其所支配的節點都要更改,這樣複雜度就增加。為了避免這種情況,懶惰標記就產生了。他只給對應的線段節點賦值,其下節點都不改變。但是當這個節點不是所
280D k-Maximum Subsequence Sum(區間最大k段和)(線段樹 + 最大子段和 + 區間修改 + 區間查詢 + 單點修改)
題目 題意 給定nn個數的序列,定義兩個操作 ⋅0kval⋅0kval 把序列第k個數的值變為val ⋅1lrk⋅1lrk 詢問在區間 Al⋯ArAl⋯Ar 中,選取 mm 段不相交的子區間,使得這 mm 段子區間的和最大,其中0≤m≤k0≤m≤k。
POJ3468_A Simple Problem with Integers(線段樹/成段更新)
div sub accepted scan can print onos cst align 解題報告 題意: 略 思路: 線段樹成段更新,區間求和。 #include <iostream> #include <cstring> #
POJ訓練計劃2528_Mayor's posters(線段樹/成段更新+離散化)
rule you mon bsp 左右 for rst scribe i+1 解題報告 id=2528">地址傳送門 題意: 一些海報,覆蓋上去後還能看到幾張。 思路: 第一道離散化的題。 離散化的意思就是區間壓縮然後映射。 給你這麽幾個區間[1,30
POJ 3468 A Simple Problem with Integers 線段樹成段更新
sca query string int open print ring cnblogs pac 線段樹功能 update:成段更新 query:區間求和 #include <iostream> #include <string>
hdu 1698 Just a Hook 線段樹成段更新
void log ++ ase scan efi nbsp code upd 線段樹功能:update:成段替換 成段更新去要用到延遲標記,具體調試代碼就容易懂些 #include <iostream> #include <string>
MySQL5.7參考手冊(中文版目錄)--內容持續更新...
mysql5.7;參考手冊;數據庫MySQL 5.7 Reference Manual(MySQL 5.7參考手冊)1、General Information(一般信息)2、Installing and Upgrading MySQL(MySQL安裝和升級)3、Tutorial(教程)4、MySQL Prog
hadoop知識點(常見問題)整理——待更新完善
1.HDFS讀寫流程 2.namenode的啟動過程 3.HDFS不適合儲存小檔案,如果生成場景中還必須將這些小檔案進行儲存(比如,每天產生的日誌,資料量很小,但是必須儲存) 4.什麼情況下會進入安全模式,安全模式的解決辦法 5.說一下HDFS的可靠性策略 6.HDFS的優缺點 7.data
Python-劍指offer(15,16)反轉連結串列,合併兩個連結串列
題目:輸入一個連結串列,反轉連結串列後,輸出新連結串列的表頭。 環境:Python2.7.3 # -*- coding:utf-8 -*- # class ListNode: # def _
NYOJ116 士兵殺敵(二) 單點更新+區間求和
#include<bits/stdc++.h> using namespace std; const int MAXNODE=4000000+100; const int MAXN=2e6+10; struct NODE{ //int value; //value表示單點值
zoj 1610 Count the Colors 線段樹,成段更新染色
Count the ColorsTime Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Description Painting some colored segmen
HDU-1698 Just a Hook 線段樹成段更新
題目連結 #include "stdio.h" const int maxn = 100050; int n,x,y,z; struct Node { int val; }tree[maxn*4]; void pushup( int t ) { tree