[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厌倦了算法竞赛,希望到股市里一展身手.他凭借自己还行的计算机功底和可以的智商,成功建立一个模型 ...
随机推荐
- TestNG 判断文件下载成功
用WatchService写一个方法放在onTestStart()方法里监听文件夹的变化. 但是判断下载成功还需要写一个方法, 用来判断什么时候文件从.xlsx.rcdownload改成.xlsx才行 ...
- 3.CSS使用基础(2)
目录 一.CSS 链接 二.CSS 列表样式(ul) 三.CSS Table(表格) 四.盒子模型 五.CSS Border(边框) 六.CSS 轮廓(outline)属性 七.CSS Margin( ...
- 网站换了HTTPS后残留部分http处理方式
网站换了HTTPS后残留部分http处理方式,以前添加的文章里面是有http的,导致浏览器打开网站的时候提示证书不安全,解决方法很简单 在html页面上加上这一段话 <!-- 强制让http的访 ...
- [翻译] ZLHistogramAudioPlot
ZLHistogramAudioPlot A hardware-accelerated audio visualization view using EZAudio, inspired by Audi ...
- linux 创建新用户并增加管理员权限
1.adduser与useradd有什么区别?2.那种方式会自动创建组.用户组等信息? 3.如何新建用户具有管理员权限? $是普通管员,#是系统管理员,root用户默认是没有密码的,因此也就无法使用( ...
- JDBC 连接mysql获取中文时的乱码问题
前段时间学习JDBC,要连接mysql获取数据.按照老师的样例数据,要存一些名字之类的信息,用的都是英文名,我当时就不太想用英文,就把我室友的名字存了进去,嘿嘿,结果,出问题了. 连接数据库语句: s ...
- jumpserver 问题,给自己看的哦,你们不准看哟
给自己看的,排版忽略! http://docs.jumpserver.org/zh/docs/setup_by_centos7.html 看完全部文档后解决不了再看下边的!!! docker 服务启动 ...
- Hadoop HBase概念学习系列之HBase里的存储数据流程(二十三)
这个,很简单,但凡是略懂大数据的,就很清楚,不多说,直接上图.
- Shell中, 退出整个脚本
常规做法 cat >test.sh<<EOF'' #!/bin/bash exit_script(){ exit 1 } echo "before exit" e ...
- 各版本eclipse的maven配置
1.indgo(3.7) install new software: http://download.eclipse.org/releases/indigo