【树上莫队】bzoj3757 苹果树】的更多相关文章

3757: 苹果树 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1305  Solved: 503[Submit][Status][Discuss] Description 神犇家门口种了一棵苹果树.苹果树作为一棵树,当然是呈树状结构,每根树枝连接两个苹果,每个苹果都可以沿着一条由树枝构成的路径连到树根,而且这样的路径只存在一条.由于这棵苹果树是神犇种的,所以苹果都发生了变异,变成了各种各样的颜色.我们用一个到n之间的正整数来表示一种颜色.树上…
树上莫队共有三种写法: 1.按DFS序列分块,和普通莫队类似.常数大,不会被卡. 2.按块状树的方式分块.常数小,会被菊花图卡到O(n). 3.按[BZOJ1086]王室联邦的方式分块.常数小,不会被卡.唯一的缺点是较抽象,一个块可能是不连通的. 权衡一下当然还是写第三种做法,具体看代码. 然后还有一个问题,手动模拟莫队移动左右端点指针的过程,会发现LCA处较难处理,它常常是跟其它点反着的.于是我们每次移指针的时候都忽略LCA,最后询问的时候加上LCA求解答案再减去LCA.再模拟会发现,所有方案…
Description ​ 神犇家门口种了一棵苹果树.苹果树作为一棵树,当然是呈树状结构,每根树枝连接两个苹果,每个苹果都可以沿着一条由树枝构成的路径连到树根,而且这样的路径只存在一条.由于这棵苹果树是神犇种的,所以苹果都发生了变异,变成了各种各样的颜色.我们用一个到n之间的正整数来表示一种颜色.树上一共有n个苹果.每个苹果都被编了号码,号码为一个1到n之间的正整数.我们用0代表树根.只会有一个苹果直接根. 有许许多多的人来神犇家里膜拜神犇.可神犇可不是随便就能膜拜的.前来膜拜神犇的人需要正确回…
传送门 一道树上莫队. 先用跟bzoj1086一样的方法给树分块. 分完之后就可以莫队了. 但是两个询问之间如何转移呢? 感觉很难受啊. 我们定义S(u,v)" role="presentation" style="position: relative;">S(u,v)S(u,v)表示u->v这条路径的点集,T(u,v)" role="presentation" style="position: rela…
点此看题面 大致题意: 每次问你树上两点之间路径中有多少种颜色,每次询问可能会将一种颜色\(a\)看成\(b\). 树上莫队 这题是一道树上莫队板子题. 毕竟求区间中有多少种不同的数是莫队算法的经典应用啊. 关于将颜色\(a\)看成\(b\) 这操作其实很好处理. 只要判断\(cnt_a\)和\(cnt_b\)是否同时\(>0\)即可. 但要注意特判\(a==b\)的情况. 代码 #include<bits/stdc++.h> #define N 50000 #define Q 1000…
2016-05-09 UPD:学习了新的DFS序列分块,然后发现这个东西是战术核导弹?反正比下面的树分块不知道要快到哪里去了 #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 50003; const int M = 100003; void read(int &k) { k = 0; in…
构建:像线性的莫队那样,依旧是按sqrt(n)为一块分块. int dfs(int x){ ; dfn[x]=++ind; ;i<=;i++) if (bin[i]<=deep[x]) fa[x][i]=fa[fa[x][i-]][i-]; else break; for (int i=first[x];i;i=next[i]){ int pur=go[i]; ]){ fa[pur][]=x; deep[pur]=deep[x]+; size+=dfs(pur); if (size>=b…
题目链接:BZOJ - 3052 题目分析 这道题就是非常经典的树上莫队了,并且是带修改的莫队. 带修改的莫队:将询问按照 左端点所在的块编号为第一关键字,右端点所在的块为第二关键字,位于第几次修改之后为第三关键字 排序. 我们将块的大小设置在 n^(2/3) ,这样一共有 n^(1/3) 个块.最后算法的总复杂度会是 n^(5/3) . 每一次如何从上一个询问转移来呢? 假设上一个询问是 (lx, ly, lt) ,这次的询问是 (x, y, t) .t 代表是在第 t 次修改操作之后. 首先…
题目链接 http://codeforces.com/blog/entry/43230树上莫队从这里学的,  受益匪浅.. #include <iostream> #include <vector> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <map> #include <set> #i…
传送门 题意: 单点修改,求一条链的mex 分块维护权值,$O(1)$修改$O(S)$求mex...... 带修改树上莫队 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; typedef long long ll; ; inline int read(){ ,f=;…