• 【UER #1】DZY Loves Graph(待卡常数)


    题解:

    正解是可持久化并查集

    但这个显然是lct可以维护的

    但这常数是个问题啊???

    #include <bits/stdc++.h>
    using namespace std;
    struct re{
      int a,b,c;
    };
    const int N=5e5;
    int fa[N],ls[N],rs[N],v[N];
    int cnt,last,last1,last2,n,m,ans;
    bool rev[N];
    deque<re> q1,q2;
    void down(int x)
    {
      if (!rev[x]) return;
      swap(ls[x],rs[x]);
      rev[ls[x]]^=1; rev[rs[x]]^=1;
      rev[x]=0;
    }
    bool pd(int x)
    {
      if (ls[fa[x]]!=x&&rs[fa[x]]!=x) return(0);
      else return (1);
    }
    void rotate(int x,int y)
    {
      int fath=fa[x];
      if (y==1)
      {
        rs[fath]=ls[x];
        if (ls[x]) fa[ls[x]]=fath;
      } else
      {
        ls[fath]=rs[x];
        if (rs[x]) fa[rs[x]]=fath;
      }
      fa[x]=fa[fath];
      if (pd(fath))
      {
        if (ls[fa[x]]==fath) ls[fa[x]]=x;
        else rs[fa[x]]=x;
      }
      fa[fath]=x;
      if (y==1) ls[x]=fath; else rs[x]=fath;
    }
    void dfs(int x)
    {
      if (pd(x)) dfs(fa[x]);
      down(x); 
    }
    void splay(int x)
    {
      dfs(x);
      int fath=fa[x];
      while (pd(x))
      {
        if (!pd(fa[x]))
        {
          if (x==ls[fa[x]]) rotate(x,2);
          else rotate(x,1);
        } else
        {
          if (ls[fa[fath]]==fath)
            if (ls[fath]==x) rotate(fath,2),rotate(x,2);
            else rotate(x,1),rotate(x,2);
          else if (rs[fath]==x) rotate(fath,1),rotate(x,1);
            else rotate(x,2),rotate(x,1);
        }
        fath=fa[x];
      }
    }
    void access(int x)
    {
      for (int y=0;x;y=x,x=fa[x])
      {
        splay(x); rs[x]=y;
      }
    }
    void makeroot(int x)
    {
      access(x);
      splay(x);
      rev[x]^=1;
    }
    int findroot(int x)
    {
      access(x);
      splay(x);
      while (ls[x]) x=ls[x];
      return x;
    }
    bool find (int x,int y)
    {
      makeroot(x);
      if (findroot(y)==x) return 1;
      else return 0;
    }
    void link(int x,int y)
    {
      //**
      //cout<<x<<" "<<y<<endl;
      //**
      makeroot(x);
      fa[x]=y;
    }
    void cut(int x,int y)
    {
      makeroot(x);
      access(y);
      splay(y);
      ls[y]=fa[x]=0;
    }
    char c[100];
    int main()
    {
       freopen("noip.in","r",stdin);
       freopen("noip.out","w",stdout);
       std::ios::sync_with_stdio(false);
       cin>>n>>m;
       for (int i=1;i<=m;i++)
       {
         cin>>c;int x,y;
         if (c[0]=='A')
         {
             cin>>x>>y;
             re a; a.a=x; a.b=y; a.c=i; q1.push_back(a);
             if (!find(x,y))
             {
               cnt++; ans+=i;
               link(x,i+n);
               link(i+n,y);
               v[i+n]=i;
             }
             last=1; last1=x; last2=y;
         }
         if (c[0]=='D')
         {
           last=2;
           cin>>x; q2.clear();
           for (int i=1;i<=x;i++)
           {
             re y=q1.back(); q1.pop_back(); q2.push_back(y);
             if (find(y.a,y.c+n))
             {
               cut(y.a,y.c+n); cut(y.b,y.c+n);
               cnt--; ans-=y.c;
             }
           }
         }
         if (c[0]=='R')
         {
           if (last==1)
           {
              if (find(last1,i-1+n))
              {
                cut(last1,i-1+n); cut(last2,i-1+n);
                cnt--; ans-=i-1;
              }
              q1.pop_back();
           } else
           {
              while (!q2.empty())
              {
                re x=q2.back(); q2.pop_back();
                q1.push_back(x);
                if (!find(x.a,x.b))
                {
                  cnt++; ans+=x.c;
                  link(x.a,x.c+n);
                  link(x.b,x.c+n);
                }
              }
           }
         }
         if (cnt==n-1) cout<<ans; else cout<<0;
         cout<<endl;
       }
       return 0;
    } 
  • 相关阅读:
    直线的中点Bresenham算法的实现
    使用git 将自己的本地文件git到github上面的完整过程
    利用Microsoft VC++6.0 的MFC 的绘图工具实现简单图形的绘制
    github常见操作和常见错误及其解决办法
    浅谈软件配置管理工具(github & SVN)
    为Github 托管项目的访问添加SSH keys
    jQuery:用 lightTreeview 实现树形分类菜单的功能 展开收缩分类代码
    程序设计7大面向对象设计原则
    计算机组成原理实验之模拟整机实验考核试题
    计算机组成原理实验之CPU组成与指令周期实验
  • 原文地址:https://www.cnblogs.com/yinwuxiao/p/8635474.html
Copyright © 2020-2023  润新知