zoukankan      html  css  js  c++  java
  • poj2892

    题解:

    答案=后缀-前缀-1

    如果被轰了,那么就时0

    在一开始加入0,n+1,保证有前缀后缀

    代码:

    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int N=100005;
    char s[3];
    int n,m,la[N],ppp,pre[N],in[N],x,size[N],c[N][2],root,tot,data[N];
    void rot(int x)
    {
        int y=pre[x],k=(c[y][0]==x);
        size[y]=size[c[y][k]]+size[c[x][k]]+1;
        size[x]=size[c[x][!k]]+size[y]+1;
        c[y][!k]=c[x][k];
        pre[c[y][!k]]=y;
        pre[x]=pre[y];
        if(pre[y])c[pre[y]][c[pre[y]][1]==y]=x;
        c[x][k]=y;pre[y]=x;
    }
    void splay(int x,int g)
    {
        for(int y=pre[x];y!=g;rot(x),y=pre[x])
         if(pre[y]!=g)rot((x==c[y][0])==(y==c[pre[y]][0])?y:x);
        if(g==0)root=x;
    }
    void insert(int x)
    {
        int y=root;
        while(c[y][x>data[y]]) y=c[y][x>data[y]];
        data[++tot]=x;
        c[tot][0]=c[tot][1]=0;
        pre[tot]=y;
        if(y)c[y][x>data[y]]=tot;
        splay(tot,0);
    }
    void del(int x)
    {
        int y=root;
        while(data[y]!=x) y=c[y][x>data[y]];
        splay(y,0);
        y=c[root][1];
        bool b;
        if(!y) b=1,y=c[root][0];else b=0;
        while(c[y][b]) y=c[y][b];
        splay(y,root);
        c[y][b]=c[root][b];pre[c[root][b]]=y;pre[y]=0;root=y;
        size[y]=size[c[y][!b]]+size[c[y][b]];
    }
    int findpre(int x)
    {
        int ans;
        for(int y=root;y;)
         if(data[y]<x)ans=data[y],y=c[y][1];
         else y=c[y][0];
        return ans;
    }
    int findnxt(int x)
    {
        int ans;
        for(int y=root;y;)
         if(data[y]<=x)y=c[y][1];
         else ans=data[y],y=c[y][0];
        return ans;
    }
    int read()
    {
        int x=0;char c;
        for (;c<'0'||c>'9';c=getchar());
        for (;c>='0'&&c<='9';c=getchar())x=x*10+c-48;
        return x;
    }
    void write(int x)
    {
        if (x>=10)write(x/10);
        putchar(x%10+48);
    }
    int main()
    {
        n=read();m=read();
        insert(0);insert(n+1);
        while (m--)
         {
             scanf("%s",&s);
             if (s[0]=='D')
              {
                  x=read();
                  insert(x);
                  in[x]=1;
                  la[++ppp]=x;
              }
             if (s[0]=='Q')
             {
                  x=read();
                  if (in[x])
                   {
                       puts("0");
                       continue;
                   } 
                  int l=findpre(x),r=findnxt(x);
                  write(r-l-1);puts("");
             } 
            if (s[0]=='R'&&ppp)in[la[ppp]]=0,del(la[ppp--]); 
         }
    }
  • 相关阅读:
    根据出生日期来计算年龄
    tomcat 7 7.0.73 url 参数 大括号 {} 不支持 , 7.0.67支持
    hdu 1272(并查集)
    hdu 1558(计算几何+并查集)
    hdu 1856(hash+启发式并查集)
    hdu 1598(最小生成树)
    poj 3164(最小树形图模板)
    hdu 2489(状态压缩+最小生成树)
    hdu 3371(启发式合并的最小生成树)
    hdu 1301(最小生成树)
  • 原文地址:https://www.cnblogs.com/xuanyiming/p/7886595.html
Copyright © 2011-2022 走看看