cf1172E Nauuo and ODT(LCT)
首先可以转化问题,变为对每种颜色分别考虑不含该颜色的简单路径条数。然后把不是当前颜色的点视为白色,是当前颜色的点视为黑色,显然路径数量是每个白色连通块大小的平方和,然后题目变为:黑白两色的树,单点翻转颜色,维护白色连通块大小平方和,然后根据Auuan大佬的题解,我用了LCT。就是对每个点维护子树、儿子大小平方和,在 link/cut 的时候更新答案。初始化所有点是白色,离线处理每个颜色即可。
这题放在2h比赛上,除了lxl其他人都写不出来(况且lxl还是本题出题人呢)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=4e5+;
int n,m,c[N],f[N],fa[N],ch[N][],sum[N],sz[N];
ll ans,d[N],sz2[N];
bool vis[N];
vector<int>vec[N][],G[N];
bool nroot(int x){return x==ch[fa[x]][]||x==ch[fa[x]][];}
void pushup(int x){sum[x]=sum[ch[x][]]+sum[ch[x][]]+sz[x]+;}
void rotate(int x)
{
int y=fa[x],z=fa[y],w=x==ch[y][];
if(nroot(y))ch[z][y==ch[z][]]=x;
fa[x]=z,ch[y][w]=ch[x][w^],fa[ch[x][w^]]=y,ch[x][w^]=y,fa[y]=x;
pushup(y),pushup(x);
}
void splay(int x)
{
while(nroot(x))
{
int y=fa[x],z=fa[y];
if(nroot(y))
{
if((x==ch[y][])^(y==ch[z][]))rotate(x);
else rotate(y);
}
rotate(x);
}
}
void access(int x)
{
int y=;
while(x)
{
splay(x);
sz[x]+=sum[ch[x][]]-sum[y];
sz2[x]+=1ll*sum[ch[x][]]*sum[ch[x][]]-1ll*sum[y]*sum[y];
ch[x][]=y;
pushup(x);
x=fa[y=x];
}
}
int findrt(int x)
{
access(x),splay(x);
while(ch[x][])x=ch[x][];
splay(x);
return x;
}
void link(int x)
{
int y=f[x],z;
splay(x);
ans-=sz2[x]+1ll*sum[ch[x][]]*sum[ch[x][]];
z=findrt(y);
access(x),splay(z);
ans-=1ll*sum[ch[z][]]*sum[ch[z][]];
fa[x]=y;
splay(y);
sz[y]+=sum[x],sz2[y]+=1ll*sum[x]*sum[x];
pushup(y),access(x),splay(z);
ans+=1ll*sum[ch[z][]]*sum[ch[z][]];
}
void cut(int x)
{
int y=f[x],z;
access(x);
ans+=sz2[x];
z=findrt(y);
access(x),splay(z);
ans-=1ll*sum[ch[z][]]*sum[ch[z][]];
splay(x);
ch[x][]=fa[ch[x][]]=;
pushup(x),splay(z);
ans+=1ll*sum[ch[z][]]*sum[ch[z][]];
}
void dfs(int u)
{for(int i=;i<G[u].size();i++)if(G[u][i]!=f[u])f[G[u][i]]=u,dfs(G[u][i]);}
int main()
{
scanf("%d%d",&n,&m);
ll lst;
for(int i=;i<=n;i++)
scanf("%d",&c[i]),vec[c[i]][].push_back(i),vec[c[i]][].push_back();
for(int i=;i<=n+;i++)sum[i]=;
for(int i=,x,y;i<n;i++)scanf("%d%d",&x,&y),G[x].push_back(y),G[y].push_back(x);
for(int i=,u,v;i<=m;i++)
{
scanf("%d%d",&u,&v);
vec[c[u]][].push_back(u),vec[c[u]][].push_back(i);
c[u]=v;
vec[v][].push_back(u),vec[v][].push_back(i);
}
f[]=n+;
dfs();
for(int i=;i<=n;i++)link(i);
for(int i=;i<=n;i++)
{
if(!vec[i][].size()){d[]+=1ll*n*n;continue;}
if(vec[i][][])d[]+=1ll*n*n,lst=1ll*n*n;else lst=;
for(int j=;j<vec[i][].size();j++)
{
int u=vec[i][][j];
if(vis[u]^=)cut(u);else link(u);
if(j==vec[i][].size()-||vec[i][][j+]!=vec[i][][j])
d[vec[i][][j]]+=ans-lst,lst=ans;
}
for(int j=vec[i][].size()-;~j;j--)
{
int u=vec[i][][j];
if(vis[u]^=)cut(u);else link(u);
}
}
ans=1ll*n*n*n;
for(int i=;i<=m;i++)ans-=d[i],printf("%lld\n",ans);
}
cf1172E Nauuo and ODT(LCT)的更多相关文章
- 【CF1172E】Nauuo and ODT(Link-Cut Tree)
[CF1172E]Nauuo and ODT(Link-Cut Tree) 题面 CF 给你一棵树,每个节点有一个颜色. 定义一条路径的权值为路径上不同颜色的数量.求所有有向路径的权值和. 有\(m\ ...
- CF1172E Nauuo and ODT
CF1172E Nauuo and ODT 神仙题orz 要算所有路径的不同颜色之和,多次修改,每次修改后询问. 对每种颜色\(c\)计算多少条路径包含了这个颜色,不好算所以算多少条路径不包含这个颜色 ...
- 「ZJOI2018」历史(LCT)
「ZJOI2018」历史(LCT) \(ZJOI\) 也就数据结构可做了-- 题意:给定每个点 \(access\) 次数,使轻重链切换次数最大,带修改. \(30pts:\) 挺好想的.发现切换次数 ...
- P4172 [WC2006]水管局长(LCT)
P4172 [WC2006]水管局长 LCT维护最小生成树,边权化点权.类似 P2387 [NOI2014]魔法森林(LCT) 离线存储询问,倒序处理,删边改加边. #include<iostr ...
- 从ZOJ2114(Transportation Network)到Link-cut-tree(LCT)
[热烈庆祝ZOJ回归] [首先声明:LCT≠动态树,前者是一种数据结构,而后者是一类问题,即:LCT—解决—>动态树] Link-cut-tree(下文统称LCT)是一种强大的数据结构,不仅可以 ...
- 【洛谷4172】 [WC2006]水管局长(LCT)
传送门 洛谷 BZOJ Solution 如果不需要动态的话,那就是一个裸的最小生成树上的最大边权对吧. 现在动态了的话,把这个过程反着来,就是加边对吧. 现在问题变成了怎么动态维护加边的最小生成树, ...
- LCT总结——应用篇(附题单)(LCT)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--概念篇戳这里 题单 灰常感谢XZY巨佬提供的强力资磁!(可参考XZY巨佬的博客总结) 题单对于系 ...
- SP16580 QTREE7 - Query on a tree VII(LCT)
题意翻译 一棵树,每个点初始有个点权和颜色(输入会给你) 0 u:询问所有u,v路径上的最大点权,要满足u,v路径上所有点颜色相同 1 u:反转u的颜色 2 u w:把u的点权改成w 题解 Qtree ...
- SP16549 QTREE6 - Query on a tree VI(LCT)
题意翻译 题目描述 给你一棵n个点的树,编号1~n.每个点可以是黑色,可以是白色.初始时所有点都是黑色.下面有两种操作请你操作给我们看: 0 u:询问有多少个节点v满足路径u到v上所有节点(包括)都拥 ...
随机推荐
- 【转载】webDriver拾级而上·之五 iframe的处理
有时候我们在定位一个页面元素的时候发现一直定位不了,反复检查自己写的定位器没有任何问题,代码也没有任何问题.这时你就要看一下这个页面元素是否在一个iframe中,这可能就是找不到的原因之一. 如果你在 ...
- spring学习第8天(advisor)
1.关于之前的一个错误:aop的输出顺序,实际上官方文档上并没有说是否按照书写顺序输出的,有可能你1000次里面800次按顺序输出,200是随机输出的.<aop:aspect>有一个ord ...
- word 2007 文档中添加文件
1. "插入"->"对象",出现的下拉框中选择"对象" 2.弹出界面 3.切换至"由文件创建",点击"浏 ...
- 实验3- 熟悉常用的 HBase 操作
石家庄铁道大学信息科学与技术学院 实验报告 2018年----2019年 第一学期 题目: 熟悉常用的 HBase ...
- Angular全局数据管理与同步更新
自定义实现angular中数据的状态管理,如有不妥请指正 一.先介绍一下rxjs中subject: Import {subject}from’rxjs’ Subject 数据的订阅与分发,结合报刊的发 ...
- 10 ~ express ~ 使用 cookie 保存用户 信息
思维导图: (1) 保存 cookie (2)销毁 cookie 一,保存 cookie 1,app.js . 新增代码 var Cookies = require('cookies') /** * ...
- Vulkan SDK之 Swapchain
Swapchain是一系列最终会展示给用户的图像的集合. /* * Set up swapchain: * - Get supported uses for all queues * - Try to ...
- C语言:大数求和
点击获取题目 1410: [蓝桥杯]高精度加法 时间限制: 1 Sec 内存限制: 256 MB提交: 28 解决: 20[状态] [提交] [命题人:外部导入] 题目描述 输入两个整数a和b,输 ...
- POJ 1836:Alignment
Alignment Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 14492 Accepted: 4698 Descri ...
- Git--记一次丢失本地记录但是代码已提交到gerrit
参考 https://blog.csdn.net/yucendulang/article/details/76199913 https://stackoverflow.com/questions/28 ...