传送门

题意: 一棵树,询问子树中权值大于$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. MyBatis工作原理

    Mybatis工作原理: 我们的应用程序通过mybatis提供的api,增删改查方法来访问数据库,api底层调用了jdbc ,只不过mybatis对jdbc的封装是不完全封装,里面的sql语句需要我们 ...

  2. 四 : springMVC各种跳页面传值

    第一种方式 : 返回值为String类型的跳转页面,犯法参数里面需要写Model modelimport org.springframework.ui.Model;包下的.返回String1):字符串 ...

  3. timeit模块

    算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务.一般地,当算法在处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址 ...

  4. FTP下载导致Zip解压失败的原因

    情形:网关通过FTP下载快钱对账文件时通过Apache下commons-net的commons-net-3.5.jar进行封装,对账文件中有中文和英文的文字,大部分情况下能够下载成功,而且也能解压成功 ...

  5. Navicat连接阿里云Mysql遇到的的坑

    连上去那一刻,心态真是起飞了

  6. Linq 实例

    1.分页 ).Take(); 2.分组 1)一般分组 //根据顾客的国家分组,查询顾客数大于5的国家名和顾客数var 一般分组 = from c in ctx.Customers group c by ...

  7. windows下github 出现Permission denied (publickey).解决方法

    今天在学习github的时候遇到了一些问题,然后爬了一会,找到了解决方法记录下来,以防忘记,当然能帮助别人最好啦! github教科书传送门:http://www.liaoxuefeng.com/wi ...

  8. JavaSE笔记-异常

    Java 异常 Throwable类的体系结构(一些常用的) 异常分类 checked,unchecked 区分:RuntimeException及其子类,Error类及其子类,是unchecked ...

  9. mysql批量数据脚本

    mysql批量数据脚本 1 建表 create table dept( id int unsigned primary key auto_increment, deptno mediumint uns ...

  10. hive下UDF函数的使用

    1.编写函数 [java] view plaincopyprint?package com.example.hive.udf;    import org.apache.hadoop.hive.ql. ...