LOJ #2831. 「JOISC 2018 Day 1」道路建设 线段树+Link-cut-tree
用 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的更多相关文章
- [LOJ #2833]「JOISC 2018 Day 1」帐篷
题目大意:有一个$n\times m$的网格图,若一个人的同一行或同一列有人,他就必须面向那个人,若都无人,就可以任意一个方向.若一个人无法确定方向,则方案不合法,问不同的方案数.$n,m\leqsl ...
- LOJ 2840「JOISC 2018 Day 4」糖
有趣的脑子题(可惜我没有脑子 好像也可以称为模拟费用流(? 我们考虑用链表维护这个东西 再把贡献扔到堆里贪心就好了 大概就是类似于有反悔机制的贪心?我们相当于把选中的一个打上一个-v的tag然后如果选 ...
- loj#2838 「JOISC 2018 Day 3」比太郎的聚会
分析 预处理每个点的前根号小的距离 对于每次询问删除点小于根号则已经处理好 否则直接暴力dp即可 代码 #include<bits/stdc++.h> using namespace st ...
- LOJ 2737 「JOISC 2016 Day 3」电报 ——思路+基环树DP
题目:https://loj.ac/problem/2737 相连的关系形成若干环 / 内向基环树 .如果不是只有一个环的话,就得断开一些边使得图变成若干链.边的边权是以它为出边的点的点权. 基环树的 ...
- Loj #2731 「JOISC 2016 Day 1」棋盘游戏
Loj 2731 「JOISC 2016 Day 1」棋盘游戏 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少 ...
- LOJ 2736 「JOISC 2016 Day 3」回转寿司 ——堆+分块思路
题目:https://loj.ac/problem/2736 如果每个询问都是 l = 1 , r = n ,那么每次输出序列的 n 个数与本次操作的数的最大值即可.可以用堆维护. 不同区间的询问,可 ...
- loj 2392「JOISC 2017 Day 1」烟花棒
loj 答案显然满足二分性,先二分一个速度\(v\) 然后显然所有没有点火的都会往中间点火的人方向走,并且如果两个人相遇不会马上点火,要等到火快熄灭的时候才点火,所以这两个人之后应该在一起行动.另外有 ...
- @loj - 6353@「CodePlus 2018 4 月赛」组合数问题 2
目录 @description@ @solution@ @accepted code@ @details@ @description@ 请你找到 k 个不同的组合数,使得对于其中任何一个组合数 \(C ...
- 「JOISC 2018 Day 3」比太郎的聚会
题解: 很套路的题目 我们按照询问中的不算的个数是否大于$block$分类 如果大于,就$O(n)dp$一下 如果小于,就预处理出到每个点前$block$小的点 $block取\sqrt{n}$的话复 ...
随机推荐
- 五、Shell运算
整数值运算 使用expr命令:只能做整数运算,默认返回计算结果 格式: expr 整数1 运算符 整数2 ... 整数值可以有变量提供,直接给出运算结果 + 加法 expr 43 + 21 .expr ...
- VS2017/19 在更新之后,.net core项目出一个500的神奇错误
先说症状: VS 更新升级之后,如果用的是 .net core 的项目的时候,当vs升级时,.net core的sdk或者runtime有跟着升级的话,项目发布之后,覆盖dll到服务器时,会出现这个错 ...
- 【Pycharm使用者必看】自定义【光标快速定位到行尾】的按键
1.问题描述 使用Pycharm写代码时,有很多比较方便的快捷键,比如:Shift+Enter快速切换到下一行, 但每次切换到多个括号外或者想移动到行尾,就必须按 End 键或者鼠标点击, 这样操作幅 ...
- Java并发编程(三):ReentrantLock
ReentrantLock是可以用来代替synchronized的.ReentrantLock比synchronized更加灵活,功能上面更加丰富,性能方面自synchronized优化后两者性能没有 ...
- Yandex Big Data Essentials Week1 Scaling Distributed File System
GFS Key Components components failures are a norm even space utilisation write-once-read-many GFS an ...
- 《Head first设计模式》之命令模式
命令模式将"请求"封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 一个家电公司想邀请你设计一个家电自动化遥控器的API.这个遥控器有7个 ...
- Shell脚本 小程序演示
一般的shell编程 场景贯穿了几个熟知的步骤: ●显示消息●获取用户输入●存储值到文件●处理存储的数据 这里写一个小程序 包含以上几部 #!/bin/bash while true do #echo ...
- Vscode开发Java环境搭建
VSCode 开发 JAVA 微软为 Java 开发者推出了一个 Visual Studio Code 的安装程序.Visual Studio Code 中目前提供了许多 Java 扩展. 该软件包可 ...
- Danganronpa 水题。
Danganronpa Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- ISO14229系列之二:诊断指令格式和相关概念
作者:autogeek 原文链接:http://www.cnblogs.com/autogeek/p/4458658.html 1. 简单的通信机制 其实诊断通信的机制很简单,可以类比client-s ...