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

说明

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

有人暴力AC!!!

//80‘
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int cnt=0;
char s;
int sum;
int xxx[50010];
int n,m;
int f[50010]={0};
void sousuo2(int a)
{
    if(f[a]||a==0) return;
    if(f[a]==0)
    {
        sum++;
        sousuo2(--a);
    }
}
void sousuo(int x,int y)
{
    if(f[x]||x>n)
    {
        sousuo2(y-1);
        return;
    }
    if(f[x]==0)
    {
        sum++;
        sousuo(++x,y);
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        cin>>s;
        if(s==‘D‘)
        {
            scanf("%d",&xxx[++cnt]);
            f[xxx[cnt]]=1;
        }
        if(s==‘Q‘)
        {
            int x;
            sum=0;
            scanf("%d",&x);
            int y=x;
            if(f[x]==1)
                sum=0;
            else
                sousuo(x,y);
            printf("%d\n",sum);
        }
        if(s==‘R‘)
            f[xxx[cnt--]]=0;
    }
    return 0;
}
//100——by whw
//我太懒了
#include<stack>
#include<cstdio>
#include<iostream>
#include<algorithm>
#define M 50001
using namespace std;
stack<int> q;
bool vis[M];
int tree[M];
int a[M],n,m;
inline int read(int&x) {
    x=0;char c=getchar();
    while(c>‘9‘||c<‘0‘) c=getchar();
    while(c>=‘0‘&&c<=‘9‘) x=10*x+c-48,c=getchar();
}
int main() {
    read(n);read(m);
    char s;
    int x,bj=0,tot=0;
    for(int i=1;i<=n;i++) vis[i]=true;
    for(int i=1;i<=m;i++) {
        cin>>s;
        if(s==‘D‘) {
            read(x);
            q.push(x);
            vis[x]=false;
            a[++tot]=x;
        }
        else if(s==‘R‘) {
            x=q.top();
            q.pop();
            vis[x]=true;
            sort(a+1,a+tot+1);
            for(int i=1;i<=tot;i++)
              if(a[i]==x) {
                  if(a[i]==a[tot]) tot--;
                  else a[i]=a[tot],tot--;
                  break;
              }
        }
        else if(s==‘Q‘) {
            read(x);
            if(!vis[x]) printf("0\n");
            else {
                sort(a+1,a+tot+1);
                if(x>a[tot]) printf("%d\n",n-a[tot]);
                else for(int i=1;i<=tot;i++) {
                    if(a[i]>x) {
                        printf("%d\n",a[i]-a[i-1]-1);
                        break;
                    }
                }
            }
        }
    }
    return 0;
}
时间: 2024-11-10 03:14:33

洛谷 P1503鬼子进村的相关文章

洛谷 P1503 鬼子进村

P1503 鬼子进村 题目背景 小卡正在新家的客厅中看电视.电视里正在播放放了千八百次依旧重播的<亮剑>,剧中李云龙带领的独立团在一个县城遇到了一个鬼子小队,于是独立团与鬼子展开游击战. 题目描述 描述 县城里有n个用地道相连的房子,第i个只与第i-1和第i+1个相连.这是有m个消息依次传来 1.消息为D x:鬼子将x号房子摧毁了,地道被堵上. 2.消息为R :村民们将鬼子上一个摧毁的房子修复了. 3.消息为Q x:有一名士兵被围堵在x号房子中. 李云龙收到信息很紧张,他想知道每一个被围堵的士

洛谷—— P1503 鬼子进村

https://www.luogu.org/problemnew/show/P1503 题目背景 小卡正在新家的客厅中看电视.电视里正在播放放了千八百次依旧重播的<亮剑>,剧中李云龙带领的独立团在一个县城遇到了一个鬼子小队,于是独立团与鬼子展开游击战. 题目描述 描述 县城里有n个用地道相连的房子,第i个只与第i-1和第i+1个相连.这是有m个消息依次传来 1.消息为D x:鬼子将x号房子摧毁了,地道被堵上. 2.消息为R :村民们将鬼子上一个摧毁的房子修复了. 3.消息为Q x:有一名士兵被

洛谷 1503 鬼子进村 (set)

/*set加速维护*/ #include<iostream> #include<cstdio> #include<cstring> #include<set> #define maxn 100010 using namespace std; set<int>s; set<int>::iterator p; int n,m,a[maxn],top; char c[10]; int init() { int x=0,f=1;char s=

P1503 鬼子进村

题目背景 小卡正在新家的客厅中看电视.电视里正在播放放了千八百次依旧重播的<亮剑>,剧中李云龙带领的独立团在一个县城遇到了一个鬼子小队,于是独立团与鬼子展开游击战. 题目描述 描述 县城里有n个用地道相连的房子,第i个只与第i-1和第i+1个相连.这是有m个消息依次传来 1.消息为D x:鬼子将x号房子摧毁了,地道被堵上. 2.消息为R :村民们将鬼子上一个摧毁的房子修复了. 3.消息为Q x:有一名士兵被围堵在x号房子中. 李云龙收到信息很紧张,他想知道每一个被围堵的士兵能够到达的房子有几个

LUOGU P1503 鬼子进村

传送门 解题思路 平衡树,支持插入,删除,找前驱后继,set水过. #include<iostream> #include<cstdio> #include<cstring> #include<set> using namespace std; const int MAXN = 50005; inline int rd(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)) {f=ch=='-'?0:1;c

【题解】Luogu P1503 鬼子进村

平衡树好题 原题传送门 这道题要用Splay,我博客里有对Splay的详细介绍 这道题思维有点难,要把被摧毁的节点插入平衡树,而不是把没有摧毁的节点插入 先把0和n+1插入平衡树,作为边界 操作1:摧毁节点,把该点插入平衡树 操作2:修复最后一个被摧毁节点的位置的可以用栈来求出,并把该点位置从平衡树中删除 操作三:搞一个vis数组,记录是否被摧毁,如果被摧毁了,直接输出0,没被摧毁的话,输出该点后继的位置-该点前驱的位置-1,这应该也很好理解qaq 剩下就没什么问题了(除了代码有点长) #pra

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3

洛谷1231 教辅的组成

洛谷1231 教辅的组成 https://www.luogu.org/problem/show?pid=1231 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书多得数不胜数,其中有书,有答案,有练习册.已知一个完整的书册均应该包含且仅包含一本书.一本练习册和一份答案,然而现在全都乱做了一团.许多书上面的字迹都已经模糊了,然而HansBug还是可

洛谷教主花园dp

洛谷-教主的花园-动态规划 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树的高度分别为10,20,30.教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高. 输入输出格式 输入格式: 输入文件garden.in的第1行为一个正整数n,表示需要种的