还是来致敬一下那过往吧

题目分析

先丢代码

 #include<bits/stdc++.h>
const int maxn = ;
const int maxm = ;
const int maxNode = ; struct node
{
int top,son,fa,tot;
}a[maxn];
struct point
{
int u,v;
point(int a=, int b=):u(a),v(b) {}
};
struct tree
{
int ls,rs,cov,val;
}f[maxNode];
int n,m,tot;
long long ans,det;
int chain[maxn],chTot,rt[maxn];
int edgeTot,head[maxn],edges[maxm],nxt[maxm],dep[maxn];
std::vector<point> opt[maxn];
std::vector<int> inc[maxn],dec[maxn]; int read()
{
char ch = getchar();
int num = , fl = ;
for (; !isdigit(ch); ch=getchar())
if (ch=='-') fl = -;
for (; isdigit(ch); ch=getchar())
num = (num<<)+(num<<)+ch-;
return num*fl;
}
void addedge(int u, int v)
{
edges[++edgeTot] = v, nxt[edgeTot] = head[u], head[u] = edgeTot;
edges[++edgeTot] = u, nxt[edgeTot] = head[v], head[v] = edgeTot;
}
void dfs1(int x, int fa)
{
dep[x] = dep[fa]+, a[x].tot = ;
a[x].top = a[x].son = -, a[x].fa = fa;
for (int i=head[x]; i!=-; i=nxt[i])
{
int v = edges[i];
if (v==fa) continue;
dfs1(v, x), a[x].tot += a[v].tot;
if (a[x].son==-||a[a[x].son].tot < a[v].tot)
a[x].son = v;
}
}
void dfs2(int x, int top)
{
a[x].top = top, chain[x] = ++chTot;
if (a[x].son==-) return;
dfs2(a[x].son, top);
for (int i=head[x]; i!=-; i=nxt[i])
if (edges[i]!=a[x].fa&&edges[i]!=a[x].son)
dfs2(edges[i], edges[i]);
}
void splitChain(int id, int u, int v)
{
inc[u].push_back(id), inc[v].push_back(id);
while (a[u].top!=a[v].top)
{
if (dep[a[u].top] > dep[a[v].top]) std::swap(u, v);
opt[id].push_back(point(chain[a[v].top], chain[v]));
v = a[a[v].top].fa;
}
if (dep[u] > dep[v]) std::swap(u, v);
opt[id].push_back(point(chain[u], chain[v]));
dec[u].push_back(id), dec[a[u].fa].push_back(id);
}
void pushup(int rt, int len)
{
if (f[rt].cov) f[rt].val = len;
else f[rt].val = f[f[rt].ls].val+f[f[rt].rs].val;
}
void mergeSeg(int &u, int v, int l, int r)
{
if (!u||!v) u += v;
else{
int mid = (l+r)>>;
f[u].cov += f[v].cov;
mergeSeg(f[u].ls, f[v].ls, l, mid);
mergeSeg(f[u].rs, f[v].rs, mid+, r);
}
pushup(u, r-l+);
}
void update(int &rt, int L, int R, int l, int r, int c)
{
if (!rt) rt = ++tot;
if (L <= l&&r <= R) f[rt].cov += c, pushup(rt, r-l+);
else{
int mid = (l+r)>>;
if (L <= mid) update(f[rt].ls, L, R, l, mid, c);
if (R > mid) update(f[rt].rs, L, R, mid+, r, c);
}
pushup(rt, r-l+);
}
void delta(int x, int fa)
{
for (int i=head[x]; i!=-; i=nxt[i])
if (edges[i]!=fa) delta(edges[i], x);
for (int l=; l<inc[x].size(); l++)
for (int i=,mx=opt[inc[x][l]].size(); i<mx; i++)
update(rt[x], opt[inc[x][l]][i].u, opt[inc[x][l]][i].v, , n, );
for (int l=; l<dec[x].size(); l++)
for (int i=,mx=opt[dec[x][l]].size(); i<mx; i++)
update(rt[x], opt[dec[x][l]][i].u, opt[dec[x][l]][i].v, , n, -);
int val = f[rt[x]].val;
if (val) ans += val, ++det;
mergeSeg(rt[fa], rt[x], , n);
}
int main()
{
memset(head, -, sizeof head);
n = read(), m = read();
for (int i=; i<n; i++)
addedge(read(), read());
dfs1(, ), dfs2(, );
for (int i=; i<=m; i++)
splitChain(i, read(), read());
delta(, );
printf("%lld\n",(ans-det)/);
return ;
}

【线段树 树链剖分 差分 经典技巧】loj#3046. 「ZJOI2019」语言【未完】的更多相关文章

  1. bzoj5518 & loj3046 「ZJOI2019」语言 线段树合并+树链的并

    题目传送门 https://loj.ac/problem/3046 题解 首先问题就是问有多少条路径是给定的几条路径中的一条的一个子段. 先考虑链的做法. 枚举右端点 \(i\),那么求出 \(j\) ...

  2. @loj - 3043@「ZJOI2019」线段树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 九条可怜是一个喜欢数据结构的女孩子,在常见的数据结构中,可怜最喜 ...

  3. 【LOJ】#3043. 「ZJOI2019」线段树

    LOJ#3043. 「ZJOI2019」线段树 计数转期望的一道好题-- 每个点设两个变量\(p,q\)表示这个点有\(p\)的概率有标记,有\(q\)的概率到祖先的路径上有个标记 被覆盖的点$0.5 ...

  4. LOJ #2359. 「NOIP2016」天天爱跑步(倍增+线段树合并)

    题意 LOJ #2359. 「NOIP2016」天天爱跑步 题解 考虑把一个玩家的路径 \((x, y)\) 拆成两条,一条是 \(x\) 到 \(lca\) ( \(x, y\) 最近公共祖先) 的 ...

  5. Loj #2570. 「ZJOI2017」线段树

    Loj #2570. 「ZJOI2017」线段树 题目描述 线段树是九条可怜很喜欢的一个数据结构,它拥有着简单的结构.优秀的复杂度与强大的功能,因此可怜曾经花了很长时间研究线段树的一些性质. 最近可怜 ...

  6. loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点

    loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点 链接 loj 思路 用交错关系建出图来,发现可以直接缩点,拓扑统计. 完了吗,不,瓶颈在于边数太多了,线段树优化建图. 细节 ...

  7. 「ZJOI2019」线段树 解题报告

    「ZJOI2019」线段树 听说有人喷这个题简单,然后我就跑去做,然后自闭感++,rp++(雾) 理性分析一波,可以发现最后形成的\(2^k\)个线段树,对应的操作的一个子集,按时间顺序作用到这颗线段 ...

  8. loj#2665. 「NOI2013」树的计数

    目录 题目链接 题解 代码 题目链接 loj#2665. 「NOI2013」树的计数 题解 求树高的期望 对bfs序分层 考虑同时符合dfs和bfs序的树满足什么条件 第一个点要强制分层 对于bfs序 ...

  9. HDU 5452——Minimum Cut——————【树链剖分+差分前缀和】ACdream 1429——Diversion——————【树链剖分】

    Minimum Cut Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)Tota ...

随机推荐

  1. vue element-ui IE9--11报 “无法获取未定义或null引用的属性‘toLowerCase’”

    今天做zymh比赛的一个管理后台,用的技术是vue+element-ui+vue-router+axios,其他浏览器运行的很好,但是在IE(从IE11到IE9,vue支持IE9以上)都报错 点进去就 ...

  2. js中的面向对象程序设计

    面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装.继承.多态的特性!但JS中对象与纯面向对象语言中的对象是不同的,ECMA标准定义J ...

  3. Educational Codeforces Round 66 (Rated for Div. 2) A. From Hero to Zero

    链接:https://codeforces.com/contest/1175/problem/A 题意: You are given an integer nn and an integer kk. ...

  4. Codeforces #564div2 E1(记忆化搜索)

    虽然不是正解但毕竟自己做出来了还是记下来吧- 对每个人分别dfs得到其期望,某两维的组合情况有限所以Hash一下避免了MLE. #include <cstdio> #include < ...

  5. springboot集成log4j

    需求: 1.springboot集成log4j 2.mybatis 打印 sql 实现: pom.xml <dependency> <groupId>org.springfra ...

  6. windows 2008 r2或win7安装SP1补丁,安装sqlserver 2012

    说明:安装sql server 2012时,win7和win2008r2系统都需要打sp1补丁. 1.SP1补丁下载地址(建议用迅雷下载): http://download.microsoft.com ...

  7. Java微信公众平台开发(十一)--微信JSSDK中Config配置

    JSSDK曾经引爆前端以及后端的工程师,其魔性的力量毋庸置疑,在我们的技术眼里它的实现原理和根本是不能够被改变的,这篇文章就不对其js的实现做任何评价和解说了(因为我也不是很懂,哈哈),这里要说的是它 ...

  8. 图解css3のborder-radius

    早期制作圆角都是使用图片来实现.通过用1px 的水平线条来堆叠出圆角或者利用JavaScript等等方法,但是都是需要增加多个无意义的标签来实现,造成代码亢余.如今有了CSS3的圆角属性——borde ...

  9. Java_面向对象的 static 和 abstract

    static:表示静态的 static:可以用来修饰属性.方法.代码块(或初始化块).内部类. 一.static修饰属性(类变量): public class TestStatic { //stati ...

  10. 几种常用排序算法代码实现和基本优化(持续更新ing..)

    插入排序(InsertSort): 插入排序的基本思想:元素逐个遍历,在每次遍历的循环中,都要跟之前的元素做比较并“交换”元素,直到放在“合适的位置上”. 插入排序的特点:时间复杂度是随着待排数组的有 ...