题解

1 条题解

  • 0
    @ 2022-08-14 17:10:47

    守卫长城

    直接模拟即可。

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,k,sum;
    int a[300005];
    long long l,r,cnt=0;
    int main()
    {
        cin>>n>>m>>k;
        for(int i=1; i<=n; i++)
        {
            cin>>a[i];
            if(a[i]>=(-1*k)&&a[i]<=k)//我们把一开始在范围内的人用 sum 先记录下来 
                sum++;
        }
        sort(a+1,a+1+n);//开始按从小到大排序 
        l=1,r=n;
        for(int i=1; i<=m; i++)
        {
            int op,x;
            cin>>op;//输入询问的种类 
            if(1==op)//右移 x 
            {
                cin>>x;
                cnt+=x;//cnt 表示当前到底移动了多少(例如,cnt 为 -2 表示所有人左移 2 格) 
                while(r>=l&&a[r]+cnt>k)//越界了且移动后超过界限(因为向右移只会动右边界) 
                {
                    sum--;//直接减掉 
                    r--;//右边界 -- 
                }
            }
            else if(2==op)//左移 x 
            {
                cin>>x;
                cnt-=x;
                while(l<=r&&a[l]+cnt<(-1*k))//越界了且移动后超过界限(因为向左移只会动左边界) 
                {
                    sum--;//直接减掉 
                    l++;//左边界 ++ 
                }
            }
            else if(3==op)//询问 
                cout<<sum<<endl;//最后结果输出 
        }
        return 0;
    }
    
  • 1

信息

ID
1448
难度
4
分类
(无)
标签
递交数
3
已通过
2
通过率
67%
上传者