博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ3052】[wc2013]糖果公园 带修改的树上莫队
阅读量:5054 次
发布时间:2019-06-12

本文共 2031 字,大约阅读时间需要 6 分钟。

【BZOJ3052】[wc2013]糖果公园

Description

Input

Output

Sample Input

Sample Input

Sample Output

84
131
27
84

HINT

题解:区间中的带修改的莫队做法:将块的大小设为n^2/3,将所有询问按照(l所在块,r所在块,time)排序,每次暴力移动三个指针即可。

树上莫队做法:将树按siz分块(如果fa的siz<B则加入到fa的块中,否则新建一块),将询问按(l所在块,r的DFS序)排序,每次暴力移动两个指针即可。

但是当我们扫过移动指针时,需要将经过的所有点的状态取反。但是这能处理边权。所以我们要将LCA单独拿出来特判。

所以带修改的树上莫队呢~将两者合起来就行了。

#include 
#include
#include
#include
#include
using namespace std;const int maxn=100010;typedef long long ll;int n,m,q,now,tot,B,sum,cnt,flag;ll ans,f[maxn],v[maxn],w[maxn];int fa[18][maxn],next[maxn<<1],to[maxn<<1],head[maxn],dep[maxn],siz[maxn],bel[maxn];int pa[maxn],pb[maxn],pc[maxn],last[maxn],s[maxn],vis[maxn],c[maxn];struct node{ int a,b,tim,org;}p[maxn];int rd(){ int ret=0,f=1; char gc=getchar(); while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();} while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar(); return ret*f;}void add(int a,int b){ to[++cnt]=b,next[cnt]=head[a],head[a]=cnt;}void dfs(int x){ if(x==1||siz[bel[fa[0][x]]]==B) bel[x]=++sum; else bel[x]=bel[fa[0][x]]; siz[bel[x]]++; for(int i=head[x];i;i=next[i]) if(!dep[to[i]]) fa[0][to[i]]=x,dep[to[i]]=dep[x]+1,dfs(to[i]);}bool cmp(node a,node b){ return (bel[a.a]==bel[b.a])?((bel[a.b]==bel[b.b])?(a.tim
dep[b]) rev(a),a=fa[0][a]; while(a!=b) rev(a),rev(b),a=fa[0][a],b=fa[0][b];}int lca(int a,int b){ if(dep[a]
=0;i--) if(dep[fa[i][a]]>=dep[b]) a=fa[i][a]; if(a==b) return a; for(int i=17;i>=0;i--) if(fa[i][a]!=fa[i][b]) a=fa[i][a],b=fa[i][b]; return fa[0][a];}int main(){ n=rd(),m=rd(),q=rd(); int i,j,a,b,lc; for(i=1;i<=m;i++) v[i]=rd(); for(i=1;i<=n;i++) w[i]=rd(); for(i=1;i
p[i].tim) { if(vis[pa[now]]) rev(pa[now]),c[pa[now]]=pc[now],rev(pa[now]); c[pa[now]]=pc[now],now--; } f[p[i].org]=ans,rev(lc); } for(i=1;i<=q-tot;i++) printf("%lld\n",f[i]); return 0;}//4 3 5 1 9 2 7 6 5 1 2 3 3 1 3 4 1 2 3 2 1 1 2 1 4 2 0 2 1 1 1 2 1 4 2

转载于:https://www.cnblogs.com/CQzhangyu/p/7299045.html

你可能感兴趣的文章
hostname
查看>>
SpringBoot使用其他的Servlet容器
查看>>
关于cookie存取中文乱码问题
查看>>
mysql 多表管理修改
查看>>
group by order by
查看>>
Oracle学习之简单查询
查看>>
log4j配置
查看>>
linux 配置SAN存储-IPSAN
查看>>
java学习笔记之String类
查看>>
pymysql操作mysql
查看>>
Linux服务器删除乱码文件/文件夹的方法
查看>>
牛腩记账本core版本源码
查看>>
Word Break II
查看>>
UVA 11082 Matrix Decompressing 矩阵解压(最大流,经典)
查看>>
jdk从1.8降到jdk1.7失败
查看>>
一些关于IO流的问题
查看>>
mongo备份操作
查看>>
8 -- 深入使用Spring -- 3...1 Resource实现类InputStreamResource、ByteArrayResource
查看>>
硬件笔记之Thinkpad T470P更换2K屏幕
查看>>
一个关于vue+mysql+express的全栈项目(六)------ 聊天模型的设计
查看>>