洛谷 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

说明

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

 

很水的一道题

查询时找前驱和后继

然后做差就好了

WA成dog..

屠龙宝刀点击就送

#include <cstdio>
#define N 50005 

using namespace std;
bool vis[N];
int n,m,des[N],top;
inline int max(int a,int b) {return a>b?a:b;}
inline int min(int a,int b) {return a>b?b:a;}
int main()
{
    scanf("%d%d",&n,&m);
    char opt[5];
    for(int x,ans,lx,rx;m--;)
    {
        scanf("%s",opt);
        if(opt[0]=='R') vis[des[top--]]=0;
        else
        {
            scanf("%d",&x);
            if(opt[0]=='D') des[++top]=x,vis[x]=1;
            else
            {
                if(vis[x])
                 {printf("0\n");continue;}
                lx=1;
                rx=n; 
                for(int j=1;j<=top;++j)
                {
                    if(des[j]<x) lx=max(lx,des[j]);
                    if(des[j]>x) rx=min(rx,des[j]);
                }
                ans=rx-lx+1;
                if(vis[lx]) ans--;
                if(vis[rx]) ans--;
                printf("%d\n",ans);
            }
        }
    }
    return 0;
}

 

posted @ 2017-09-20 14:34  杀猪状元  阅读(207)  评论(0编辑  收藏  举报