传送门

题意: 一棵树,询问子树中权值大于$k$的节点个数,修改点权值,插入新点;强制在线


一开始以为询问多少种不同的权值,那道CF的强制在线带修改版,直接吓哭

然后发现看错了这不一道树上分块水题...

用王室联邦分块的话需要维护每一个块$dfs$序最小值和最大值,并且插入操作会破坏原来的性质

不如直接按$size$分块,根节点$size<block$就加入根,否则新建块

$size$分块不能保证块的数量,可以被菊花图卡掉,然而本题没有所以就可以安心的写了

每个块维护排序后的值

查询操作,不完整的块(因为是$size$分块所以只有子树根所在块不完整)暴力,直接把块建一个图,每个整块二分

修改维护有序,插入也维护有序;当然修改和插入后重新排序也可以

复杂度 修改插入$O(S)$ 查询$O(S+\frac{N}{S}logS)$

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=6e4+, M=1e4+, S=;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int n,Q,a[N],op,u,x;
struct edge{int v,ne;} e[N<<];
int cnt,h[N];
inline void ins(int u,int v) {
e[++cnt]=(edge){v,h[u]}; h[u]=cnt;
e[++cnt]=(edge){u,h[v]}; h[v]=cnt;
} struct meow{
int a[S], size;
inline void set() {sort(a+, a++size);}
inline int count(int v) {return size - (upper_bound(a+, a++size, v) - a) + ;}
inline void push(int v) {a[++size]=v;}
inline void replace(int x,int v) {
if(x==v) return;
for(int i=;i<=size;i++) if(a[i]==x) {
if(v>x) while(i<size && v>a[i+]) a[i]=a[i+], i++;
else while(i> && v<a[i-]) a[i]=a[i-], i--;
a[i]=v; break;
}
}
inline void insert(int v){
int i;
for(i=; i<=size && a[i]<v; i++) ;
for(int j=size; j>=i; j--) a[j+]=a[j];
a[i]=v; size++;
}
}b[M];
int m, pos[N], block; struct Graph4Block{
struct edge{int v,ne;} e[M];
int cnt,h[M];
inline void ins(int u,int v) {
e[++cnt]=(edge){v,h[u]}; h[u]=cnt;
}
int dfs(int u,int k) {
int ans= b[u].count(k);
for(int i=h[u];i;i=e[i].ne) ans+=dfs(e[i].v, k);
return ans;
}
}G; int fa[N];
void dfs(int u) {
int p=pos[u];
b[p].push(a[u]);
for(int i=h[u];i;i=e[i].ne)
if(e[i].v!=fa[u]) {
fa[e[i].v]=u;
if(b[p].size < block) pos[e[i].v]=p;
else pos[e[i].v]=++m, G.ins(p, m);
dfs(e[i].v);
}
} struct Block{
int dfs(int u,int k) {
int ans= a[u]>k;
for(int i=h[u];i;i=e[i].ne)
if(e[i].v!=fa[u]) {
if(pos[e[i].v] == pos[u]) ans+= dfs(e[i].v, k);
else ans+= G.dfs(pos[e[i].v], k);
}
return ans;
}
int Que(int u, int k) {return dfs(u, k);} void Cha(int u, int d) {b[pos[u]].replace(a[u], d); a[u]=d;} void Ins(int u, int d){
a[++n]=d; ins(u, n); fa[n]=u;
int p=pos[u];
if(b[p].size < block) pos[n]=p, b[p].insert(a[n]);
else pos[n]=++m, b[m].push(a[n]), G.ins(p, m);
}
}B;
int main() {
freopen("in", "r", stdin);
n=read();
for(int i=;i<n;i++) ins(read(), read() );
for(int i=;i<=n;i++) a[i]=read();
block=pow(n, 0.6);
pos[]=++m; dfs();
for(int i=;i<=m;i++) b[i].set(); Q=read(); int lastans=;
for(int i=;i<=Q;i++) {
op=read();
u=read()^lastans; x=read()^lastans;
if(op==) lastans=B.Que(u, x), printf("%d\n",lastans);
else if(op==) B.Cha(u, x);
else B.Ins(u, x);
}
}

BZOJ 3720: Gty的妹子树 [树上size分块]的更多相关文章

  1. [bzoj 3720] Gty的妹子树 (树上分块)

    树上分块(块状树) Description 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕-- Gty神(xian)犇(chong)从来不缺妹子-- 他来到了 ...

  2. bzoj 3720: Gty的妹子树 块状树

    3720: Gty的妹子树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 412  Solved: 153[Submit][Status] Descr ...

  3. BZOJ 3731 3731: Gty的超级妹子树 [树上size分块 !]

    传送门 题意:一棵树,询问子树中权值大于k的节点个数,修改点权值,插入新点,断开边:强制在线 该死该死该死!!!!!! MD我想早睡觉你知不知道 该死该死沙比提 断开边只会影响一个块,重构这个块就行了 ...

  4. bzoj 3720 Gty的妹子树 树分块?瞎搞

    Gty的妹子树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2149  Solved: 781[Submit][Status][Discuss] D ...

  5. BZOJ.3720.Gty的妹子树(树分块)

    题目链接 洛谷上惨遭爆零是为什么.. 另外这个树分块算法是假的. /* 插入删除只涉及一个数,故每次可以枚举一遍,而不是重构完后sort */ #include<cmath> #inclu ...

  6. 【BZOJ3720】Gty的妹子树 块状树

    [BZOJ3720]Gty的妹子树 我曾在弦歌之中听过你,檀板声碎,半出折子戏.舞榭歌台被风吹去,岁月深处尚有余音一缕……Gty神(xian)犇(chong)从来不缺妹子……他来到了一棵妹子树下,发现 ...

  7. bzoj 3744: Gty的妹子序列 主席树+分块

    3744: Gty的妹子序列 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 101  Solved: 34[Submit][Status] Descr ...

  8. BZOJ 3744: Gty的妹子序列 【分块 + 树状数组 + 主席树】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3744 3744: Gty的妹子序列 Time Limit: 20 Sec  Memory ...

  9. BZOJ 3744 Gty的妹子序列

    Description 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见-- 某天,蒟蒻Autumn发现了从 Gty的妹子树上掉落下来了许多妹子,他发现 她们排成了一个序 ...

随机推荐

  1. java初学

    1.Scanner类 1)使用 a.导入Scanner类 improt java.util.Scanner; b.创建Scanner对象 Scanner input = new Scanner(Sys ...

  2. JAVA之JDBC的简单使用(Mysql)

    JDBC增删查改 昨天七七八八的关于Mysql的配置 和 基本使用也算是初步解决了,今天 抽空看了JAVA的JDBC(JAVA DATA BASE CONNECTION)我也不知道我全称拼写对对不对

  3. 关于keil5使用注意事项(预定义、路径包含)

    2017.12.17  下午 终于在不用keil5自带添加库的基础上0 error的新建了一个工程.磕磕绊绊搞了快一个下午,各种小问题搞到崩溃. 首先是库文件添加路径的问题 ,只要是你工程中用到的头文 ...

  4. dedecms织梦网站图片集上传图片出现302错误图片提示怎么解决 已测

    时间:2016-01-20 来源:未知 作者:模板之家 阅读:次 小编今天上传织梦网站模板的时候,在图片集里面选择上传图片的时候,弹出302错误提示,当是真的是郁闷了,试了好几次,开始还以为是图片过大 ...

  5. VIM命令模式与输入模式切换

     vi编辑器 vi是UNIX和类UNIX环境下的可用于创建文件的屏幕编辑器.vi有两种工作模式:命令模式和文本输入模式.启动vi需要输入vi,按[Spacebar]键并输入文件名后回车. 切换模式键 ...

  6. 本地apache 可以正常访问,lnmp服务器访问404错误

    if (!-e $request_filename) { rewrite  ^(.*)$  /index.php?s=/$1  last; break; }

  7. Swift2

    Swift 里的数组和字典虽然都是结构体(struct),但在参数传递过程中处理方式却不一样,默认 Array 是引用传递,Dictionary 是值传递.而在 Java 中,由于数组和 Map 都是 ...

  8. 玩转 Redis缓存 集群高可用

    转自:https://segmentfault.com/a/1190000008432854 Redis作为主流nosql,在高并发使用场景中都会涉及到集群和高可用的问题,有几种持久化?场景下的缓存策 ...

  9. 利用mk-table-checksum监测Mysql主从数据一致性操作记录

    前面已经提到了mysql主从环境下数据一致性检查:mysql主从同步(3)-percona-toolkit工具(数据一致性监测.延迟监控)使用梳理今天这里再介绍另一种Mysql数据一致性自动检测工具: ...

  10. 爬取知名社区技术文章_pipelines_4

    获取字段的存储处理和获取普通的路径 #!/usr/bin/python3 # -*- coding: utf-8 -*- import pymysql import gevent import pym ...