LG P4074 [WC2013] 糖果公园

Solution

树上带修莫队,主要还是复习带修莫队和树上莫队。

带修莫队:

  • 带修莫队要先对lll分块的序号作为第一关键字,对rrr分块的序号作为第二关键字,时间ttt作为第三关键字排序,然后正常莫队。
  • 块大小约取O(n23)O(n^{\frac{2}{3}})O(n32​)最优,时间复杂度为O(n53)O(n^{\frac{5}{3}})O(n35​)。

树上莫队:

  • 树上莫队需要按路径端点dfsdfsdfs序为区间端点做莫队,注意这里的dfsdfsdfs序要记录dfndfndfn和fnsfnsfns,也就是形成一个长度为2n2n2n的访问序列。
  • 然后对于询问(x,y)(x,y)(x,y),假设此时dfnx<dfnydfn_x<dfn_ydfnx​<dfny​,若LCA(x,y)=xLCA(x,y)=xLCA(x,y)=x,则莫队区间为[dfnx,dfny][dfn_x,dfn_y][dfnx​,dfny​],否则莫队区间为[fnsx,dfny][fns_x,dfn_y][fnsx​,dfny​]。注意当LCA(x,y)≠xLCA(x,y)\not =xLCA(x,y)​=x的这种情况lcalcalca不会被统计到答案中,需要另外把lcalcalca加进去计算。
  • 时间复杂度O(nn)O(n\sqrt n)O(nn​)。

这题大概把上面两个莫队套一起就行了。

Code

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=998244353;
const int MAXN=600005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
ll ans=0,Ans[MAXN];
vector<int> e[MAXN];
int id[MAXN],dfn[MAXN],fns[MAXN],dep[MAXN],fa[MAXN][20],DFN=0;
int cnt[MAXN],c[MAXN],V[MAXN],w[MAXN],Log[MAXN],bel[MAXN],flag[MAXN];
struct Qnode{ int l,r,lca,id,t; } Q[MAXN];
struct Cnode{ int x,frm,to; } C[MAXN];
void dfs(int x,int father)
{id[dfn[x]=++DFN]=x,dep[x]=dep[father]+1,fa[x][0]=father;for (int i=1;i<=Log[dep[x]];i++) fa[x][i]=fa[fa[x][i-1]][i-1];for (auto v:e[x]) if (v!=father) dfs(v,x);id[fns[x]=++DFN]=x;
}
int getlca(int x,int y)
{if (dep[x]<dep[y]) swap(x,y);for (int i=Log[dep[x]];i>=0;i--)if (dep[fa[x][i]]>=dep[y]) x=fa[x][i];if (x==y) return x;for (int i=Log[dep[x]];i>=0;i--)if (fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];return fa[x][0];
}void add(int x)
{ flag[x]^=1;if (flag[x]) cnt[c[x]]++,ans+=1ll*w[cnt[c[x]]]*V[c[x]]; else ans-=1ll*w[cnt[c[x]]]*V[c[x]],cnt[c[x]]--;
}
signed main()
{int n=read(),m=read(),q=read(),sz=pow(n,0.6),Qnum=0,Cnum=0;for (int i=1;i<=n*2;i++) bel[i]=(i-1)/sz+1;  for (int i=1;i<=m;i++) V[i]=read();for (int i=1;i<=n;i++) w[i]=read();for (int i=1,u,v;i<n;i++) u=read(),v=read(),e[u].PB(v),e[v].PB(u);for (int i=1;i<=n;i++) c[i]=read();dep[0]=-1,Log[1]=0;for (int i=2;i<=n;i++) Log[i]=Log[i>>1]+1;dfs(1,0);for (int i=1;i<=q;i++) {int opt=read(),x=read(),y=read();if (opt==1){int lca=getlca(x,y);if (dfn[x]>dfn[y]) swap(x,y);if (lca==x) Q[++Qnum]=(Qnode){dfn[x],dfn[y],0,Qnum,Cnum};else Q[++Qnum]=(Qnode){fns[x],dfn[y],lca,Qnum,Cnum};}else C[++Cnum]=(Cnode){x,c[x],y},c[x]=y;}sort(Q+1,Q+Qnum+1,[&](Qnode x,Qnode y){ return (bel[x.l]<bel[y.l])||(bel[x.l]==bel[y.l]&&bel[x.r]<bel[y.r])||(bel[x.l]==bel[y.l]&&bel[x.r]==bel[y.r]&&x.t<y.t); });for (int i=1,t=Cnum,l=1,r=0;i<=Qnum;i++){while (t<Q[i].t) { ++t; if (flag[C[t].x]) add(C[t].x),c[C[t].x]=C[t].to,add(C[t].x);else c[C[t].x]=C[t].to;}while (t>Q[i].t){if (flag[C[t].x]) add(C[t].x),c[C[t].x]=C[t].frm,add(C[t].x);else c[C[t].x]=C[t].frm;--t;}while (l<Q[i].l) add(id[l++]);while (l>Q[i].l) add(id[--l]);while (r<Q[i].r) add(id[++r]);while (r>Q[i].r) add(id[r--]);if (Q[i].lca) add(Q[i].lca);Ans[Q[i].id]=ans;if (Q[i].lca) add(Q[i].lca);}for (int i=1;i<=Qnum;i++) printf("%lld\n",Ans[i]);return 0;
}

LG P4074 [WC2013] 糖果公园(带修莫队,树上莫队)相关推荐

  1. 【BZOJ】3052: [wc2013]糖果公园 树分块+带修改莫队算法

    [题目]#58. [WC2013]糖果公园 [题意]给定n个点的树,m种糖果,每个点有糖果ci.给定n个数wi和m个数vi,第i颗糖果第j次品尝的价值是v(i)*w(j).q次询问一条链上每个点价值的 ...

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

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

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

    文章目录 解析 update: 代码 所谓树上莫队,就是在树上的莫队 (逃) 传送门 解析 似乎就是树上的这道题 考虑如何转化为序列问题呢? 考虑dfs序 但是又一个问题... 似乎这条链的dfs序不 ...

  4. 【莫队/树上莫队/回滚莫队】原理详解及例题:小B的询问(普通莫队),Count on a tree II(树上莫队),kangaroos(回滚莫队)

    文章目录 问题引入 介绍莫队算法及其实现过程 时间复杂度 莫队算法适用范围 莫队奇偶优化 普通莫队:小B的询问 树上莫队:SP10707 COT2 - Count on a tree II 回滚莫队: ...

  5. [WC2013]糖果公园

    Description 题库链接 给你一棵 $n$ 个节点,有 $m$种颜色的树.每个节点上有一个颜色.定义一条树上路径的价值为 $sum_c V_c(\sum_{i=1}^{tim_c}W_i)$ ...

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

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

  7. UOJ58 【WC2013】糖果公园

    UOJ58 [WC2013]糖果公园 蒟蒻学个树上莫队都要学一晚上 树上莫队是依照dfs序的,将不过在点遍历完所有儿子后还要再进行一次打时间戳. 用这种方法,再特判一下LCA就好了. 网上的大多数方法 ...

  8. luogu4074-[WC2013]糖果公园

    Description P4074 [WC2013]糖果公园 - 洛谷 | 计算机科学教育新生态 Solution 树上莫队 && 带修莫队. [模板] 各种莫队 代码 #includ ...

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

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

最新文章

  1. HTML语义化:HTML5新标签——template
  2. excel 某个单元格不是等于空值_excel 单元格为空与不存在
  3. [SDOI2017]数字表格
  4. 社交应用动态九宫格图片的规则
  5. 用PD进行数据库建模经验总结
  6. java获取access token_微信java 开发4 access_token获取
  7. 建立Socket Policy服务器
  8. 时隔两年,运维人必备的PuTTY 终于发布新版!
  9. 数据-第11课-双向链表
  10. vue中 点击事件的写法_Vue父子组件状态同步的最佳方式
  11. c语言程序由哪三个部分组成部分,C语言程序的组成部分
  12. java根据经纬度计算距离
  13. Sublime快捷键大全
  14. 【Lintcode】541. Zigzag Iterator II
  15. mysql 多条件 sumif_关于求和我只用数据库函数Dsum,从不用Sum、Sumif等,你信吗?...
  16. 第十届“中国电机工程学会杯”全国大学生电工数学建模竞赛 B 题 全面二孩政策对我国人口结构的影响
  17. 全国高级项目经理人数知多少?(数据统计截止2013年6月22日)
  18. 计算机换显卡,老平台只换显卡 这样升级行不行?
  19. 桌面图标拖不动怎么办?
  20. java mars2_Mars-java 2.2.2 发布,不需要容器的 Java Web 开发框架

热门文章

  1. 不得了,日本出版社竟是这样吸引死宅学编程的
  2. 为什么AI工程师成为当前薪资最高的技术岗位
  3. 如何修改pfpj的服务器,如何更改布局?
  4. oracle怎么删除lob对象,Oracle系列:LOB大对象处理
  5. oracle中文加密算法,Oracle数据库替代加密算法
  6. 怎么打包图片_超简单的免费批量图片压缩技巧,只需3步
  7. android修改电量颜色,android状态栏电池颜色?
  8. 计算机基础知识菜鸟教程,机器学习基础知识整理归纳
  9. 层与特征融合_【计算机系统应用】(第122期)感受野特征增强的 SSD 目标检测算法...
  10. 7-40 奥运排行榜 (25 分)(详解+思路+map+vector做法)兄弟们冲压呀呀呀呀呀呀呀