用 LCT 维护颜色相同连通块,然后在线段树上查一下逆序对个数就可以了.

code:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#define N 100005
#define ll long long
using namespace std;
namespace IO
{
void setIO(string s)
{
string in=s+".in";
string out=s+".out";
freopen(in.c_str(),"r",stdin);
// freopen(out.c_str(),"w",stdout);
}
};
ll ans;
int n,val[N],A[N];
namespace seg
{
int lazy[N<<2],sum[N<<2];
void mark(int now) { sum[now]=0,lazy[now]=1; }
void pushdown(int now)
{
if(lazy[now])
mark(now<<1),mark(now<<1|1),lazy[now]=0;
}
void update(int l,int r,int now,int p,int v)
{
if(l==r) { sum[now]+=v; return; }
pushdown(now);
int mid=(l+r)>>1;
if(p<=mid)
update(l,mid,now<<1,p,v);
else
update(mid+1,r,now<<1|1,p,v);
sum[now]=sum[now<<1]+sum[now<<1|1];
}
int query(int l,int r,int now,int L,int R)
{
if(L>R)
return 0;
if(l>=L&&r<=R)
return sum[now];
pushdown(now);
int re=0,mid=(l+r)>>1;
if(L<=mid)
re+=query(l,mid,now<<1,L,R);
if(R>mid)
re+=query(mid+1,r,now<<1|1,L,R);
return re;
}
};
namespace LCT
{
#define lson s[x].ch[0]
#define rson s[x].ch[1]
struct node {
int ch[2],rev,f,tag,size;
}s[N];
int sta[N];
inline int get(int x) { return s[s[x].f].ch[1]==x; }
inline int isr(int x) { return s[s[x].f].ch[0]!=x&&s[s[x].f].ch[1]!=x; }
inline void pushup(int x) { s[x].size=s[lson].size+s[rson].size+1; }
inline void mark(int x,int v) { s[x].tag=v; }
inline void pushdown(int x)
{
if(lson) mark(lson,s[x].tag);
if(rson) mark(rson,s[x].tag);
}
inline void rotate(int x)
{
int old=s[x].f,fold=s[old].f,which=get(x);
if(!isr(old))
s[fold].ch[s[fold].ch[1]==old]=x;
s[old].ch[which]=s[x].ch[which^1];
if(s[old].ch[which])
s[s[old].ch[which]].f=old;
s[x].ch[which^1]=old,s[old].f=x,s[x].f=fold;
pushup(old),pushup(x);
}
inline void splay(int x)
{
int v=0,u=x,fa;
for(sta[++v]=u;!isr(u);u=s[u].f)
sta[++v]=s[u].f;
for(;v;--v)
pushdown(sta[v]);
for(u=s[u].f;(fa=s[x].f)!=u;rotate(x))
if(s[fa].f!=u)
rotate(get(fa)==get(x)?fa:x);
}
inline void Access(int x,int v)
{
for(int y=0;x;y=x,x=s[x].f)
{
splay(x),rson=0,pushup(x);
ans+=(ll)s[x].size*seg::query(1,n,1,1,s[x].tag-1);
seg::update(1,n,1,s[x].tag,s[x].size);
rson=y,s[x].tag=v,pushup(x);
}
}
inline void link(int x,int y) { s[y].f=x; }
#undef lson
#undef rson
};
int main()
{
// IO::setIO("input");
int i,j;
scanf("%d",&n);
for(i=1;i<=n;++i)
scanf("%d",&val[i]),A[i]=val[i];
sort(A+1,A+1+n);
for(i=1;i<=n;++i)
val[i]=lower_bound(A+1,A+1+n,val[i])-A,LCT::s[i].tag=val[i];
for(i=1;i<n;++i)
{
int x,y;
scanf("%d%d",&x,&y);
ans=0;
seg::mark(1);
LCT::Access(x,val[y]);
LCT::link(x,y);
printf("%lld\n",ans);
}
return 0;
}

  

LOJ #2831. 「JOISC 2018 Day 1」道路建设 线段树+Link-cut-tree的更多相关文章

  1. [LOJ #2833]「JOISC 2018 Day 1」帐篷

    题目大意:有一个$n\times m$的网格图,若一个人的同一行或同一列有人,他就必须面向那个人,若都无人,就可以任意一个方向.若一个人无法确定方向,则方案不合法,问不同的方案数.$n,m\leqsl ...

  2. LOJ 2840「JOISC 2018 Day 4」糖

    有趣的脑子题(可惜我没有脑子 好像也可以称为模拟费用流(? 我们考虑用链表维护这个东西 再把贡献扔到堆里贪心就好了 大概就是类似于有反悔机制的贪心?我们相当于把选中的一个打上一个-v的tag然后如果选 ...

  3. loj#2838 「JOISC 2018 Day 3」比太郎的聚会

    分析 预处理每个点的前根号小的距离 对于每次询问删除点小于根号则已经处理好 否则直接暴力dp即可 代码 #include<bits/stdc++.h> using namespace st ...

  4. LOJ 2737 「JOISC 2016 Day 3」电报 ——思路+基环树DP

    题目:https://loj.ac/problem/2737 相连的关系形成若干环 / 内向基环树 .如果不是只有一个环的话,就得断开一些边使得图变成若干链.边的边权是以它为出边的点的点权. 基环树的 ...

  5. Loj #2731 「JOISC 2016 Day 1」棋盘游戏

    Loj 2731 「JOISC 2016 Day 1」棋盘游戏 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少 ...

  6. LOJ 2736 「JOISC 2016 Day 3」回转寿司 ——堆+分块思路

    题目:https://loj.ac/problem/2736 如果每个询问都是 l = 1 , r = n ,那么每次输出序列的 n 个数与本次操作的数的最大值即可.可以用堆维护. 不同区间的询问,可 ...

  7. loj 2392「JOISC 2017 Day 1」烟花棒

    loj 答案显然满足二分性,先二分一个速度\(v\) 然后显然所有没有点火的都会往中间点火的人方向走,并且如果两个人相遇不会马上点火,要等到火快熄灭的时候才点火,所以这两个人之后应该在一起行动.另外有 ...

  8. @loj - 6353@「CodePlus 2018 4 月赛」组合数问题 2

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 请你找到 k 个不同的组合数,使得对于其中任何一个组合数 \(C ...

  9. 「JOISC 2018 Day 3」比太郎的聚会

    题解: 很套路的题目 我们按照询问中的不算的个数是否大于$block$分类 如果大于,就$O(n)dp$一下 如果小于,就预处理出到每个点前$block$小的点 $block取\sqrt{n}$的话复 ...

随机推荐

  1. Java数据结构系列(1)——自平衡二叉树

    1.基本概念 所谓自平衡二叉树,就是当我们插入或删除元素之后,二叉树的高度会自动调整到最小,这样我们就可以在对数时间内查找二叉树内的元素. 2.定义 TreeSet<Elemtype> s ...

  2. HDU_2510_打表

    http://acm.hdu.edu.cn/showproblem.php?pid=2510 dfs打表. #include<iostream> #include<cstdio> ...

  3. WeChall_Training: PHP LFI (Exploit, PHP, Training)

    Your mission is to exploit this code, which has obviously an LFI vulnerability: GeSHi`ed PHP code 1 ...

  4. js变量和函数提升

    写在前面: 变量提升是 声明提升,初始化不会提升,比如说 var a=1; console.log(a); 实际是这样执行(个人理解,仅供参考) var a; console.log(a); a=1; ...

  5. Newcoder Wannafly13 B Jxy军训(费马小定理、分数在模意义下的值)

    链接:https://www.nowcoder.com/acm/contest/80/B 题目描述 在文某路学车中学高一新生军训中,Jxc正站在太阳下站着军姿,对于这样的酷热的阳光,Jxc 表示非常不 ...

  6. 【题解】P1020 导弹拦截

    [题解]P1020 导弹拦截 从n^2到nlogn 第二问就是贪心,不多说 第一问: 简化题意:求最长不下降子序列 普通n^2: for (int i = 1; i <= n; i++) for ...

  7. 单线程的REDIS为什么这么快?

    REDIS是单线程处理所有请求,和一般经典实际上推荐的方式相反,那么单线程串行处理,为什么依然能够做到很快呢?知乎上的一个答案如下,其中线程切换和锁不是性能主要影响因素的观点和一般的答案都不同: 作者 ...

  8. 详解Net Core Web Api项目与在NginX下发布

    前言 本文将介绍Net Core的一些基础知识和如何NginX下发布Net Core的WebApi项目. 测试环境 操作系统:windows 10 开发工具:visual studio 2019 框架 ...

  9. Windows AD日志分析平台WatchAD安装教程

    目录 WatchAD介绍 安装环境 WatchAD安装(日志分析端服务) 基础环境配置 安装WatchAD 运行WatchAD WatchAD-web安装(Web监控端服务) 下载WatchAD-We ...

  10. js面试相关

    〇,字符串,数值,数组的转化 (0)检测数据类型 参考连接:http://www.cnblogs.com/onepixel/p/5126046.html 1,, typeof 操作符 :  能检测到( ...