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}$的话复 ...
随机推荐
- 场景6:具有OpenvSwitch的提供商网络
此场景描述了使用带有Open vSwitch(OVS)的ML2插件的OpenStack网络服务的提供者网络实现. 在OpenStack网络引入分布式虚拟路由器之前,所有网络通信都通过一个或多个专门的网 ...
- VC获取cookies的几种方法
方法一: CInternetSession::GetCookie This member function implements the behavior of the Win32 function ...
- 洛谷P1649 【[USACO07OCT]障碍路线Obstacle Course】
题目描述 Consider an N x N (1 <= N <= 100) square field composed of 1 by 1 tiles. Some of these ti ...
- CCF_ 201412-1_门禁系统
水. #include<iostream> #include<cstdio> using namespace std; int main() { ],num[] = {}; c ...
- 51Nod 1279 扔盘子 (思维+模拟)
题意: 有口井,往里扔盘子,最多扔多少个 n<=5e5, 1s 思路: 如果比较高的地方井口比较小,那么下面的再大也没有用,只需要维护一个单调减的数组然后O(n+m)模拟即可 代码: #incl ...
- Go语言实现:【剑指offer】从上往下打印二叉树
该题目来源于牛客网<剑指offer>专题. 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 不需分层,一维数组. Go语言实现: /** * Definition for a bi ...
- sqlserver附加数据库时出错。有关详细信息,请单击“消息”列中的超链接
在SqlServer中附加数据库时,有时会发生下面的错误. 解决 :可能的问题是放置附加数据库的文件夹的权限问题.如下解决.点击放置附加数据库的文件夹-->右键-->属性 权限要设置为完全 ...
- How to Convert a Class File to a Java File?
What is a programming language? Before introducing compilation and decompilation, let's briefly intr ...
- pytorch-- Attention Mechanism
1. paper: Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translat ...
- win 8.0.12
一.下载 下载页面http://dev.mysql.com/downloads/mysql/ 选择系统平台后,点击download(根据系统选择64或32位) 二.配置 1.下载成功后,解压安装包到要 ...