啊啊啊!
查看原帖
啊啊啊!
355424
Lish_Xizse楼主2021/9/18 13:51

又T又WA连样例了都不过!!!!!!!!!

#include<iostream>
using namespace std;
struct zt{
    char ch;
    int number;
}flag[50010];
int n,m,sum,wdwz[50010];//wdwz[50010]是存放士兵的位置,sum是围堵士兵个数 
bool a[50010]={0};//房子的状态。1为被摧毁,2为平安无事 
int main()
{
    cin >> n >> m;
    for(int i=1;i<=m;i++){
        cin >> flag[i].ch;
        if(flag[i].ch=='D'){//如果flag[i].ch是D 
            cin >> flag[i].number;//输入房子位置 
            a[flag[i].number]=1;//房子被摧毁
        }else if(flag[i].ch='Q'){//如果flag[i].ch是Q
            sum++;//士兵数++ 
            cin >> flag[i].number;//输入围堵位置 
            wdwz[sum]=flag[i].number;//赋值给围堵位置
        }else if(flag[i].ch='R'){//如果flag[i].ch是R
            for(int j=i;j>=1;j--){//寻找上一个围堵的房子 
                if(flag[j].ch=='D'){//找到了上一个围堵的信息 
                    a[flag[j].number]=0;//修复 
                    break;//退出 
                }
            }
        }
    }
    for(int i=1;i<=sum;i++){//输出每一个被围堵的士兵能够到达的房子有几个 
        int ans=0;//累加器 
        if(a[wdwz[sum]]==1){//若士兵被围堵在摧毁了的房子中,那只能等死了。输出0 
            cout << "0" << endl;
            continue;//跳过 
        }
        for(int j=wdwz[sum];j>=1;j--){//从围堵位置开始,不断向后寻找能到达的房子有几个
            if(j==1&&a[j]!=1){//特判边界 
                ans+=j;//加上数量 
                break;//退出 
            }
            if(a[j]==1){//如果不能走了 
                ans+=j-1;//加上数量-1(因为不包括本身) 
                break;//退出
            }
        }
        for(int j=wdwz[sum];j<=n;j++){//从围堵位置开始,不断向前寻找能到达的房子有几个
            if(j==n&&a[j]!=1){//特判边界 
                ans+=j;//加上数量 
                break;//退出
            }
            if(a[j]==-1){//如果不能走了 
                ans+=j-1;//加上数量-1(因为不包括本身) 
                break;//退出
            }
        }
        cout << ans+1 << endl;//输出数量+1(因为包括士兵所在房子) 
    }
    return 0;
}
2021/9/18 13:51
加载中...