当前位置: 首页 > news >正文

LOJ121 动态图连通性(LCT)

  用LCT维护一下删除时间的最大生成树即可。当然也可以线段树分治。

#include<iostream> 
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
int read()
{
    int x=0,f=1;char c=getchar();
    while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
    while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return x*f;
}
#define N 5010
#define M 500010
#define lson tree[k].ch[0]
#define rson tree[k].ch[1]
#define lself tree[tree[k].fa].ch[0]
#define rself tree[tree[k].fa].ch[1]
int n,m,x[N+M],y[N+M],v[N+M],cnt;
map<long long,int> f;
struct edge{int op,x,y,del;
}q[M];
struct data{int ch[2],fa,rev,s;
}tree[N+M];
void up(int k)
{
    tree[k].s=k;
    if (v[tree[lson].s]<v[k]) tree[k].s=tree[lson].s;
    if (v[tree[rson].s]<v[tree[k].s]) tree[k].s=tree[rson].s;
}
void rev(int k){if (k) swap(lson,rson),tree[k].rev^=1;}
void down(int k){if (tree[k].rev) rev(lson),rev(rson),tree[k].rev=0;}
bool isroot(int k){return lself!=k&&rself!=k;}
int whichson(int k){return rself==k;}
void push(int k){if (!isroot(k)) push(tree[k].fa);down(k);} 
void move(int k)
{
    int fa=tree[k].fa,gf=tree[fa].fa,p=whichson(k);
    if (!isroot(fa)) tree[gf].ch[whichson(fa)]=k;tree[k].fa=gf;
    tree[fa].ch[p]=tree[k].ch[!p],tree[tree[k].ch[!p]].fa=fa;
    tree[k].ch[!p]=fa,tree[fa].fa=k;
    up(fa),up(k);
}
void splay(int k)
{
    push(k);
    while (!isroot(k))
    {
        int fa=tree[k].fa;
        if (!isroot(fa))
            if (whichson(fa)^whichson(k)) move(k);
            else move(fa);
        move(k);
    }
}
void access(int k){for (int t=0;k;t=k,k=tree[k].fa) splay(k),tree[k].ch[1]=t,up(k);}
void makeroot(int k){access(k),splay(k),rev(k);}
int findroot(int k){access(k),splay(k);for (;lson;k=lson) down(k);splay(k);return k;}
void link(int x,int y){makeroot(x);tree[x].fa=y;}
void cut(int x,int y){makeroot(x),access(y),splay(y);tree[y].ch[0]=tree[x].fa=0;up(y);}
int query(int x,int y){makeroot(x),access(y),splay(y);return tree[y].s;}
void newpoint(int p,int q,int z)
{
    cnt++;tree[cnt].s=cnt;v[cnt]=z;
    x[cnt]=p,y[cnt]=q;
    link(cnt,p),link(cnt,q);
}
int main()
{
    freopen("dynamic_graph.in","r",stdin);
    freopen("dynamic_graph.out","w",stdout);
    n=read(),m=read();
    for (int i=1;i<=m;i++)
    {
        q[i].op=read(),q[i].x=read(),q[i].y=read();
        if (q[i].x>q[i].y) swap(q[i].x,q[i].y);
        if (q[i].op==0) f[1ll*q[i].x*m+q[i].y]=i;
        if (q[i].op==1) q[f[1ll*q[i].x*m+q[i].y]].del=i;
    }
    cnt=n;
    for (int i=0;i<=n;i++) tree[i].s=i,v[i]=M;
    for (int i=1;i<=m;i++) if (q[i].op==0&&q[i].del==0) q[i].del=M;
    for (int i=1;i<=m;i++)
    if (q[i].op==0)
    {
        if (findroot(q[i].x)!=findroot(q[i].y)) newpoint(q[i].x,q[i].y,q[i].del);
        else 
        {
            int t=query(q[i].x,q[i].y);
            if (v[t]<q[i].del)
            {
                cut(t,x[t]),cut(t,y[t]);
                newpoint(q[i].x,q[i].y,q[i].del);
            }
        }
    }
    else if (q[i].op==2)
    {
        if (findroot(q[i].x)!=findroot(q[i].y)||v[query(q[i].x,q[i].y)]<i) printf("N\n");
        else printf("Y\n");
    }
    fclose(stdin);fclose(stdout);
    return 0;
}

 

转载于:https://www.cnblogs.com/Gloid/p/9383875.html

相关文章:

  • 暗黑3有严重BUG
  • 数组(冒泡,选择,排序)
  • 游戏中的UI问题(一)
  • 排序算法之一冒泡排序
  • 游戏停止测试标准(四)
  • NYOJ 122 Triangular Sums
  • 游戏产业制作名人录(一)
  • Vue生命周期学习
  • 容错恢复测试(一)
  • fastjson转换json时,碰到的那些首字母大小写转换的坑!(转)
  • 容错恢复性测试(二)
  • [bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序
  • 测试中的单纯性划分
  • JAVA中的协变与逆变
  • bzoj4004: [JLOI2015]装备购买
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Angular数据绑定机制
  • Apache的80端口被占用以及访问时报错403
  • canvas 绘制双线技巧
  • CSS 提示工具(Tooltip)
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Linux下的乱码问题
  • mysql innodb 索引使用指南
  • Python十分钟制作属于你自己的个性logo
  • 阿里云购买磁盘后挂载
  • 从setTimeout-setInterval看JS线程
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 面试遇到的一些题
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 双管齐下,VMware的容器新战略
  • 通信类
  • 问题之ssh中Host key verification failed的解决
  • 《天龙八部3D》Unity技术方案揭秘
  • Spring Batch JSON 支持
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​flutter 代码混淆
  • #WEB前端(HTML属性)
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (06)金属布线——为半导体注入生命的连接
  • (1)(1.9) MSP (version 4.2)
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (附源码)php新闻发布平台 毕业设计 141646
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (一)appium-desktop定位元素原理
  • (转)负载均衡,回话保持,cookie
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .NET Core 2.1路线图
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .Net Winform开发笔记(一)
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?