BZOJ3720 Gty的妹子树 询问分块、主席树
学到了询问分块的科技……
对于修改操作,每发生了\(S\)次修改就重构整棵树,小于\(S\)次的修改操作丢到一个队列里面。
对于每一次查询操作,先在主席树上查询当前子树内部大于\(k\)的节点的数量,然后依次将队列中的修改放到树上,在答案统计完成之后再将这些修改撤销。使用倍增检验某一个点是否在子树内,如果在子树内则考虑这个节点的权值修改或加入对于答案的影响。
修改的复杂度为\(O(\frac{N}{S}NlogN)\),查询的复杂度为\(O(NSlogN)\),当\(S = \sqrt{N}\)时有最优复杂度\(O(N \sqrt N logN)\)
因为分块的玄学性,\(S\)取\(\sqrt N\)可能会T,取\(\sqrt N logN\)跑得挺快。。。
#include<bits/stdc++.h>
#define mid ((l + r) >> 1)
#define st first
#define nd second
#define PII pair < int , int >
#define PIII pair < int , pair < int , int > >
//This code is written by Itst
using namespace std;
inline int read(){
int a = 0;
char c = getchar();
while(!isdigit(c))
c = getchar();
while(isdigit(c)){
a = a * 10 + c - 48;
c = getchar();
}
return a;
}
const int MAXN = 6e4 + 7;
struct Edge{
int end , upEd;
}Ed[MAXN << 1];
struct node{
int l , r , sum;
}Tree[MAXN * 30];
int head[MAXN] , val[MAXN] , dfn[MAXN] , sz[MAXN] , dep[MAXN] , jump[MAXN][21];
int N , N1 , M , T , ts , cntN , cntEd , cntL , lsh[MAXN] , rt[MAXN];
deque < PIII > q;
queue < PII > rev;
bool vis[MAXN];
inline void addEd(int a , int b){
Ed[++cntEd].end = b;
Ed[cntEd].upEd = head[a];
head[a] = cntEd;
}
int insert(int x , int l , int r , int tar){
int t = ++cntN;
Tree[t] = Tree[x];
++Tree[t].sum;
if(l != r)
if(mid >= tar)
Tree[t].l = insert(Tree[t].l , l , mid , tar);
else
Tree[t].r = insert(Tree[t].r , mid + 1 , r , tar);
return t;
}
void dfs(int x , int p){
dep[x] = dep[p] + 1;
dfn[x] = ++ts;
sz[x] = 1;
rt[ts] = insert(rt[ts - 1] , 1 , cntL , val[x]);
jump[x][0] = p;
for(int i = 1 ; jump[x][i - 1] ; ++i)
jump[x][i] = jump[jump[x][i - 1]][i - 1];
for(int i = head[x] ; i ; i = Ed[i].upEd)
if(Ed[i].end != p){
dfs(Ed[i].end , x);
sz[x] += sz[Ed[i].end];
}
}
inline void build(){
for(int i = 1 ; i <= N ; ++i)
lsh[i] = val[i];
sort(lsh + 1 , lsh + N + 1);
cntL = unique(lsh + 1 , lsh + N + 1) - lsh - 1;
for(int i = 1 ; i <= N ; ++i)
val[i] = lower_bound(lsh + 1 , lsh + cntL + 1 , val[i]) - lsh;
dfs(1 , 0);
}
inline void rebuild(){
cntN = ts = 0;
for(int i = 1 ; i <= N ; ++i)
val[i] = lsh[val[i]];
while(!q.empty()){
PIII t = q.front();
q.pop_front();
if(t.st == 1)
val[t.nd.st] = t.nd.nd;
else
addEd(jump[t.nd.st][0] , t.nd.st);
}
N = N1;
build();
}
int query(int x , int l , int r , int tar){
if(l == r || !x)
return 0;
if(mid >= tar)
return query(Tree[x].l , l , mid , tar) + Tree[Tree[x].r].sum;
else
return query(Tree[x].r , mid + 1 , r , tar);
}
inline int to(int x , int d){
for(int i = 16 ; i >= 0 ; --i)
if(dep[x] - (1 << i) >= d)
x = jump[x][i];
return x;
}
int get(int x , int v){
int sum , l = q.size();
if(v >= lsh[cntL])
sum = 0;
else
if(v < lsh[1])
sum = sz[x];
else
sum = query(rt[dfn[x] + sz[x] - 1] , 1 , cntL , upper_bound(lsh + 1 , lsh + cntL + 1 , v) - lsh - 1) - query(rt[dfn[x] - 1] , 1 , cntL , upper_bound(lsh + 1 , lsh + cntL + 1 , v) - lsh - 1);
for(int i = 0 ; i < l ; ++i){
int t = q[i].nd.st;
if(dep[t] < dep[x] || to(t , dep[x]) != x)
continue;
if(q[i].st == 1){
if(!vis[t]){
vis[t] = 1;
rev.push(PII(t , val[t]));
if(t <= N)
val[t] = lsh[val[t]];
}
if(val[t] <= v && q[i].nd.nd > v)
++sum;
else
if(val[t] > v && q[i].nd.nd <= v)
--sum;
val[t] = q[i].nd.nd;
}
else
if(val[t] > v)
++sum;
}
while(!rev.empty()){
PII t = rev.front();
rev.pop();
vis[t.st] = 0;
val[t.st] = t.nd;
}
return sum;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
freopen("out","w",stdout);
#endif
N1 = N = read();
T = sqrt(N * log2(N));
for(int i = 1 ; i < N ; ++i){
int a = read() , b = read();
addEd(a , b);
addEd(b , a);
}
for(int i = 1 ; i <= N ; ++i)
val[i] = read();
build();
M = read();
int a , b , c , lastans = 0;
for(int i = 1 ; i <= M ; ++i){
a = read();
b = read() ^ lastans;
c = read() ^ lastans;
if(!a){
if(q.size() >= T)
rebuild();
printf("%d\n" , lastans = get(b , c));
}
else{
if(a == 2){
val[++N1] = c;
dep[N1] = dep[b] + 1;
jump[N1][0] = b;
for(int j = 1 ; jump[N1][j - 1] ; ++j)
jump[N1][j] = jump[jump[N1][j - 1]][j - 1];
}
q.push_back(PIII(a , PII(a == 2 ? N1 : b , c)));
}
}
return 0;
}
BZOJ3720 Gty的妹子树 询问分块、主席树的更多相关文章
- 【bzoj3744】Gty的妹子序列 分块+树状数组+主席树
题目描述 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见…… 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzoj3720) 上掉落下来了许多妹子,他发现 她们排成 ...
- P1972 [SDOI2009]HH的项链[离线+树状数组/主席树/分块/模拟]
题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链 ...
- poj 2104 K-th Number (划分树入门 或者 主席树入门)
题意:给n个数,m次询问,每次询问L到R中第k小的数是哪个 算法1:划分树 #include<cstdio> #include<cstring> #include<alg ...
- BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树
BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树 题意: 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i, ...
- BZOJ4012 HNOI2015开店(树链剖分+主席树)
考虑这样一个问题:一棵树初始全是白点,有两种操作:把一个点染黑:询问某点到所有黑点的距离之和. 注意到树上两点x和y的距离为depth[x]+depth[y]-depth[lca(x,y)]*2.要求 ...
- dfs序+主席树 或者 树链剖分+主席树(没写) 或者 线段树套线段树 或者 线段树套splay 或者 线段树套树状数组 bzoj 4448
4448: [Scoi2015]情报传递 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 588 Solved: 308[Submit][Status ...
- 【bzoj1146】[CTSC2008]网络管理Network 倍增LCA+dfs序+树状数组+主席树
题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...
- BZOJ_2120_数颜色_Set+树状数组+主席树
BZOJ_2120_数颜色_Set+树状数组+主席树 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L ...
- zoj2112 树状数组+主席树 区间动第k大
Dynamic Rankings Time Limit: 10000MS Memory Limit: 32768KB 64bit IO Format: %lld & %llu Subm ...
- LuoguP3834 【模板】可持久化线段树 1(主席树)|| 离散化
题目:[模板]可持久化线段树 1(主席树) 不知道说啥. #include<cstdio> #include<cstring> #include<iostream> ...
随机推荐
- 【工具相关】Web-ionic-ionicLab的使用
一,下载地址为:http://lab.ionic.io/,下载后直接安装即可.图标如下图所示: 二,打开ionicLab,如下图所示: 三,打开一个已有的文件,File-->Open Exist ...
- TUM数据集rgbd_benchmark工具的使用方法
# 在学习视觉slam过程中,需要对数据集合进行预处理和对slam或者跟踪结果进行评价,TUM提供一组这样的工具,为了自己以后方便查找,于是把它记录下来 一.RGBD_Benchmark工具下载链接: ...
- 最新安全狗 apache v4.0 sql注入 bypass
前言 最近没事学习一下 waf 的 bypass , 本文介绍下 bypass 安全狗的笔记.个人感觉 bypass 的总思路(正则匹配型 waf)就是利用各种语法特性来逃避正则(当然要保证语法正确性 ...
- 使用反射修改final属性
情型1:static final属性,无法修改其值. package m5.d7; import java.lang.reflect.Field; public class FieldTest { p ...
- 利用python中的gensim模块训练和测试word2vec
word2vec的基础知识介绍参考上一篇博客和列举的参考资料. 首先利用安装gensim模块,相关依赖如下,注意版本要一致: Python >= 2.7 (tested with version ...
- Websocket通信过程
1. 客户端与服务器建立连接 2. 客户端通过session向服务器发送消息 3. 服务器接收客户端的消息,调用服务器端的onMessage()方法包装.生成消息内容(新的消息包括客户端ID) 4. ...
- 适用于 Azure 虚拟网络的常见 PowerShell 命令
如果想要创建虚拟机,需要创建虚拟网络或了解可在其中添加 VM 的现有虚拟网络. 通常情况下,创建 VM 时,还需考虑创建本文所述资源. 有关安装最新版 Azure PowerShell.选择订阅和登录 ...
- python第九十天----jquery
jQuery http://jquery.cuishifeng.cn/ 相当于js的模块,类库 DOM/BOM/JavaScript的类库 一.查找元素 jQuery 选择器 直接找到某个或者某个标签 ...
- Memory barrier 简介
Memory barrier Memory barrier 简介 程序在运行时内存实际的访问顺序和程序代码编写的访问顺序不一定一致,这就是内存乱序访问.内存乱序访问行为出现的理由是为了提升程序运行时的 ...
- 在Java中动态传参调用Python脚本
最近,又接触到一个奇葩的接口,基于老板不断催促赶时间的情况下,在重写java接口和复用已有的python脚本的两条路中选择了后者,但是其实后者并没有好很多,因为我是一个对python的认识仅限于其名称 ...