[WC2006]水管局长

水管局长

题目链接:https://www.luogu.org/problemnew/show/P4172#sub

LCT

  显然两个点的路径上的边最大要最小在该图最小生成树上

  正删倒加,倒着做变成加边操作

  加边时判断一下是否能形成更优的生成树,用LCT删除和连接操作即可

  1 #include<iostream>
  2 #include<cstdio>
  3 using namespace std;
  4 const int M=2e5+9;
  5 int n,m,q;
  6 int fr[M],to[M],e[1009][1009],d[1009][1009];
  7 int O[M],X[M],Y[M];
  8 bool vis[1009][1009],rev[M];
  9 int f[M],c[M][2],Ma[M],s[M],ans[M];
 10 bool bol=0;
 11 int read(){
 12     int rex=0,f=1;char ch=getchar();
 13     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
 14     while(ch>='0'&&ch<='9'){rex=rex*10+ch-'0';ch=getchar();}
 15     return rex*f;
 16 }
 17 bool isroot(int x){
 18     return c[f[x]][0]!=x&&c[f[x]][1]!=x;
 19 }
 20 int Max(int x,int y){
 21     return e[fr[x]][to[x]]<e[fr[y]][to[y]]?y:x;
 22 }
 23 void pushup(int x){
 24     Ma[x]=Max(Max(Ma[c[x][0]],Ma[c[x][1]]),x);
 25 }
 26 void pushdown(int x){
 27     if(rev[x]){
 28         swap(c[x][0],c[x][1]);
 29         rev[x]^=1,rev[c[x][0]]^=1,rev[c[x][1]]^=1;
 30     }
 31 }
 32 void rotate(int x){
 33     int y=f[x],z=f[y],k=c[y][1]==x,ch=c[x][k^1];
 34     if(!isroot(y))c[z][c[z][1]==y]=x;f[x]=z;
 35     c[y][k]=ch;f[ch]=y;
 36     c[x][k^1]=y;f[y]=x;
 37     pushup(y),pushup(x);
 38     
 39 }
 40 void splay(int x){
 41     int top=0,u=x;
 42     while(!isroot(u))s[++top]=u,u=f[u];s[++top]=u;
 43     while(top)pushdown(s[top--]);
 44     for(int y=f[x];!isroot(x);y=f[x]){
 45         if(!isroot(y))
 46             rotate(((c[f[y]][1]==y)==(c[y][1]==x))?y:x);
 47         rotate(x);
 48     }
 49 }
 50 void access(int x){for(int t=0;x;t=x,x=f[x]){splay(x);c[x][1]=t;pushup(x);}}
 51 void makeroot(int x){access(x),splay(x),rev[x]^=1;}
 52 int findroot(int x){access(x);splay(x);while(c[x][0])x=c[x][0];return x;}
 53 void split(int x,int y){makeroot(x),access(y),splay(y);}
 54 void link(int x,int y){makeroot(x),f[x]=y;}
 55 void cut(int x,int y){split(x,y);c[y][0]=0;f[x]=0;pushup(y);}
 56 int main(){
 57     n=read(),m=read(),q=read();
 58     for(int i=1,u,v;i<=m;++i){
 59         fr[i]=u=read(),to[i]=v=read();
 60         d[u][v]=d[v][u]=i;Ma[i]=i;
 61         e[u][v]=e[v][u]=read();
 62     }
 63     for(int i=1;i<=q;++i){
 64         O[i]=read(),X[i]=read(),Y[i]=read();
 65         if(O[i]==2)vis[X[i]][Y[i]]=vis[Y[i]][X[i]]=1;
 66     }
 67     for(int i=1;i<=m;++i){
 68         int x=fr[i]+m,y=to[i]+m;
 69         if(!vis[fr[i]][to[i]]){
 70             if(findroot(x)!=findroot(y)){
 71                 link(x,i);
 72                 link(y,i);
 73             }
 74             else {
 75                 split(x,y);int v=Ma[y];
 76                 if(Max(v,i)==v){
 77                     cut(v,fr[v]+m);
 78                     cut(v,to[v]+m);
 79                     link(x,i);
 80                     link(y,i);
 81                 }
 82             }
 83         }
 84     }
 85     for(int i=q,x,y;i>=1;--i){
 86         x=X[i]+m,y=Y[i]+m;int u=d[X[i]][Y[i]];
 87         if(O[i]==1){
 88             split(x,y);int v=Ma[y];
 89             ans[i]=e[fr[v]][to[v]];
 90         }
 91         if(O[i]==2){
 92             if(findroot(x)!=findroot(y)){
 93                 link(x,i);
 94                 link(y,i);
 95             }
 96             else {
 97                 split(x,y);int v=Ma[y];
 98                 if(Max(v,u)==v){
 99                     cut(v,fr[v]+m);
100                     cut(v,to[v]+m);
101                     link(x,u);
102                     link(y,u);
103                 }
104             }
105         }
106     }
107     for(int i=1;i<=q;++i){
108         if(O[i]==1)printf("%d\n",ans[i]);
109     }
110     return 0;
111 }
View Code

 此题看了题解之后,发现还有一种玄学做法

  参考:https://www.luogu.org/blog/xuege/solution-p4172

  似乎只用fa数组存最小生成树

  查询是暴力在树上一个一个的走

  修改就是 把u到 根节点/要删的边的位置 的 fa数组 全部取反(此时u就成为了根节点),令fa[u]=v;(连边),这种方法较快速度(O(n)) 更新了最小生成树

  感觉非常暴力,但貌似跑非常快

然后还有一种解法是根据n<=1000和删边次数不超过5000来做的

  参考:http://www.docin.com/p-40358260.html

  删边次数不多,每次暴力重构一下最小生成树,然后用dfs序+st表找lca(因为可以O(1)查询)

      (这个算法正着做可以)

  可能时间有点复杂,考虑优化

    查询的话,查询O(1) 的在线lca写法;

    修改的话,可以采用上面那个用fa数组维护的最小生成树的更新方法,更新时间O(n)(这个时间非常不满);

      这样就不用每次重新mlogm求一遍最小生成树了

      求出新最小生成树后,有一个预处理O(n),查询O(1)的lca写法;这里执行预处理

          O(n)预处理 (均值RMQ https://www.cnblogs.com/intercept/p/10029466.html ),

  当然这种修改的话就不能正着做了,需要倒着来

  时间O(修改次数*n+查询次数*1)

  

转载于:https://www.cnblogs.com/intercept/p/10024007.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364816.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JDBC 4.0鲜为人知的Clob.free()和Blob.free()方法

在会议上谈论jOOQ时&#xff0c;我总是展示此幻灯片&#xff0c;其中包含许多人们经常犯的非常常见的JDBC错误&#xff1a; 此图中的六个常见的JDBC错误 您可以找到错误吗&#xff1f; 其中一些是显而易见的&#xff0c;例如&#xff1a; 第4行&#xff1a;由于第3行的连接…

反沙箱——SetErrorMode

目录 1.前言 2.原理讲解 3.代码实现 4.参考 1.前言 利用SetErrorMode进行反沙箱的技术&#xff0c;在2010年就有被提出&#xff0c;但是之前搜了很久都没有相关内容&#xff0c;这里简单的说一下这个反沙箱的实现。反沙箱参考GandCrab5.2。 2.原理讲解 首先讲一下SetErrorMode这…

bat java 启动脚本_从bat脚本运行的Java应用程序上的Windows关闭挂钩

小编典典在极少数情况下&#xff0c;虚拟机可能会中止&#xff0c;即在不完全关闭的情况下停止运行。当虚拟机在外部终止时会发生这种情况&#xff0c;例如在Unix上使用SIGKILL信号或在MicrosoftWindows上使用TerminateProcess调用。因此&#xff0c;不幸的是&#xff0c;我认为…

C89和C99区别--简单总结

&#xff08;1&#xff09;对数组的增强 可变长数组  C99中,程序员声明数组时,数组的维数可以由任一有效的整型表达式确定,包括只在运行时才能确定其值的表达式,这类数组就叫做可变长数组,但是只有局部数组才可以是变长的.可变长数组的维数在数组生存期内是不变的,也就是说,可…

四、spring boot 1.5.4 日志管理

spring boot日志默认采用logback进行输出&#xff0c;你可以对logback进行定制化&#xff0c;方法如下&#xff1a; 在resources文件夹下建立logback.xml配置文件 <?xml version"1.0" encoding"UTF-8"?> <configuration><!-- base.xml i…

使用MyBatis和Spring构建Java Web应用程序

这篇文章将展示如何在Spring环境中使用带有MyBatis框架的MYSQL DB创建学生注册应用程序。 这是一个简单的应用程序&#xff0c;旨在在注册期间从用户收集输入详细信息&#xff0c;将详细信息保存在MYSQL DB中&#xff0c;并在登录期间对它们进行身份验证。 1.使用Maven模板创建…

codeforces 1136E-Nastya Hasn't Written a Legend

传送门&#xff1a;QAQQAQ 题意&#xff1a;有一个数组a和一个数组k&#xff0c;数组a一直保持一个性质&#xff1a;a[i 1] > a[i] k[i]。有两种操作&#xff1a;1&#xff0c;给某个元素加上x&#xff0c;但是加上之后要保持数组a的性质。比如a[i]加上x之后&#xff0c;a…

java打印word_Java jacob调用打印机打印word文档

前面说了Java如何生成复杂的Word文档&#xff0c;今年记录下Java如何调用打印机打印word文档。起初用的是自带的PrintJob&#xff0c;但是系统提供的打印机制并不成熟完整。网上的代码也是千篇一律&#xff0c;在我的打印设备Canon iR2525/2530 UFRII LT上&#xff0c;我能获取…

将Spring MVC RESTful Web服务迁移到Spring 4

1引言 Spring 4为MVC应用程序带来了一些改进 。 在这篇文章中&#xff0c;我将重点介绍宁静的Web服务&#xff0c;并通过采用Spring 3.2实现的项目并将其升级到Spring 4来尝试这些改进。以下几点总结了本文的内容&#xff1a; 从Spring 3.2迁移到Spring 4.0 变化中的Response…

layui的富文本编辑器怎么赋值

除了上面讲的方法外&#xff0c;还可以使用layedit自带的方法赋值/*** 设置编辑器内容* param {[type]} index 编辑器索引* param {[type]} content 要设置的内容* param {[type]} flag 是否追加模式*/layedit.setContent(index, content, flag);flag是true&#xff0c;是追加模…

java scrollpane 设置透明_java swing 之 JScrollPane(滚动面板)的使用

/*** java swing 之JScrollPane面板* 在设置界面时&#xff0c;可能会遇到在一个较小的容器窗体中显示一个较大部分的内容&#xff0c;这时可以使用* JScrollPane面板&#xff0c;JscrollPane面板是带滚动条的面板&#xff0c;也是一种容器&#xff0c;但是常用于布置单个* 控件…

cefsharp重写默认js弹窗(alert/confirm/prompt)

1.设置js弹窗控制器 webView.JsDialogHandler this; //js弹窗控制 this表示本类对象&#xff0c;所以本类要实现IJsDialogHandler接口 2.实现IJsDialogHandler接口接口方法 public bool OnJSAlert(IWebBrowser browser, string url, string message){MessageBox.Show(messa…

休眠事实:如何“断言” SQL语句计数

介绍 Hibernate简化了CRUD操作&#xff0c;尤其是在处理实体图时。 但是任何抽象都有其代价&#xff0c;而Hibernate也不例外。 我已经讨论了获取策略和了解Criteria SQL查询的重要性&#xff0c;但是您可以做更多的事情来统治JPA。 这篇文章是关于控制Hibernate代表您调用的SQ…

软件工程(2019)第三次个人作业

目录 软件工程第三次作业问题描述分析并设计程序程序流程图选择覆盖标准并设计测试样例软件工程第三次作业 项目地址 问题描述 题目(1)&#xff1a;最大连续子数组和&#xff08;最大子段和&#xff09; 背景 问题&#xff1a; 给定n个整数&#xff08;可能为负数&#xff09;组…

Flutter - 创建侧滑菜单

侧滑菜单在安卓App里面非常常见&#xff0c;比如Gmail&#xff0c;Google Play&#xff0c;Twitter等。看下图 网上也有很多创建侧滑菜单的教程&#xff0c;我也来记录一下&#xff0c;自己学习创建Drawer的过程。 1. 创建一个空的App import package:flutter/material.dart;cl…

java框架白话_Java NIO框架Netty教程(二) 白话概念

"Hello World"的代码固然简单&#xff0c;不过其中的几个重要概念(类)和 Netty的工作原理还是需要简单明确一下&#xff0c;至少知道其是负责什。方便自己以后更灵活的使用和扩展。声明&#xff0c;笔者一介码农&#xff0c;不会那么多专业的词汇和缩写&#xff0c;只…

js实现字体和容器宽高随窗口改变

用于字体大小和容器的宽高字体和宽高设为rem就可以了 var html document.documentElement;   function fonts(){   var hW html.offsetWidth;   var hS hW / 50;   html.style.fontSize hS "px"; } //浏览器窗口改变自动刷新 $(window).resize…

使用SWTEventHelper清除SWT侦听器通知

为基于SWT的UI编写测试通常需要以编程方式通知小部件侦听器。 不幸的是&#xff0c;用于创建&#xff0c;初始化并最终触发事件的代码有点冗长&#xff0c;并且分散了测试的实际目的。 在几次编写了类似的初始化例程之后&#xff0c;我想出了一个小实用程序类&#xff0c;它避免…

java逆向_Java逆向基础之异常

异常由之前月份处理修改的例子//清单1IncorrectMonthException.javapublic class IncorrectMonthException extends Exception {private int index;public IncorrectMonthException(int index) {this.index index;}public int getIndex() {return index;}}//清单2Month2.javac…

luogu4770 [NOI2018]你的名字 后缀自动机 + 线段树合并

其实很水的一道题吧.... 题意是&#xff1a;每次给定一个串\(T\)以及\(l, r\)&#xff0c;询问有多少个字符串\(s\)满足&#xff0c;\(s\)是\(T\)的子串&#xff0c;但不是\(S[l .. r]\)的子串 统计\(T\)本质不同的串&#xff0c;建个后缀自动机 然后自然的可以想到&#xff0c…