BZOJ 3731 3731: Gty的超级妹子树 [树上size分块 !]
题意:一棵树,询问子树中权值大于k的节点个数,修改点权值,插入新点,断开边;强制在线
该死该死该死!!!!!!
MD我想早睡觉你知不知道
该死该死沙比提
断开边只会影响一个块,重构这个块就行了
如果断开的点$u$是这个块$p$的根,只修改原图和块图就好了
否则,把$u$子树在块中的部分从$p$里删除,放到一个新块里。并且,这些点连到的其他块的点,也要在块图上与$p$断开与新块相连
所以我们维护一个删除边的$mark$标记
WA:一开始原图加的是双向边,通过判断$fa$防止出错..后来$fa$会变化,然后判断$fa$就失灵了应该会一直$dfs$停不下来
所以一开始$dfs$就给双向边不用的那一条打上$mark$标记就好了
ps:
1.读入挂我直接复制了PoPoQQQ大爷的因为我有一次以为是读入导致WA
2.vector好快用这道题代码交上一题比我上一题跑的都快
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
typedef long long ll;
const int N=2e5+;
inline int read1(){
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;
}
namespace IOStream{
const int L=<<;
char buffer[L];
char *S,*T;
char Get_Char()
{
if(S==T)
{
T=(S=buffer)+fread(buffer,,L,stdin);
if(S==T)
return EOF;
}
return *S++;
}
int Get_Int()
{
int re=;
char c;
do c=Get_Char(); while(c<''||c>'');
while(c>=''&&c<='')
re=(re<<)+(re<<)+(c-''),c=Get_Char();
return re;
}
}
#define read IOStream::Get_Int int n,Q,a[N],op,u,x; struct meow{
vector<int> a;
inline void set() {sort(a.begin(), a.end());}
inline int count(int v) {return a.size() - (upper_bound(a.begin(), a.end(), v) - a.begin());}
inline void push(int v) {a.push_back(v);}
inline void insert(int v) {a.insert(lower_bound(a.begin(), a.end(), v), v);}
inline void erase(int v) {a.erase(lower_bound(a.begin(), a.end(), v));}
inline void replace(int x,int v) {if(x==v) return; erase(x); insert(v);}
inline int size() {return a.size();}
}b[N];
int m, pos[N], block; struct Graph4Block{
struct edge{int v,ne;} e[N<<];
int cnt, h[N], ine[N], mark[N<<];
inline void ins(int u,int v) {
e[++cnt]=(edge){v,h[u]}; h[u]=cnt;
ine[v]=cnt;
}
inline void dele(int u) {mark[ine[u]]=;}
int dfs(int u,int k) {
int ans= b[u].count(k);
for(int i=h[u];i;i=e[i].ne) if(!mark[i]) ans+=dfs(e[i].v, k);
return ans;
}
}G; 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;
}
int fa[N], mark[N<<], ine[N];
inline void ins1(int u,int v) {
e[++cnt]=(edge){v,h[u]}; h[u]=cnt;
ine[v]=cnt; fa[v]=u;
}
inline void dele(int u) {fa[u]=; mark[ine[u]]=;} void dfs(int u) {
int p=pos[u];
b[p].push(a[u]);
for(int i=h[u];i;i=e[i].ne) if(!mark[i]) {
if(e[i].v!=fa[u]) {
fa[e[i].v]=u; ine[e[i].v]=i;
if(b[p].size() < block) pos[e[i].v]=p;
else pos[e[i].v]=++m, G.ins(p, m);
dfs(e[i].v);
} else mark[i]=;
}
} struct Block{
int dfs(int u,int k) {
int ans= a[u]>k;
for(int i=h[u];i;i=e[i].ne) if(!mark[i])
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; ins1(u, n);
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);
} void dfsSpl(int u,int p) {
b[p].erase(a[u]); pos[u]=m; b[m].push(a[u]);
for(int i=h[u];i;i=e[i].ne) if(!mark[i])
if(e[i].v!=fa[u]) {
if(pos[e[i].v] == p) dfsSpl(e[i].v, p);
else G.dele(pos[e[i].v]), G.ins(m, pos[e[i].v]);
}
}
void Split(int u){
int p=pos[u];
if(pos[fa[u]] != p) G.dele(p);
else m++, dfsSpl(u, p), b[m].set();
dele(u);
}
}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;
if(op==) B.Split(u);
else{
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 3731 3731: Gty的超级妹子树 [树上size分块 !]的更多相关文章
- BZOJ 3720: Gty的妹子树 [树上size分块]
传送门 题意: 一棵树,询问子树中权值大于$k$的节点个数,修改点权值,插入新点:强制在线 一开始以为询问多少种不同的权值,那道CF的强制在线带修改版,直接吓哭 然后发现看错了这不一道树上分块水题.. ...
- [BZOJ 3731] Gty的超级妹子树 (树分块)
[BZOJ 3731] Gty的超级妹子树 (树分块) 题面 给出一棵树(或森林),每个点都有一个值.现在有四种操作 1.查询x子树里>y的值有多少个 2.把点x的值改成y 3.添加一个新节点, ...
- bzoj Gty的超级妹子树 块状树
Gty的超级妹子树 Time Limit: 7 Sec Memory Limit: 32 MBSubmit: 500 Solved: 122[Submit][Status][Discuss] De ...
- bzoj3731: Gty的超级妹子树(树分块)
传送门 分块树,代码参考了Manchery的 具体细节还是看代码好了 这题卡常……注意常数写好点…… //minamoto #include<iostream> #include<c ...
- [bzoj 3720] Gty的妹子树 (树上分块)
树上分块(块状树) Description 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕-- Gty神(xian)犇(chong)从来不缺妹子-- 他来到了 ...
- BZOJ 3731: Gty的超级妹子树
3731: Gty的超级妹子树 Time Limit: 7 Sec Memory Limit: 32 MBSubmit: 346 Solved: 96[Submit][Status][Discus ...
- BZOJ 3787: Gty的文艺妹子序列
3787: Gty的文艺妹子序列 Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 186 Solved: 58[Submit][Status][Dis ...
- 【BZOJ3720】Gty的妹子树 块状树
[BZOJ3720]Gty的妹子树 我曾在弦歌之中听过你,檀板声碎,半出折子戏.舞榭歌台被风吹去,岁月深处尚有余音一缕……Gty神(xian)犇(chong)从来不缺妹子……他来到了一棵妹子树下,发现 ...
- BZOJ.3653.谈笑风生(长链剖分/线段树合并/树状数组)
BZOJ 洛谷 \(Description\) 给定一棵树,每次询问给定\(p,k\),求满足\(p,a\)都是\(b\)的祖先,且\(p,a\)距离不超过\(k\)的三元组\(p,a,b\)个数. ...
随机推荐
- Centos7环境搭建lnmp环境
[原创]编译安装lnmp环境 准备软件:nginx1.10.3+php-5.5.12+mariadb10.0.8(数据库在此使用的yum安装) 如果需要编译安装的可以给我留言,我后续再发布出来! 依赖 ...
- mysql中配置ssl_key、ssl-cert、ssl-ca的路径及建立ssl连接
1.创建 CA 私钥和 CA 证书 (1)下载并安装openssl,将bin目录配置到环境变量: (2)设置openssl.cfg路径(若不设置会报错,找不到openssl配置文件) \bin\ope ...
- sublimeserver启动本地服务器(sublime text)
今天又get到了一个新知识点,就是在sublime text上也可以模拟一个本地服务器的环境,前提是要先安装sublimeserver这个插件.这个插件的安装办法有两种. 1.我们可以直接在subli ...
- Redis能干啥?细看11种Web应用场景
下面列出11种Web应用场景,在这些场景下可以充分的利用Redis的特性,大大提高效率. 1.在主页中显示最新的项目列表. Redis使用的是常驻内存的缓存,速度非常快.LPUSH用来插入一个内容ID ...
- 关于HTTP请求出现 405状态码 not allowed的解决办法
最近学爬虫.发现httppost请求目标网站会出现405 状态码,原因为 Apache.IIS.Nginx等绝大多数web服务器,都不允许静态文件响应POST请求 所以将post请求改为get请求即可
- vue中使用Ueditor编辑器
一. 下载包: 从Ueditor的官网下载1.4.3.3jsp版本的Ueditor编辑器,官网地址为: http://ueditor.baidu.com/website/ 下载解压后会得到如果下文 ...
- html dl dt dd标签元素语法结构与使用
dl dt dd认识及dl dt dd使用方法 标签用于定义列表类型标签. dl dt dd目录 dl dt dd介绍 结构语法 dl dt dd案例 dl dt dd总结 一.dl dt dd认识 ...
- PHPMailer发送邮件失败:SMTP connect failed
标签: PHPMailersmtp邮件服务器邮件发送失败 2015-05-22 19:29 1755人阅读 评论(0) 收藏 举报 分类: Apache php+mysql(2) 版权声明:本文为博主 ...
- 你知道织梦后台安装插件时为什么会出现这个Character postion 686, 'item'&n
https://zhidao.baidu.com/question/589525064.html?qbl=relate_question_3&word=Tag Character postio ...
- 《并行程序设计导论》——MPI(Microsoft MPI)(6):并行排序算法
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...