1. 程式人生 > >洛谷 P1503 鬼子進村

洛谷 P1503 鬼子進村

esp 線段 修復 www cstring fin bound -c toolbar

P1503 鬼子進村

題目背景

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

題目描述

描述 縣城裏有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

說明

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

思路:

1.用STL去維護。

2.用線段樹去搞,思路類似於酒店hotile

代碼STL:

#include<set>
#include
<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; set<int>se; set<int>:: iterator sx; int n,m,stack[3000],top=0; int main(){ scanf("%d%d",&n,&m); se.insert(0); se.insert(n+1); for(int i=1;i<=m;i++){
char opt[2];int x; scanf("%s",opt); if(opt[0]==D){ scanf("%d",&x); se.insert(x); stack[++top]=x; } else if(opt[0]==Q){ scanf("%d",&x); sx=se.lower_bound(x); int s=*sx,t=*(--sx); if(s==x){ cout<<"0"<<endl; continue; } int ans=s-t; cout<<ans-1<<endl; } else if(opt[0]==R){ sx=se.find(stack[top--]); x=*sx; se.erase(x); } } }

洛谷 P1503 鬼子進村