BZOJ 3720: Gty的妹子树 [树上size分块]
题意: 一棵树,询问子树中权值大于$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分块]的更多相关文章
- [bzoj 3720] Gty的妹子树 (树上分块)
树上分块(块状树) Description 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕-- Gty神(xian)犇(chong)从来不缺妹子-- 他来到了 ...
- bzoj 3720: Gty的妹子树 块状树
3720: Gty的妹子树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 412 Solved: 153[Submit][Status] Descr ...
- BZOJ 3731 3731: Gty的超级妹子树 [树上size分块 !]
传送门 题意:一棵树,询问子树中权值大于k的节点个数,修改点权值,插入新点,断开边:强制在线 该死该死该死!!!!!! MD我想早睡觉你知不知道 该死该死沙比提 断开边只会影响一个块,重构这个块就行了 ...
- bzoj 3720 Gty的妹子树 树分块?瞎搞
Gty的妹子树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2149 Solved: 781[Submit][Status][Discuss] D ...
- BZOJ.3720.Gty的妹子树(树分块)
题目链接 洛谷上惨遭爆零是为什么.. 另外这个树分块算法是假的. /* 插入删除只涉及一个数,故每次可以枚举一遍,而不是重构完后sort */ #include<cmath> #inclu ...
- 【BZOJ3720】Gty的妹子树 块状树
[BZOJ3720]Gty的妹子树 我曾在弦歌之中听过你,檀板声碎,半出折子戏.舞榭歌台被风吹去,岁月深处尚有余音一缕……Gty神(xian)犇(chong)从来不缺妹子……他来到了一棵妹子树下,发现 ...
- bzoj 3744: Gty的妹子序列 主席树+分块
3744: Gty的妹子序列 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 101 Solved: 34[Submit][Status] Descr ...
- BZOJ 3744: Gty的妹子序列 【分块 + 树状数组 + 主席树】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3744 3744: Gty的妹子序列 Time Limit: 20 Sec Memory ...
- BZOJ 3744 Gty的妹子序列
Description 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见-- 某天,蒟蒻Autumn发现了从 Gty的妹子树上掉落下来了许多妹子,他发现 她们排成了一个序 ...
随机推荐
- ACM_扩展欧几里德算法
<pre name="code" class="cpp">/* 扩展欧几里德算法 基本算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表 ...
- You can Solve a Geometry Problem too(线段求交)
http://acm.hdu.edu.cn/showproblem.php?pid=1086 You can Solve a Geometry Problem too Time Limit: 2000 ...
- SQL语句整理1
THEN '月卡' THEN '周卡' THEN '季度卡' THEN '年卡' ELSE '未知卡类型' END AS '卡类型' FROM SL_Register_Info Left join用法 ...
- Oracle_where子句
Oracle_where子句 --1.查询员工名为'SMITH'的信息 select * from emp where ename = 'SMITH'; --2.查询在1980/12/17入职的员 ...
- WPF 简单的循环GIF播放
//MVVM要事件绑定,记得项目引用类库“Sysrem.Windows.interactivity”,然后XAML引用 xmlns:i="http://schemas.microsoft.c ...
- dede从www跟目录迁移,网站空间
图集缩略图表名dede_uploads 字段url; 图集文章内部的图片表名dede_addonimages 字段imgurls 频道文章列表的图片 ...
- Block 的使用时机
Block 一般是用来表示.简化一小段的程式码,它特别适合用来建立一些同步执行的程式片段.封装一些小型的工作或是用来做为某一个工作完成时的回传呼叫(callback) . 在新的iOS API中blo ...
- <c:forEach 的常用整理
<c:forEach items="${images}" var="img" varStatus="status"> <d ...
- Oracle database
//下面这个通常直选择TCP就好了 此处的全局数据库根据实际情况来确定,如果是第一次,要和第一次一致.(见上面的图中的全局数据库) //这个可以使 计算机名(计算机—>属性).也可以是ip地址 ...
- MySQL zip解压版安装过程及问题
1.首先解压mysql压缩包,然后添加环境变量path(D:\mysql-5.7.11\bin) 2.修改D:\mysql-5.7.11\my-default.ini 文件的配置项 ...