Orz PoPoQQQ

  • 学到了维护子树信息的时候用dfsdfsdfs序套主席树节省线段树空间.
  • 学到了怎么用指针写可持久化线段树…emmm…

CODE

只贴上3551加强版带强制在线的代码

#include <queue>
#include <cctype>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL; char cb[1<<15],*cs=cb,*ct=cb;
#define getc() (cs==ct&&(ct=(cs=cb)+fread(cb,1,1<<15,stdin),cs==ct)?0:*cs++)
template<class T>inline void read(T &res) {
char ch; int flg = 1; for(;!isdigit(ch=getc());)if(ch=='-')flg=-flg;
for(res=ch-'0';isdigit(ch=getc());res=res*10+ch-'0'); res*=flg;
} const int MAXN = 200005;
const int MAXM = 500005; struct edge{ int u, v, w; }e[MAXM];
inline bool cmp(const edge &A, const edge &B) { return A.w < B.w; } int n, m, q, tot, w[MAXN], b[MAXN], bel[MAXN], in[MAXN], out[MAXN], id[MAXN], tmr; int fir[MAXN], to[MAXN], nxt[MAXN], f[MAXN][18], g[MAXN][18], cnt; struct seg { seg *ls, *rs;
int sum; inline void* operator new (size_t, seg *l, seg *r, int _) {
seg *re;
static seg *mempool, *C;
if(C == mempool) mempool = (C = new seg[1<<15]) + (1<<15);
re = C++;
re->ls = l;
re->rs = r;
re->sum = _;
return re;
} }*rt[MAXN]; inline void Add(int u, int v) {
to[++cnt] = v; nxt[cnt] = fir[u]; fir[u] = cnt;
} int find(int x) {
if(bel[x] == x || !bel[x]) return bel[x] = x;
else return bel[x] = find(bel[x]);
}
inline void Kruskal() {
sort(e + 1, e + m + 1, cmp);
for(int i = 1; i <= m; ++i) {
int x = find(e[i].u), y = find(e[i].v);
if(x != y) { ++n;
Add(n, x), Add(n, y);
f[x][0] = f[y][0] = n;
g[x][0] = g[y][0] = e[i].w;
bel[x] = bel[y] = n;
}
}
} void dfs(int x) {
id[in[x] = ++tmr] = x;
for(int i = fir[x]; i; i = nxt[i])
dfs(to[i]);
out[x] = tmr;
} inline int Get_rt(int x, int lim) {
for(int j = 17; ~j; --j)
if(f[x][j] && g[x][j] <= lim)
x = f[x][j];
return x;
} seg* insert(seg *p, int l, int r, int x) {
if(l == r) return new(0x0, 0x0, p->sum+1) seg;
int mid = (l + r) >> 1;
if(x <= mid) return new(insert(p->ls, l, mid, x), p->rs, p->sum+1) seg;
else return new(p->ls, insert(p->rs, mid+1, r, x), p->sum+1) seg;
} int query(seg *x, seg *y, int l, int r, int k) {
if(l == r) return l;
int mid = (l + r) >> 1;
if(y->rs->sum - x->rs->sum >= k) return query(x->rs, y->rs, mid+1, r, k);
else return query(x->ls, y->ls, l, mid, k - y->rs->sum + x->rs->sum);
}; int main () {
read(n), read(m), read(q);
for(int i = 1; i <= n; ++i)
read(w[i]), b[++tot] = w[i]; sort(b + 1, b + tot + 1);
tot = unique(b + 1, b + tot + 1) - b - 1; for(int i = 1; i <= n; ++i)
w[i] = lower_bound(b + 1, b + tot + 1, w[i]) - b; for(int i = 1; i <= m; ++i)
read(e[i].u), read(e[i].v), read(e[i].w); Kruskal(); dfs(n); for(int j = 1; j < 18; ++j)
for(int i = 1; i <= n; ++i) if(f[i][j-1])
f[i][j] = f[f[i][j-1]][j-1],
g[i][j] = max(g[i][j-1], g[f[i][j-1]][j-1]); rt[0] = new(0x0, 0x0, 0) seg; //init
rt[0]->ls = rt[0]->rs = rt[0]; for(int i = 1; i <= n; ++i)
if(w[id[i]]) rt[i] = insert(rt[i-1], 0, tot, w[id[i]]);
else rt[i] = rt[i-1]; int ans = 0, v, x, k; b[0] = -1;
while(q--) {
read(v), read(x), read(k);
v ^= ans, x ^= ans, k ^= ans;
int root = Get_rt(v, x);
if(out[root]-in[root]+1 < k) printf("%d\n", ans = -1);
else printf("%d\n", ans = b[query(rt[in[root]-1], rt[out[root]], 0, tot, k)]);
if(!~ans) ans = 0;
}
}

BZOJ 3551/3545: [ONTAK2010]Peaks加强版 (Kruskal树+dfs序上的主席树+倍增)的更多相关文章

  1. 【BZOJ 3551】[ONTAK2010] Peaks加强版 Kruskal重构树+树上倍增+主席树

    这题真刺激...... I.关于Kruskal重构树,我只能开门了,不过补充一下那玩意还是一棵满二叉树.(看一下内容之前请先进门坐一坐) II.原来只是用树上倍增求Lca,但其实树上倍增是一种方法,L ...

  2. bzoj 3551 kruskal重构树dfs序上的主席树

    强制在线 kruskal重构树,每两点间的最大边权即为其lca的点权. 倍增找,dfs序对应区间搞主席树 #include<cstdio> #include<cstring> ...

  3. 【BZOJ-1146】网络管理Network DFS序 + 带修主席树

    1146: [CTSC2008]网络管理Network Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 3495  Solved: 1032[Submi ...

  4. BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]

    3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...

  5. [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)

    3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2438  Solved: 763[Submit][ ...

  6. BZOJ4771 七彩树(dfs序+树上差分+主席树)

    考虑没有深度限制怎么做.显然的做法是直接转成dfs序上主席树,但如果拓展到二维变成矩形数颜色数肯定没法做到一个log. 另一种做法是利用树上差分.对于同种颜色的点,在每个点处+1,dfs序相邻点的lc ...

  7. BZOJ.3551.[ONTAK2010]Peaks加强版(Kruskal重构树 主席树)

    题目链接 \(Description\) 有n个座山,其高度为hi.有m条带权双向边连接某些山.多次询问,每次询问从v出发 只经过边权<=x的边 所能到达的山中,第K高的是多少. 强制在线. \ ...

  8. BZOJ 3551: [ONTAK2010]Peaks加强版 Kruskal重构树+dfs序+主席树+倍增

    建出来 $Kruskal$ 重构树. 将询问点向上跳到深度最小,且合法的节点上. 那么,得益于重构树优美的性质,这个最终跳到的点为根的所有子节点都可以与询问点互达. 对于子树中求点权第 $k$ 大的问 ...

  9. 【bzoj3545/bzoj3551】[ONTAK2010]Peaks/加强版 Kruskal+树上倍增+Dfs序+主席树

    bzoj3545 题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询 ...

随机推荐

  1. [Agc029C]Lexicographic constraints_进制_二分答案_贪心

    Lexicographic constraints 题目链接:https://atcoder.jp/contests/agc029/tasks/agc029_c 数据范围:略. 题解: 二分是显然的, ...

  2. MySQL数据库CPU飙升紧急处理方法

    MySQL数据库CPU飙升紧急处理方法 运行平稳的数据库,如果遇到CPU狂飙,到80%左右,那一定是开发写的烂SQL导致的,DBA首先要保证的是,数据库别跑挂了,所以我们要把那些运行慢的SQL杀死并记 ...

  3. 项目中通过单元测试代码中的spring事务是否起作用

    今儿没事,想对代码中事务进行测试,于是乎就创建了一个单元测试进行测试,发现在方法中加上@Transactional注解后,发现在想数据库中插入数据时,代码执行成功,但数据库中却没有数据,于是各种检查, ...

  4. Python解Leetcode: 226. Invert Binary Tree

    leetcode 226. Invert Binary Tree 倒置二叉树 思路:分别倒置左边和右边的结点,然后把根结点的左右指针分别指向右左倒置后返回的根结点. # Definition for ...

  5. shiro整合shiro多验证登录(账号密码登录和使用手机验证码登录)

    1. 首先新建一个shiroConfig  shiro的配置类,代码如下: @Configuration是标识这个类是一个配置文件,在启动时会加载这个类里面的内容,这个配置文件的位置的一定一定一定不能 ...

  6. 第6章:使用Python监控Linux系统

    1.Python编写的监控工具 1).多功能系统资源统计工具dstat dstat是一个用Python编写的多功能系统资源统计工具,用来取代Linux下的vmstat,iostat,netstat和i ...

  7. DaemonSet和StatefulSet

    DaemonSet 的使用 通过该控制器的名称我们可以看出它的用法:Daemon,就是用来部署守护进程的,DaemonSet用于在每个Kubernetes节点中将守护进程的副本作为后台进程运行,说白了 ...

  8. hdu 6053 trick gcd 容斥

    http://acm.hdu.edu.cn/showproblem.php?pid=6053 题意:给定一个数组,我们定义一个新的数组b满足bi<ai 求满足gcd(b1,b2....bn)&g ...

  9. MySQL设置自增字段

    1.MySQL每张表只能有1个自增字段,这个自增字段即可作为主键,也可用作非主键使用,但是请注意将自增字段当做非主键使用时必须为其添加唯一索引,否则系统将会报错 )将自动增长字段设置为主键 CREAT ...

  10. 在realm中动态查询用户的权限&角色

    @Controller @Scope("prototype") @Namespace("/") @ParentPackage("struts-defa ...