1. 程式人生 > >cf-64d(Parking Lot)成段更新+區間合併

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,&lth); 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-64dParking 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 taskdfs時間戳+線段樹更新

題意:給定點的上下級關係,規定如果給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&#39;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-劍指offer15,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