洛谷 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; }
我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。