块状树裸题

块状树:

首先对树进行分块,分出的每一块都是一个连通块

通常的分块的方式如下:

1、父亲所在块不满,分到父亲所在块中

2、父亲所在块满,自己单独开一个块

(貌似有更为优越的分块方式?

注意这是不严格的分块,即每个块的大小不一定都是设定的阈值blo

对于这道题,首先修改和添加直接块内暴力就可以了

对于询问,首先我们对每个块排序,块不完全在询问子树内的单点询问,块完全在询问子树内的块内二分

分块真是骗分利器,但是块状树最大的缺点是容易被菊花树卡住

(貌似修改和添加可以去掉一个log,但是我太弱了,并不想写)

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std; const int oo=0x7fffffff;
const int maxn=;
int n,m,u,v,f,ans,tot,blo;
int pos[maxn],fa[maxn],w[maxn];
int a[][],cnt[];
struct Graph{
int h[maxn],next[maxn],to[maxn],sum;
void add(int x,int y){++sum;next[sum]=h[x];h[x]=sum;to[sum]=y;}
}G,T;
void read(int &num){
num=;char ch=getchar();
while(ch<'!')ch=getchar();
while(ch>=''&&ch<='')num=num*+ch-'',ch=getchar();
}
bool cmp(const int &i,const int &j){return i>j;}
void check_block(int u){
int k=pos[fa[u]];
if(cnt[k]==blo){
pos[u]=++tot;a[tot][]=oo;
a[tot][++cnt[tot]]=w[u];
T.add(k,tot);
}else a[k][++cnt[k]]=w[u],pos[u]=k;
for(int i=G.h[u];i;i=G.next[i]){
if(G.to[i]==fa[u])continue;
fa[G.to[i]]=u;
check_block(G.to[i]);
}return;
}
int Get_pos(int u){
int L=,R=cnt[u];
while(L<R){
int mid=L+((R-L+)>>);
if(a[u][mid]>v)L=mid;
else R=mid-;
}return L;
}
void Get_block(int u){
ans+=Get_pos(u);
for(int i=T.h[u];i;i=T.next[i])Get_block(T.to[i]);
}
void Get_ask(int u){
if(w[u]>v)ans++;
for(int i=G.h[u];i;i=G.next[i]){
if(G.to[i]==fa[u])continue;
if(pos[G.to[i]]==pos[u])Get_ask(G.to[i]);
else Get_block(pos[G.to[i]]);
}return;
}
void Get_insert(int u,int k){
pos[u]=k;w[u]=v;a[k][++cnt[k]]=v;
sort(a[k]+,a[k]+cnt[k]+,cmp);
}
void Get_modify(int u){
int k=pos[u];
for(int i=;i<=cnt[k];++i){
if(a[k][i]==w[u]){a[k][i]=v;break;}
}
w[u]=v;
sort(a[k]+,a[k]+cnt[k]+,cmp);
} int main(){
read(n);
for(int i=;i<n;++i){
read(u);read(v);
G.add(u,v);G.add(v,u);
}
for(int i=;i<=n;++i)read(w[i]);
blo=(int)(sqrt(n));
fa[]=;pos[]=;tot=;
check_block();
for(int i=;i<=tot;++i)sort(a[i]+,a[i]+cnt[i]+,cmp);
//for(int i=1;i<=n;++i)cout<<pos[i]<<endl;
//cout<<endl;
read(m);
while(m--){
read(f);read(u);read(v);
u^=ans;v^=ans;
if(f==){
ans=;
Get_ask(u);
printf("%d\n",ans);
}else if(f==){
n++;fa[n]=u;G.add(u,n);
if(cnt[pos[u]]==blo){
pos[n]=++tot;w[n]=v;a[tot][]=oo;
a[tot][++cnt[tot]]=w[n];
T.add(pos[u],tot);
}else Get_insert(n,pos[u]);
}else Get_modify(u);
}return ;
}

gty的妹子树

BZOJ 3720 gty的妹子树的更多相关文章

  1. 3720: Gty的妹子树

    3720: Gty的妹子树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1440  Solved: 482[Submit][Status][Disc ...

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

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

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

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

  4. Gty的妹子树(bzoj 3720)

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

  5. BZOJ3720 Gty的妹子树

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

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

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

  7. BZOJ 3720: Gty的妹子树 [树上size分块]

    传送门 题意: 一棵树,询问子树中权值大于$k$的节点个数,修改点权值,插入新点:强制在线 一开始以为询问多少种不同的权值,那道CF的强制在线带修改版,直接吓哭 然后发现看错了这不一道树上分块水题.. ...

  8. 【块状树】bzoj3720 Gty的妹子树

    块状树.教程见:http://z55250825.blog.163.com/blog/static/1502308092014163413858/将树按一定大小分块,分成许多子树,在每个子树的根节点记 ...

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

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

随机推荐

  1. 基础学习总结(八)--Intent中显示意图和隐式意图的用法

    Intent(意图)主要是解决Android应用的各项组件之间的通讯.Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组 ...

  2. [大牛翻译系列]Hadoop(20)附录A.10 压缩格式LZOP编译安装配置

    附录A.10 LZOP LZOP是一种压缩解码器,在MapReduce中可以支持可分块的压缩.第5章中有一节介绍了如何应用LZOP.在这一节中,将介绍如何编译LZOP,在集群做相应配置. A.10.1 ...

  3. jquery的$(document).ready()和onload的加载顺序

    最近在改一个嵌入在frame中的页面的时候,使用了jquery做效果,而页面本身也绑定了onload事件.改完后,Firefox下测试正常流畅,IE下就要等个十几秒jquery的效果才出现,黄花菜都凉 ...

  4. (转)可收缩、扩展的TextView

    在一些应用中,比如腾讯的应用市场APP应用宝,关于某款应用的介绍文字,如果介绍文字过长,那么不是全部展现出来,而是显示三四行的开始部分(摘要),预知全部的内容,用户点击展开按钮即可查阅全部内容.这样的 ...

  5. pandas库学习笔记(二)DataFrame入门学习

    Pandas基本介绍——DataFrame入门学习 前篇文章中,小生初步介绍pandas库中的Series结构的创建与运算,今天小生继续“死磕自己”为大家介绍pandas库的另一种最为常见的数据结构D ...

  6. JavaScript中使用console调试程序的坑

    上DEMO a = {key1: [1, 2], 'key2': {'key4': '11'}, 'key3': [1, 2]} console.info(1,a) a.key2.key4 = '22 ...

  7. .NET Framework 3.5 安装错误:0x800F0906、0x800F081F、0x800F0907

    使用Add-WindowsFeature 照成的问题 I get the failure below..  If I pick the Server 2012 R2 image from 8/15/2 ...

  8. 万网域名解析到IP地址

    进入https://home.console.aliyun.com/#/的阿里云控制台 再自己购买的域名列表里进行操作 添加一个A解析

  9. OpenNMS界面图 .

    http://demo.opennms.org/opennms/login.jsp;jsessionid=zibykal1cw4b1cir8wgn0a8b0 这个是opennms的demo websi ...

  10. CentOS thrift python demo

    编辑接口文件 hellowworld.thrift service HelloWorld { string ping(), string say(1:string msg) } 编辑 server.p ...