BZOJ 3720 树分块
借鉴了别人的代码……
//By SiriusRen
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 66666
struct Blocks{
int a[210],size;
void Insert(int x){
++size;int i;
for(i=size;i>1&&a[i-1]>x;i--)a[i]=a[i-1];
a[i]=x;
}
void Modify(int x,int y){
int temp=lower_bound(a+1,a+1+size,x)-a;
for(;temp<size&&a[temp+1]<y;temp++)a[temp]=a[temp+1];
for(;temp>1&&a[temp-1]>y;temp--)a[temp]=a[temp-1];
a[temp]=y;
}
int Query(int x){
return size-(upper_bound(a+1,a+1+size,x)-a)+1;
}
}blocks[10500];
int n,m,op,xx,yy,block,cnt,ans,a[N],fa[N],belong[N];
int first[N],bfirst[N],next[N*2],v[N*2],tot;
void add(int Head[],int x,int y){v[tot]=y,next[tot]=Head[x],Head[x]=tot++;}
void DFS(int x){
if(blocks[belong[fa[x]]].size==block)
blocks[belong[x]=++cnt].Insert(a[x]),add(bfirst,belong[fa[x]],cnt);
else blocks[belong[x]=belong[fa[x]]].Insert(a[x]);
for(int i=first[x];~i;i=next[i])
if(v[i]!=fa[x])fa[v[i]]=x,DFS(v[i]);
}
void bdfs(int x,int y){
ans+=blocks[x].Query(y);
for(int i=bfirst[x];~i;i=next[i])bdfs(v[i],y);
}
void dfs(int x,int y){
if(a[x]>y)ans++;
for(int i=first[x];~i;i=next[i])
if(v[i]!=fa[x]){
if(belong[v[i]]==belong[x])dfs(v[i],y);
else bdfs(belong[v[i]],y);
}
}
int main(){
memset(first,-1,sizeof(first)),memset(bfirst,-1,sizeof(bfirst));
scanf("%d",&n);
for(int i=1;i<n;i++)
scanf("%d%d",&xx,&yy),add(first,xx,yy),add(first,yy,xx);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
block=int(sqrt(n)+0.5),DFS(1);
scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&op,&xx,&yy),xx^=ans,yy^=ans;
if(!op){ans=0;dfs(xx,yy);printf("%d\n",ans);}
else if(op==1)blocks[belong[xx]].Modify(a[xx],yy),a[xx]=yy;
else{
a[++n]=yy,add(first,xx,n),fa[n]=xx;
if(blocks[belong[xx]].size==block)
blocks[belong[n]=++cnt].Insert(a[n]),add(bfirst,belong[xx],cnt);
else blocks[belong[n]=belong[xx]].Insert(a[n]);
}
}
}
BZOJ 3720 树分块的更多相关文章
- bzoj 1086 树分块
将树分成一些块,做法见vfleaking博客. /************************************************************** Problem: 108 ...
- BZOJ.3720.Gty的妹子树(树分块)
题目链接 洛谷上惨遭爆零是为什么.. 另外这个树分块算法是假的. /* 插入删除只涉及一个数,故每次可以枚举一遍,而不是重构完后sort */ #include<cmath> #inclu ...
- [BZOJ 3720][JZYZOJ 2016]gty的妹子树 强制在线 树分块/树套树
jzyzoj的p2016 先码着,强制在线的树分块或者树套树?关键是我树分块还在入门阶段树套树完全不会啊摔 http://blog.csdn.net/jiangyuze831/article/de ...
- bzoj 3720 Gty的妹子树 树分块?瞎搞
Gty的妹子树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2149 Solved: 781[Submit][Status][Discuss] D ...
- [BZOJ 1086] [SCOI2005] 王室联邦 【树分块】
题目链接:BZOJ - 1086 题目分析 这道题要求给树分块,使得每一块的大小在 [B, 3B] 之间,并且可以通过一个块外的节点(块根)使得整个块联通. 那么我们使用一种 DFS,维护一个栈,DF ...
- 【BZOJ】4129: Haruna’s Breakfast 树分块+带修改莫队算法
[题意]给定n个节点的树,每个节点有一个数字ai,m次操作:修改一个节点的数字,或询问一条树链的数字集合的mex值.n,m<=5*10^4,0<=ai<=10^9. [算法]树分块+ ...
- [BZOJ 3731] Gty的超级妹子树 (树分块)
[BZOJ 3731] Gty的超级妹子树 (树分块) 题面 给出一棵树(或森林),每个点都有一个值.现在有四种操作 1.查询x子树里>y的值有多少个 2.把点x的值改成y 3.添加一个新节点, ...
- 【BZOJ 3735】苹果树 树上莫队(树分块+离线莫队+鬼畜的压行)
2016-05-09 UPD:学习了新的DFS序列分块,然后发现这个东西是战术核导弹?反正比下面的树分块不知道要快到哪里去了 #include<cmath> #include<cst ...
- 【BZOJ】3052: [wc2013]糖果公园 树分块+带修改莫队算法
[题目]#58. [WC2013]糖果公园 [题意]给定n个点的树,m种糖果,每个点有糖果ci.给定n个数wi和m个数vi,第i颗糖果第j次品尝的价值是v(i)*w(j).q次询问一条链上每个点价值的 ...
随机推荐
- javascript中变量命名冲突的问题
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- mybatis学习笔记之基础复习(3)
mybatis学习笔记之基础复习(3) mybatis是什么? mybatis是一个持久层框架,mybatis是一个不完全的ORM框架.sql语句需要程序员自己编写, 但是mybatis也是有映射(输 ...
- Android java处理保留小数点后几位
方式一: 四舍五入 double f = 111231.5585; BigDecimal b = new BigDecimal(f); double f1 = ...
- AngularJS指令进阶 -- ngModelController详解
大家都知道AngularJS中的指令是其尤为复杂的一个部分,但是这也是其比较好玩的地方.这篇文章我们就来说一说如何在我们自定义的指令中,利用ngModel的controller来做双向数据绑定,本文对 ...
- 互联网汽车迎新成员 Alibaba YunOS Auto冠名2016世俱杯
11月18日广州车展现场,阿里巴巴集团再次携手上汽集团连发三款搭载YunOS系统的互联网汽车,包括MG ZS.荣威eRX5和荣威i6.同时阿里巴巴集团YunOS总裁张春晖正式宣布互联网汽车业务全新升级 ...
- 深入jar包:从jar包中读取资源文件
我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的处理当然不会有问题.但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了.看看 ...
- sql_2
编辑表结构ALTER TABLE `sp_account_trans` MODIFY COLUMN `TRANS_DESC` varchar(81) CHARACTER SET utf8 CO ...
- img标签过滤加fs模块实现图片文件缓存
方法一:function iCache(selector) { selector.each(function(data) { //msg(data); ! function(data) { var u ...
- java中后端拼接字符串返回前台页面换行显示
后端拼接时用:"\n"分割,比如: String str = "白日依山尽,\n" + "黄河入海流:"; 返回前台页面时,放入 <p ...
- 两个sed小技巧:sed "/变量/变量/"
两个sed小技巧 在写shell时使用sed处理一些输出,遇到两个问题,在网上找到了相应的解决办法,在此处备份一下. [ sed处理空字符 ] 空字符,它的ASCII码值为0.在sed中如何标识空字符 ...