Boss Bo (主席树)
主要想法:假设给你足够时间,那么就可以对每个点建议一颗线段树来查询了,但是需要将点全部按照某个特定的序列存进线段树,如代码是以树的深搜顺序作为指定顺序,这样以来我们既可以将数据查询分成诺干个区间进行查询了,减少了大量查询。那么这样你都知道了,其实只需要利用主席树将每个点的情况都存进去主席树里面,因为对于相邻的点来说有着太多的重复情况了,所以我们可以利用这个数据结构来优化时间。
#include<bits/stdc++.h>
#define mm ((l + r) >> 1)
#define inf 0x3f3f3f3f
#define maxn 100070
#define maxm 5000700
using namespace std; vector<int>Gra[maxn];
pair<int, int>a[maxn];
int st[maxn], ed[maxn], dep[maxn], lab[maxn], rt[maxn];
int sum[maxm], mi[maxm], ma[maxm], add[maxm], ch[maxm][];
int N, Q, ntr, tot, lastans, bb, aa; ///求深度、设置编号顺序
void dfs1(int u, int no, int d){
dep[u] = d;
st[u] = ++ntr;
lab[ntr] = u;
for(int i = Gra[u].size() - ; i >= ; i--){
int v = Gra[u][i];
if(v != no) dfs1(v, u, d + );
}
ed[u] = ntr;
} ///数据跟新
void push_up(int rt, int l, int r){
sum[rt] = sum[ch[rt][]] + sum[ch[rt][]] + (r - l + ) * add[rt];
ma[rt] = max(ma[ch[rt][]], ma[ch[rt][]]) + add[rt];
mi[rt] = min(mi[ch[rt][]], mi[ch[rt][]]) + add[rt];
} ///建树
int buildTree(int l, int r){
int rt = ++tot;
if(l == r){
sum[rt] = ma[rt] = mi[rt] = dep[lab[l]] - ;
ch[rt][] = ch[rt][] = add[rt] = ;
return rt;
}
sum[rt] = ma[rt] = mi[rt] = add[rt] = ;
ch[rt][] = buildTree(l, mm);
ch[rt][] = buildTree(mm + , r);
push_up(rt, l, r);
return rt;
} ///更新区间、 更新值、 实际区间、 旧的数据点
int update(int ll, int rr, int v, int l, int r, int old){
int rt = ++tot;
sum[rt] = sum[old]; add[rt] = add[old];
ma[rt] = ma[old]; mi[rt] = mi[old];
ch[rt][] = ch[old][]; ch[rt][] = ch[old][];
if(ll == l && rr == r){
add[rt] += v;
sum[rt] += (rr - ll + ) * v;
ma[rt] += v;
mi[rt] += v;
return rt;
}
if(rr <= mm) ch[rt][] = update(ll, rr, v, l, mm, ch[old][]);
else if(ll > mm) ch[rt][] = update(ll, rr, v, mm + , r, ch[old][]);
else{
ch[rt][] = update(ll, mm, v, l, mm, ch[old][]);
ch[rt][] = update(mm + , rr, v, mm + , r, ch[old][]);
}
push_up(rt, l, r);
return rt;
} ///遍历所有点为每个点在主席树中植入一个版本。关于以该点根的情况。
void dfs2(int u, int no){
for(int i = Gra[u].size() - ; i >= ; i --){
int v = Gra[u][i];
if(v == no) continue;
rt[v] = update(st[v], ed[v], -, , N, rt[u]);
if(st[v] > ) rt[v] = update(, st[v] - , , , N, rt[v]);
if(ed[v] < N) rt[v] = update(ed[v] + , N, , , N, rt[v]);
dfs2(v, u);
}
} ///相当于查询关于某个点版本的线段树
int query(int ll, int rr, int t, int l, int r, int rt){
if(l == ll && r == rr){
if(t == ) return sum[rt];
else if(t == ) return mi[rt];
else return ma[rt];
}
if(rr <= mm){
int ret = query(ll, rr, t, l, mm, ch[rt][]);
if(t == ) return ret + (rr - ll + ) * add[rt];
else return ret + add[rt];
}else if(ll > mm){
int ret = query(ll, rr, t, mm + , r, ch[rt][]);
if(t == ) return ret + (rr - ll + ) * add[rt];
else return ret + add[rt];
}else{
int retl = query(ll, mm, t, l, mm, ch[rt][]);
int retr = query(mm + , rr, t, mm + , r, ch[rt][]);
if(t == ) return retl + retr + (rr - ll + ) * add[rt];
if(t == ) return min(retl, retr) + add[rt];
if(t == ) return max(retl, retr) + add[rt];
}
} int main(){
while(~scanf("%d%d",&N,&Q)){
for(int i = ; i <= N; i ++) Gra[i].clear();
for(int i = ; i < N; i ++){
scanf("%d%d",&aa,&bb);
Gra[aa].push_back(bb);Gra[bb].push_back(aa);
}
lastans = tot = ntr = ;
dfs1(, -, );
rt[] = buildTree(, N);
dfs2(, -); int K, T, P, x;
while(Q -- ){
scanf("%d%d%d", &K, &P, &T);
P = (lastans + P) % N + ;
bool rootsign = false;
for(int i = ; i < K; i ++){
scanf("%d", &x);
a[i] = make_pair(st[x], ed[x]);
rootsign = x == ? true : rootsign;
}
if(rootsign){
printf("-1\n");
lastans = ;
continue;
}
sort(a, a + K);
a[K ++] = make_pair(N + , N + );
///排完序之后按照中间空开的区间查询关于某个点的某种数据
if(T == ) lastans = ;
else if(T == ) lastans = inf;
else lastans = -inf;
int pre = ;
for(int i = ; i < K; i ++){
if(pre < a[i].first){
int tmp = query(pre, a[i].first - , T, , N, rt[P]);
if(T == ) lastans += tmp;
else if(T == ) lastans = min(lastans, tmp);
else lastans = max(lastans, tmp);
}
pre = max(pre, a[i].second + );
}
printf("%d\n",lastans);
}
}
return ;
}
Boss Bo (主席树)的更多相关文章
- HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- 主席树:HDU 4417 Super Mario
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- BZOJ 1146: [CTSC2008]网络管理Network( 树链剖分 + 树状数组套主席树 )
树链剖分完就成了一道主席树裸题了, 每次树链剖分找出相应区间然后用BIT+(可持久化)权值线段树就可以完成计数. 但是空间问题很严重....在修改时不必要的就不要新建, 直接修改原来的..详见代码. ...
- bzoj 1901 主席树+树状数组
修改+查询第k小值 单纯主席树修改会打乱所有,所以再套一个树状数组维护前缀和使得修改,查询都是log 对了,bzoj上不需要读入组数,蜜汁re.. #include<cstdio> #in ...
- Super Mario HDU - 4417 (主席树)
Mario is world-famous plumber. His “burly” figure and amazing jumping ability reminded in our memory ...
- hdu 4417 Super Mario 树状数组||主席树
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Prob ...
- Super Mario(主席树)
Super Mario Mario is world-famous plumber. His “burly” figure and amazing jumping ability reminded ...
- hdu4417 主席树求区间小于等于K
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 Problem Description Mario is world-famous plum ...
- bzoj3207--Hash+主席树
题目大意: 给定一个n个数的序列和m个询问(n,m<=100000)和k,每个询问包含k+2个数字:l,r,b[1],b[2]...b[k],要求输出b[1]~b[k]在[l,r]中是否出现. ...
随机推荐
- java之获取资源文件
背景介绍 在java程序中有时我们需要加载项目中的某些资源文件(如:config.properties之类),以便获取里面的值,这样可以避免某些需要经常修改的数据硬编码入业务程序中 实现方式 实现这种 ...
- python中由于中文路径引起的os.path.isfile(imgpath) == False问题
昨天在用python脚本处理文件的时候,遇到了题述问题,明明文件时存在的,但是在用os.path.isfile(imgpath) == False进行判断的时候总是成立,在一开始以为是正反斜杠wind ...
- 关于WARN Dispatcher:68 - Could not find action or result报错
出现这个错 00:03:37,142 WARN Dispatcher:68 - Could not find action or result: /crm/linkMan_addLinkMan.act ...
- 为什么要使用 Docker(二)
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势. 更高效的利用系统资源 由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高.无 ...
- jquery小结收藏
//根据id获取控件的值,如果没有数据默认赋值为0 function getDataById(id) { var data = $("#"+id).val(); if(data== ...
- Spring Boot下的lombok安装以及使用简介
引言:lombok是一套代码模板解决方案,将极大提升开发的效率,这里介绍给大家使用. 1. Lombok lombok是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java ...
- Python Socket实现文件上传(TCP协议)
在TCP协议下通过socket模块实现文件上传 #!/usr/bin/env python # -*- coding: utf-8 -*- # desc: tcp_server_file_upload ...
- 配置Tomcat启用Https安全协议的访问
1.首先使用keytool工具生成证书文件名为cnkey,然后拷贝此证书即文件到tomcat安装目录conf下(放到哪里都行,主要在下面配置中指明路径就好了.这里我就放这了conf) 2.配置serv ...
- js贪心算法---背包问题
/* * @param {Object} capacity 背包容量 6 * @param {Object} weights 物品重量 [2,3,4] * @param {Object} values ...
- (转载)Spring定时任务的几种实现
spring框架定时任务 一.分类 从实现的技术上来分类,目前主要有三种技术(或者说有三种产品): Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerT ...