hdu 1540

乍一看感觉可以树状数组加二分,但是POJ上的可以过,HDU数据貌似强一些,感觉有点玄学就换了个思路,

set容器维护一下就好了,我们不断把被破坏的点加入set,然后对于询问,查找最近的被破坏点,如果 x 也在set内 直接输出0,

重建的话直接把 x 从 set 内去除就好了。

以下是 hdu 版本 AC 代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
inline int read()
{
    register int s=0,w=1;register char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch<='9'&&ch>='0'){s=s*10+ch-'0';ch=getchar();}
    return s*w;
}
int n,m;
set<int>v;
set<int>::iterator it;
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        stack<int>st;
        v.clear();
        char s[10];
        v.insert(0),v.insert(n+1);
        for(int i=1;i<=m;i++)
        {
            scanf("%s",s);
            if(s[0]=='D')
            {
                int t=read();
                st.push(t); v.insert(t);
            }
            if(s[0]=='R')
            {
                int t=st.top();st.pop();
                it = v.lower_bound(t);
                v.erase(it);
            }
            if(s[0]=='Q')
            {
                int t=read();
                it = v.lower_bound(t);
                if(it!=v.begin() && *it>t)it--;
                if(*it == t)
                {
                    puts("0");
                    continue;
                }
                int l = *it;
                it++;
                int r = *it;
                printf("%d\n",r-l-1);
            }
        }
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值