[2016北京集训试题14]股神小D-[LCT]
Description
Solution
将(u,v,l,r)换为(1,u,v,l)和(2,u,v,r)。进行排序(第4个数为第一关键字,第1个数为第二关键字)。用LCT维护联通块的合并和断开。(维护联通块的大小,要维护虚边)
答案统计:每当四元组的第一个数为1(这时候合并点u,v所在连通块,反之拆开),在合并前ans+=size[u]*size[v]即可。
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=2e5+;
long long ans;
struct LCT
{
int val[N],sz[N],v[N],fa[N],ch[N][],rev[N];
bool isroot(int x){return ch[fa[x]][]!=x&&ch[fa[x]][]!=x;}
bool get(int x){return ch[fa[x]][]==x;}
void updata(int x){sz[x]=sz[ch[x][]]+sz[ch[x][]]+v[x]+;}
void rotate(int x)
{
int k=get(x),y=fa[x];
ch[y][k]=ch[x][k^];fa[ch[y][k]]=y;
if (!isroot(y)) ch[fa[y]][ch[fa[y]][]==y]=x;fa[x]=fa[y];
fa[y]=x;ch[x][k^]=y;
updata(y);
updata(x);
}
void pushdown(int x)
{
if (rev[x])
{
swap(ch[x][],ch[x][]);
rev[ch[x][]]^=;rev[ch[x][]]^=;
rev[x]=;
}
}
int q[N],cnt;
void splay(int x)
{
int y;
q[cnt=]=x;
for (int i=x;!isroot(i);i=fa[i]) q[++cnt]=fa[i];
for (int i=cnt;i>=;i--) pushdown(q[i]),fa[q[i]]=fa[q[i]];
while (!isroot(x))
{
y=fa[x];
if (!isroot(y)) rotate(get(x)==get(y)?y:x);
rotate(x);
}
}
void access(int x)
{
int y=;
while (x)
{
splay(x);
v[x]+=sz[ch[x][]]-sz[y];
ch[x][]=y;
updata(x);
y=x;x=fa[x];
}
}
void mroot(int x)
{
access(x);splay(x);rev[x]^=;
}
void link(int x,int y)
{
mroot(x);access(y);splay(y);
ans+=1ll*sz[x]*sz[y];
fa[x]=y;v[y]+=sz[x];updata(y);
}
void cut(int x,int y)
{
mroot(x);access(y);splay(y);
fa[x]=ch[y][]=;
updata(y);
}
}lct;
int n,u,v,l,r;
struct Q{int t,u,v,w;
friend bool operator <(Q a,Q b){return a.w==b.w?a.t<b.t:a.w<b.w;}
}q[N<<];
int main()
{
scanf("%d",&n);
for (int i=;i<n;i++)
{
scanf("%d%d%d%d",&u,&v,&l,&r);
q[i*-]=Q{,u,v,l};q[i*]=Q{,u,v,r};
}
sort(q+,q+*n-);
for (int i=;i<=*n-;i++)
{
if (q[i].t==) lct.link(q[i].u,q[i].v);
else lct.cut(q[i].u,q[i].v);
}
cout<<ans;
}
[2016北京集训试题14]股神小D-[LCT]的更多相关文章
- (2016北京集训十四)【xsy1556】股神小D - LCT
题解: 题解居然是LCT……受教了 把所有区间按照端点排序,动态维护目前有重叠的区间,用LCT维护即可. 代码: #include<algorithm> #include<iostr ...
- [2016北京集训试题15]cot-[分块]
Description Solution 如图,假如我们知道了以任何一个点为顶点的135-180度的前缀和和90-180度的前缀和,我们就可以搞出三角形的面积. 差分.add[i][j]和dev[i] ...
- [2016北京集训试题15]项链-[FFT]
Description Solution 设y[i+k]=y[i]+n. 由于我们要最优解,则假如将x[i]和y[σ[i]]连线的话,线是一定不会交叉的. 所以,$ans=\sum (x_{i}-y_ ...
- [2016北京集训试题6]mushroom-[bitset]
Description Solution bitset是个好东西啊..强行压位什么的真是够orz. 由于所有的蘑菇上房间的长相是一样的,我们针对每个房间,算出它到根节点的bitset和以它为根的子树的 ...
- [2016北京集训试题6]网络战争-[最小割树(网络流)+kd-tree+倍增]
Description A 联邦国有 N 个州,每个州内部都有一个网络系统,有若干条网络线路,连接各个 州内部的城市. 由于 A 国的州与州之间的关系不是太好,每个州都只有首府建立了到别的州的网络.具 ...
- [2016北京集训试题6]魔法游戏-[博弈论-sg函数]
Description Solution 首先,每个节点上的权值可以等价于该节点上有(它的权的二进制位数+1)个石子,每次可以拿若干个石子但不能不拿. 然后就发现这和NIM游戏很像,就计算sg函数em ...
- [2016北京集训试题8]连在一起的幻想乡[dp+无向图计数]
Description Solution 本博客参考yww大佬的博客,为了加深理解我就自己再写一遍啦. 以下的“无向图”均无重边无自环. 定义f0[n]为n个点构成的无向图个数,f1[n]为n个点构成 ...
- [2016北京集训试题7]thr-[树形dp+树链剖分+启发式合并]
Description Solution 神仙操作orz. 首先看数据范围,显然不可能是O(n2)的.(即绝对不是枚举那么简单的),我们考虑dp. 定义f(x,k)为以x为根的子树中与x距离为k的节点 ...
- 股神小L 2016Vijos省选集训 day1
股神小L (stock.c/pas/cpp)============================ 小L厌倦了算法竞赛,希望到股市里一展身手.他凭借自己还行的计算机功底和可以的智商,成功建立一个模型 ...
随机推荐
- 7.log4j2的使用
一.简介 log4j2相对于log4j 1.x有了脱胎换骨的变化,其官网宣称的优势有多线程下10几倍于log4j 1.x和logback的高吞吐量.可配置的审计型日志.基于插件架构的各种灵活配置等.如 ...
- .Net Core+Vue.js+ElementUI 实现前后端分离
.Net Core+Vue.js+ElementUI 实现前后端分离 Tags: Vue 架构 前端采用:Vue.js.Element-UI.axios 后端采用:.Net Core Mvc 本项目是 ...
- Linux下安装Tomcat7
一.Tomcat7软件包下载 Tomcat下载地址http://tomcat.apache.org/download-70.cgi 下载完成后, 将软件包apache-tomcat-7.0.82.ta ...
- Windows下Git使用报错:warning:LF will be replaced by CRLF in ××××.××
Windows下Git使用报错: warning:LF will be replaced by CRLF in ××××.××(文件名) The file will have its original ...
- Mycat问题总结
Mycat问题总结 一丶自增主键设置 Mycat提供了几种设置自增主键的方式 本地文件方式 数据库方式 服务器时间戳方式 分布式ZK-ID生成器 第一种和第二种只适合单点设置,对于集群不适用.第四种方 ...
- Windows10 1709正式版WSL安装(以Ubuntu为例)
因为最近要使用Linux搭服务器,但是用远程的话延迟很烦,用双系统切换很麻烦,用虚拟机又会有点卡,刚好Windows10最近更新了正式版的WSL(windows下的Linux子系统),所以就想尝试一下 ...
- python3 装饰器全解
本章结构: 1.理解装饰器的前提准备 2.装饰器:无参/带参的被装饰函数,无参/带参的装饰函数 3.装饰器的缺点 4.python3的内置装饰器 5.本文参考 理解装饰器的前提:1.所有东西都是对象( ...
- PHP设计模式系列 - 装饰器
什么是装饰器 装饰器模式,对已有对象的部分内容或者功能进行调整,但是不需要修改原始对象结构,可以使用装饰器设 应用场景 设计一个UserInfo类,里面有UserInfo数组,用于存储用户名信息 通过 ...
- 工作中碰到的一个问题(cookie相关)
今天上线了一个API,6台机器做的集群.API的第一步是读取cookie,判断用户是否登录. 例如,线上服务器分别是 10.255.242.1 10.255.242.2 10.255.242.3 10 ...
- 安装配置maven私服-nexus
1.ubuntu下的Bundle安装方式 1.1. 去官网下载安装包:http://www.sonatype.org/nexus/ 我这里下载的是:nexus-2.8.1-01-bundle.zip, ...