1. 程式人生 > >洛谷P1503 鬼子進村 [平衡樹,STL]

洛谷P1503 鬼子進村 [平衡樹,STL]

三種 lag true lin 展開 getc 維護 cstring scanf

  題目傳送門

鬼子進村

題目背景

小卡正在新家的客廳中看電視。電視裏正在播放放了千八百次依舊重播的《亮劍》,劇中李雲龍帶領的獨立團在一個縣城遇到了一個鬼子小隊,於是獨立團與鬼子展開遊擊戰。

題目描述

描述 縣城裏有n個用地道相連的房子,第i個只與第i-1和第i+1個相連。這是有m個消息依次傳來

1、消息為D x:鬼子將x號房子摧毀了,地道被堵上。

2、消息為R :村民們將鬼子上一個摧毀的房子修復了。

3、消息為Q x:有一名士兵被圍堵在x號房子中。

李雲龍收到信息很緊張,他想知道每一個被圍堵的士兵能夠到達的房子有幾個。

輸入輸出格式

輸入格式:

第一行2個整數n,m(n,m<=50000)。

接下來m行,有如題目所說的三種信息共m條。

輸出格式:

對於每一個被圍堵的士兵,輸出該士兵能夠到達的房子數。

輸入輸出樣例

輸入樣例#1:
7 9
D 3
D 6
D 5
Q 4
Q 5
R
Q 4
R
Q 4
輸出樣例#1:
1
0
2
4

說明

若士兵被圍堵在摧毀了的房子中,那只能等死了。。。。。。


  分析:

  本來想用這題隨便搞個平衡樹玩一下,結果就變成了$vector$水分23333。

  是的這題很裸,如果有房子被摧毀就丟進平衡樹裏維護,修好了就從平衡樹中刪除,如果詢問就在平衡樹中找前驅後繼算差值就行了,註意邊界問題以及士兵所在房子被摧毀的情況就行了。

  無比清(nan)新(kan)的$vector$實現平衡樹。  

  Code:

//It is made by HolseLee on 28th Sep 2018
//Luogu.org P1503
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N=5e4+7;
int n,m,las,h[N];
bool
des[N]; vector<int>v; inline int read() { char ch=getchar(); int num=0; bool flag=false; while( ch<0 || ch>9 ) { if( ch==- ) flag=true; ch=getchar(); } while( ch>=0 && ch<=9 ) { num=(num<<1)+(num<<3)+(ch^48); ch=getchar(); } return flag ? -num : num; } void print(int x) { if( x>9 ) print(x/10); putchar(x%10+0); } inline int get(int x) { if( des[x] )return 0; int p=lower_bound(v.begin(),v.end(),x)-v.begin(); return v[p]-v[p-1]-1; } int main() { n=read(); m=read(); char op[3]; int x; v.push_back(0); v.push_back(n+1); for(int i=1; i<=m; ++i) { scanf("%s",op); if( op[0]==D ) { x=read(); des[h[++las]=x]=1; v.insert(lower_bound(v.begin(),v.end(),x),x); } else if( op[0]==R ) { if( las==0 ) continue; v.erase(lower_bound(v.begin(),v.end(),h[las])); des[h[las--]]=0; } else { x=read(); print(get(x)), putchar(\n); } } return 0; }

洛谷P1503 鬼子進村 [平衡樹,STL]