YBTOJ洛谷P4074:糖果公园(树上莫队)

文章目录

  • 解析
    • 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. xxxyyy 的祖先,那么答案就是 [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;
}
/**/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【用梨泰院class中的财阀世家带你洞悉替罪羊树】Scapegoat Tree原理,模板,例题

我想写在前面&#xff0c;本文财阀世家全是虚构&#xff0c;没有诋毁之意&#xff0c;如有雷同&#xff0c;纯属巧合 红色预警&#xff01;&#xff01;&#xff01;红色预警 文章目录Scapegoat Tree概念模板变量声明Bad函数判断是否需要重构理解模板rebuild重构理解模板inser…

领域驱动设计,让程序员心中有码(五)

1 从搬砖谈领域对象有一个古老的故事&#xff0c;大概是这样的。作者问三个建筑工地上的工人他们在干什么&#xff1f;有一个没精打采的说&#xff0c;我在挖洞&#xff01;而另一一个人却说&#xff0c;我在盖一座房子。还有一个人说&#xff0c;我在建立一座巨大的城市。…

.NET Core实战项目之CMS 第十四章 开发篇-防止跨站请求伪造(XSRF/CSRF)攻击处理...

通过 ASP.NET Core&#xff0c;开发者可轻松配置和管理其应用的安全性。 ASP.NET Core 中包含管理身份验证、授权、数据保护、SSL 强制、应用机密、请求防伪保护及 CORS 管理等等安全方面的处理。 通过这些安全功能&#xff0c;可以生成安全可靠的 ASP.NET Core 应用。而我们这…

模板:左偏树

文章目录解析可以解决的问题定义&#xff1a;左偏树的基本性质基本结论操作合并访问与删除堆顶元素插入元素批量插入删除已知元素所谓左偏树&#xff0c;就是往左偏的树 下面介绍一下它的一个兄弟&#xff1a; 《右偏树》 &#xff08;逃&#xff09; 解析 所谓左偏树&#…

迎开学水题狂欢赛(舞踏会[dp+三叉树],HH去散步[矩阵快速幂],排序[模拟],铁路旅行[线段树])

快速简单记录老师口胡&#xff08;可能就我自己看得懂了吧…&#xff09; 文章目录T1&#xff1a;舞踏会titlesolutioncodeT2&#xff1a;HH去散步titlesolutioncodeT3&#xff1a;排序titlesolutioncodeT4&#xff1a;铁路旅行titlesolutioncodeT1&#xff1a;舞踏会 title …

CSP2021提高组复赛解析

前言 终于出成绩了我可以写博客辣&#xff0c;官方数据还没出就先放洛谷的题目链接了。 正题 T1-廊桥分配 https://www.luogu.com.cn/problem/P7913 题目大意 有m1m_1m1​种一类飞机&#xff0c;m2m_2m2​种二类飞机&#xff0c;每个飞机有一个占用时间的区间。要给两类飞机…

一起开心集训队第一周训练赛2021/3/14

文章目录比赛链接A CodeForces 1481D AB Graph题意&#xff1a;题解&#xff1a;代码&#xff1a;B CodeForces 1481E Sorting Books题意&#xff1a;题解&#xff1a;代码&#xff1a;C CodeForces 1478D Nezzar and Board题意&#xff1a;题解&#xff1a;代码&#xff1a;D …

使用Azure DevOps持续集成GitHub项目

点击蓝字关注我微软的Azure DevOps是一款软件开发管理工具&#xff0c;整合了需求、代码、编译、测试、发布等所有功能于一身。今天我们就来看看如何用Azure DevOps对自己GitHub上的项目做持续集成&#xff0c;并能在GitHub显示最新编译状态。其实在不久之前&#xff0c;Azure …

[BZOJ 3811]玛里苟斯(线性基)尽量理解的题解

文章目录titlesolutioncodetitle 魔法之龙玛里苟斯最近在为加基森拍卖师的削弱而感到伤心&#xff0c;于是他想了一道数学题。 S 是一个可重集合&#xff0c;S{a1,a2,…,an}。 等概率随机取 S 的一个子集 A{ai1,…,aim}。 计算出 A 中所有元素异或和&#xff0c;记为 x, 求 x^…

CF464E The Classic Problem(线段树 最短路)

CF464E The Classic Problem \(\bigstar\texttt{Hint}\)&#xff1a;发现没有什么好的突破口&#xff1f;为什么不想想怎样才能实现题目中 \(2^x\) 的加减法呢&#xff1f; 可见每次加减法&#xff0c;我们要做的是将添加的 \(1\) 和右边的连续的 \(1\) 合并为一整段&#xff0…

C. Longest Simple Cycle

C. Longest Simple Cycle 题意&#xff1a; 有n条链&#xff0c;第i条链上有c[i]个点&#xff0c;a[i]为第i条链的顶点与第i-1条链的连接点&#xff0c;b[i]为第i条链的最后一个点与第i-1条链的连接点。通过上面的方法连接链会产生很多的环&#xff0c;问这些环的最大长度。 …

【CF813F】Bipartite Checking(线段树分治+可删除并查集)

文章目录titlesolutioncodetitle You are given an undirected graph consisting of n vertices. Initially there are no edges in the graph. Also you are given q queries, each query either adds one undirected edge to the graph or removes it. After each query you…

在.Net Core WebAPI下给Swagger增加导出离线文档功能

一丶前言最近刚接触到Swagger&#xff0c;在github上下载了它的源码和demo学习了一遍&#xff0c;发现这个组件非常好用&#xff0c;不过不足的是它没有导出离线文档的功能&#xff0c;于是乎我就想给它加一个导出功能Swagger Github开源地址二丶思路其实说白了api文档就是一个…

YBTOJ洛谷P4331:数字序列(左偏树)

文章目录题目描述数据范围解析代码题目描述 数据范围 n<1e6n<1e6n<1e6 解析 先考虑简单情况 如果原数列是单调递增的&#xff0c;显然应该使biaib_ia_ibi​ai​ 如果单调递减&#xff0c;应该取中位数 那么原数列如果分成单调递减的几段&#xff0c;那么每一段都取中…

P8441 旭日东升(二维数点经典套路)

P8441 旭日东升 维护一个不可重集合的序列 \(a\)&#xff0c;长度为 \(n\)。支持以下两种操作&#xff1a; l r x 对于每个 \(l\le i\le r\)&#xff0c;将 \(x\) 并入 \(a_i\)。l r 设 \(S\) 把每个 \(l\le i\le r\) 的 \(a_i\) 并在一起的集合&#xff0c;输出 \(S\) 中所有元…

深搜、广搜、搜索剪枝

搜索与回溯讲解 文章目录深搜方向向量&#xff1a;DFS代码&#xff1a;题目讲解&#xff1a;八皇后问题字符序列自然数的拆分广搜BFS代码&#xff1a;题目讲解&#xff1a;瓷砖关系网络bfs与dfs的用途与区别搜索剪枝可行性剪枝最优性剪枝记忆化搜索搜索顺序剪枝题目&#xff1a…

使用logdashboard查看可视化日志

logdashboard日志面板是我在Github写的一个开源项目&#xff0c;旨在让查看日志变的方便快捷。在线预览现在功能有日志检索、趋势图、异常堆栈快速查看、日志详情等logdashboard支持自定义日志模型可以记录更多自定义的属性。logdashboard支持的日志来源有以下两种&#xff0c;…

数论分块专题复习(余数求和+模积和+Ice Rain+The Fool)

文章目录前提知识复习T1&#xff1a;余数求和titlesolutioncodeT2&#xff1a;Ice RaintitlesolutioncodeT3&#xff1a;The FooltitlesolutioncodeT4&#xff1a;模积和titlesolutioncode前提知识复习 整除分块是用于快速处理形似下列式子的方法&#xff0c;是解决莫比乌斯反…

领域驱动设计,让程序员心中有码(六)

领域驱动设计-聚合&#xff0c;一种极简的思维模式引言作为IT技术产业飞速发展的产物&#xff0c;软件工程学已经成为当今时代非常重要的一个学科。作为一名资深的软件开发从业者&#xff0c;我们需要学习的东西实际上已经远远超出了原本在大学教育阶段所接受的知识深度和广度&…

hdu 5094 Maze

题意&#xff1a; n*m大的迷宫 &#xff0c;有p种钥匙。钥匙最多有10种。 然后一个k&#xff0c;然后k行表示 (x1,y1),(x2,y2)直接有门或者墙。 如果g0 &#xff0c;就是有墙&#xff0c; 如果g>0 表示有门&#xff0c;且门需要第g把钥匙才能开。 然后下来一个s&#xff…