文章目录

  • 解析
    • update:
  • 代码

所谓树上莫队,就是在树上的莫队

(逃)
传送门

解析

似乎就是树上的这道题
考虑如何转化为序列问题呢?
考虑dfs序
但是又一个问题。。。
似乎这条链的dfs序不连续啊
树剖一下就好啦
考虑更阳间的方法
求出这棵树的欧拉序,在这个欧拉序上询问
那么我们发现,这样的话,其实会多算的部分就都会多算2遍
比如样例:

以1为根,欧拉序为:
13442231
那么我们考虑(4-3)
对应的序列就是:

44223

不在路径上的2恰好算了2次
所以我们可以利用异或的性质
还有一些特判的问题:

  1. lca不在端点时,需要额外计算lca
  2. 左端点不时lca时,需要额外计算左端点
    画画图就很清楚了

update:

上面那个特判是洛谷野生题解的,有点过于阴间了…
ybt的实现优美的多(至少易于记忆)
设一个点进入和离开dfs的时间分别为 in(x),out(x)in(x),out(x)in(x),out(x)。
令 in(x)<in(y)in(x)<in(y)in(x)<in(y),分情况讨论:

  1. xxx 是 yyy 的祖先,那么答案就是 [in(x),in(y)][in(x),in(y)][in(x),in(y)]。
  2. xxx 不是 yyy 的祖先,那么在 [out(x),in(y)][out(x),in(y)][out(x),in(y)] 的基础上,还要加上 lca(x,y)lca(x,y)lca(x,y)。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=3e5+100;
const int M=1050;
const int mod=998244353;
const double eps=1e-6;
ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f;
}
int n,m;
struct node{int to,nxt;
}p[N<<1];
int fi[N],cnt;
void addline(int x,int y){p[++cnt]=(node){y,fi[x]};fi[x]=cnt;
}
int pl[N][22],dep[N],siz[N];
ll v[N],w[N];
int pos[N],dfn[N],ed[N],Tim;
void dfs(int x,int f){pl[x][0]=f;pos[x]=++Tim;dfn[Tim]=x;siz[x]=1;for(int k=1;k<=18;k++) pl[x][k]=pl[pl[x][k-1]][k-1];for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(to==f) continue;dep[to]=dep[x]+1;dfs(to,x);siz[x]+=siz[to];}dfn[++Tim]=x;ed[x]=Tim;
}
bool vis[N];
int a[N],tim,tot,from[N],to[N],id[N],bel[N];
int Lca(int x,int y){if(dep[x]<dep[y]) swap(x,y);for(int k=18;k>=0;k--){if(!pl[x][k]||dep[pl[x][k]]<dep[y]) continue;x=pl[x][k];}
//  printf("LCA:x=%d y=%d ",x,y);if(x==y){//      printf("ares=%d\n",x);return x;}
//  printf("  mid:x=%d y=%d ",x,y);for(int k=18;k>=0;k--){if(pl[x][k]==pl[y][k]) continue;x=pl[x][k];y=pl[y][k];}
//  printf("x=%d res=%d\n",x,pl[x][0]);return pl[x][0];
}
struct query{int l,r,t,id,lca;bool operator < (const query o)const{if(bel[l]!=bel[o.l]) return bel[l]<bel[o.l];else if(bel[r]!=bel[o.r]) return bel[r]<bel[o.r];else return t<o.t;}
}ask[N];
int l,r,t,bac[N];
ll now;
ll ans[N];
inline void work(int x){x=dfn[x];(vis[x]^=1)?now+=v[a[x]]*w[++bac[a[x]]]:now-=v[a[x]]*w[bac[a[x]]--];
}
int q;
int ww;
int main(){memset(fi,-1,sizeof(fi));cnt=-1;n=read();m=read();q=read();for(int i=1;i<=m;i++) v[i]=read();for(int i=1;i<=n;i++) w[i]=read();for(int i=1;i<n;i++){int x=read(),y=read();addline(x,y);addline(y,x);}for(int i=1;i<=n;i++) a[i]=read();dep[1]=1;dfs(1,0);
//  for(int i=1;i<=Tim;i++) printf("%d ",dfn[i]);
//  printf("\n");ww=floor(pow(Tim,2.0/3));for(int i=1;i<=Tim;i++){bel[i]=(i-1)/ww+1;}for(int i=1;i<=q;i++){int op=read(),x=read(),y=read();if(op==0){++tim;int o=x;from[tim]=a[o];id[tim]=o;a[o]=y;to[tim]=a[o];}else{if(pos[x]>pos[y]) swap(x,y);ask[++tot]=(query){pos[x],pos[y],tim,tot,pos[Lca(x,y)]};}
//      printf("i=%d op=%d x=%d y=%d\n",i,op,x,y);}sort(ask+1,ask+1+tot);l=1;t=tim;for(int i=1;i<=tot;i++){int nl=ask[i].l,nr=ask[i].r,nt=ask[i].t,lca=ask[i].lca;while(l<nl) work(l++);while(l>nl) work(--l);while(r<nr) work(++r);while(r>nr) work(r--);while(t<nt){t++;int o=id[t],f=0;if((pos[o]<l&&l<=ed[o]&&ed[o]<=r)) f=1;else if(l<=pos[o]&&pos[o]<=r&&r<ed[o]) f=2;if(f==1) work(ed[o]);else if(f==2) work(pos[o]);a[o]=to[t];if(f==1) work(ed[o]);else if(f==2) work(pos[o]);}while(t>nt){int o=id[t],f=0;if((pos[o]<l&&l<=ed[o]&&ed[o]<=r)) f=1;else if(l<=pos[o]&&pos[o]<=r&&r<ed[o]) f=2;if(f==1) work(ed[o]);else if(f==2) work(pos[o]);a[o]=from[t];if(f==1) work(ed[o]);else if(f==2) work(pos[o]);t--;}if(nl!=lca){work(nl);if(nr!=lca) work(lca);}
//      printf("id=%d (%d %d %d %d) res=%lld\n",ask[i].id,nl,nr,nt,lca,now);ans[ask[i].id]=now;if(nl!=lca){work(nl);if(nr!=lca) work(lca);}}for(int i=1;i<=tot;i++) printf("%lld\n",ans[i]);return 0;
}
/**/

YBTOJ洛谷P4074:糖果公园(树上莫队)相关推荐

  1. BZOJ.3052.[WC2013]糖果公园(树上莫队 带修改莫队)

    题目链接 BZOJ 当然哪都能交(都比在BZOJ交好),比如UOJ #58 //67376kb 27280ms //树上莫队+带修改莫队 模板题 #include <cmath> #inc ...

  2. 【WC2013】糖果公园 树上莫队

    树上莫队,将树分块,以x,y为一二关键字,以时间为第三关键字.暴力修改. #include <iostream> #include <cstdio> #include < ...

  3. 洛谷P3245 [HNOI2016]大数 【莫队】

    题目 题解 除了\(5\)和\(2\) 后缀数字对\(P\)取模意义下,两个位置相减如果为\(0\),那么对应子串即为\(P\)的倍数 只用对区间种相同数个数\(x\)贡献\({x \choose 2 ...

  4. 洛谷P5071 [YNOI2015]此时此刻的光辉 莫队+玄学优化+卡常QWQ

    题目链接:传送门 在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去.逐渐消逝的未来.我回来了,纵使日薄西山,即便看不到未来,此时此 ...

  5. LG P4074 [WC2013] 糖果公园(带修莫队,树上莫队)

    LG P4074 [WC2013] 糖果公园 Solution 树上带修莫队,主要还是复习带修莫队和树上莫队. 带修莫队: 带修莫队要先对lll分块的序号作为第一关键字,对rrr分块的序号作为第二关键 ...

  6. uoj#58./bzoj3052 【WC2013】糖果公园 //树上带修改莫队

    uoj#58. [WC2013]糖果公园 题意 有一棵N(<=1e5)个点的树,每个点对应M(<=1e5)种糖果中的一种. 一条路径的权值定义为∑i(Vi∗∑tij=1Wj)\sum_i ...

  7. 莫队算法(普通莫队、带修莫队、树上莫队、不删除莫队)学习笔记【理解+套路/核心代码+例题及题解】

    一.理解 我的理解就是巧妙的暴力,利用双指针以及分块思想,巧妙的移动双指针,时间复杂度可以达到O(NlogN). 强推博客:写的又好又全.链接 二.套路 1.普通莫队 [1]核心代码 bool cmp ...

  8. 【SPOJ】Count On A Tree II(树上莫队)

    [SPOJ]Count On A Tree II(树上莫队) 题面 洛谷 Vjudge 洛谷上有翻译啦 题解 如果不在树上就是一个很裸很裸的莫队 现在在树上,就是一个很裸很裸的树上莫队啦. #incl ...

  9. [学习笔记]树上莫队

    其实树上莫队是一个欧拉序而已嘛,像普通的莫队,特判一下出现过两次的值就行了 设 \(st_i\) 为 \(i\) 进栈的时间,\(ed_i\) 为 \(i\) 出栈的时间,\(dfn_x<dfn ...

最新文章

  1. linux firefox xvfb,自动化测试之linux+xvfb+selenium+firefox+python测试环境搭建与测试
  2. vue打印props的值_vue中props传值方法
  3. Java中的5大队列,你知道几个?
  4. 01Vue.js快速入门(一)Vue概念及Helloworld
  5. HenCoder Android UI 部分 2-3 定制 Layout 的内部布局
  6. bestcoder#51
  7. JVM史上最最最完整深入解析,不看后悔一百次!
  8. Pyinstall打包多个python脚本,包含DLL文件
  9. java面向对象各章节教程_第二部分java面向对象编程第08章集合框架List1章节.ppt...
  10. .NET正则表达式使用高级技巧之替换类
  11. dubbo-快速入门-分布式RPC框架Apache Dubbo
  12. SharePoint REST API - 一个请求批量操作
  13. 函数重载函数的引用算重载吗_了解C ++中的函数重载
  14. modbus 调试工具之modbus slave与modbus poll
  15. 递归算法经典实例python-python实现十大经典算法
  16. Kotlin Flow详解
  17. App Store提交上线、市场推广专题
  18. 针孔相机畸变成像详解
  19. 牛牛战队的比赛地 (三分)
  20. 如何将图片识别为可编辑的Word文件

热门文章

  1. 日本老爷爷坚持17年用Excel作画,我可能用了假的Excel···
  2. 中国癌症大数据出来了!每年126万例癌症死亡本可避免
  3. linux+4.4+android,Ubuntu 14.04 x64配置Android 4.4 kitkat编译环境的方法
  4. tinyid 教程_tinyid
  5. python ssh模块_python paramiko模块(ssh) 使用
  6. jwt如何防止token被窃取_在吗?认识一下JWT(JSON Web Token)?
  7. winform 统计大量数据重复的元素个数_面试系列:十个海量数据处理方法大总结...
  8. java的正则表达式 CPU_小心踩雷!一个小小的正则表达式竟把CPU拖垮......
  9. python 创建目录_第二天:Python中目录及文件操作
  10. 360 屏蔽ajax,怎么在easy ui做全局Ajax拦截啊?