【题目链接】

http://uoj.ac/problem/58

【题意】

有一棵树,结点有自己的颜色,若干询问:u,v路径上的获益,并提供修改颜色的操作。

其中获益定义为Vc*W1+Vc*W2+…+Vc*Wcnt,cnt为经过颜色c的次数。

【思路】

如果没有修改操作就和 苹果树 这道题一样了。

加上修改操作,我们可以对每一个修改操作打上一个时间戳,并记录每一个查询最后修改的时间戳。这样在莫队“区间移动”的时候,只需要根据时间戳进行时光逆流或顺流,即加上现在时间内前一个时间没有的修改或消除现在时间内没有前一个时间存在的修改。

对于一个修改,如果已经打上标记即这时候计入了now,我们应该先把它在路径上取反存在性,修改后再取反一下就又以新的权值回到了路上,就是重新计算一下贡献。

【代码】

 #include<set>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define trav(u,i) for(int i=front[u];i;i=e[i].nxt)
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; typedef long long ll;
const int N = 3e5+;
const int D = ; ll read() {
char c=getchar();
ll f=,x=;
while(!isdigit(c)) {
if(c=='-') f=-; c=getchar();
}
while(isdigit(c))
x=x*+c-'',c=getchar();
return x*f;
} struct Edge { int v,nxt;
}e[N<<];
int en=,front[N];
void adde(int u,int v)
{
e[++en]=(Edge){v,front[u]}; front[u]=en;
} int n,m,B,Q,dfsc,top,Bcnt;
int cnt[N],C[N]; ll now,ans[N],W[N],V[N];
int pos[N],dfn[N],dep[N],fa[N][D],vis[N],st[N],pre[N]; struct Node
{
int id,u,v,t;
bool operator < (const Node& rhs) const
{
if(pos[u]==pos[rhs.u]&&pos[v]==pos[rhs.v]) return t<rhs.t;
else if(pos[u]==pos[rhs.u]) return pos[v]<pos[rhs.v];
else return pos[u]<pos[rhs.u];
}
} q[N];
struct opNode { int u,v,pre;
} que[N]; int qs,cs; int dfs(int u)
{
FOR(i,,D-)
fa[u][i]=fa[fa[u][i-]][i-];
dfn[u]=++dfsc;
int siz=;
trav(u,i) {
int v=e[i].v;
if(v!=fa[u][]) {
fa[v][]=u;
dep[v]=dep[u]+;
siz+=dfs(v);
if(siz>=B) {
Bcnt++;
while(siz--)
pos[st[top--]]=Bcnt;
}
}
}
st[++top]=u;
return siz+;
}
int lca(int u,int v)
{
if(dep[u]<dep[v]) swap(u,v);
int t=dep[u]-dep[v];
FOR(i,,D-)
if(t&(<<i)) u=fa[u][i];
if(u==v) return u;
for(int i=D-;i>=;i--)
if(fa[u][i]!=fa[v][i])
u=fa[u][i],v=fa[v][i];
return fa[u][];
}
void Xor(int u)
{
if(vis[u])
vis[u]=,now-=V[C[u]]*W[cnt[C[u]]--];
else
vis[u]=,now+=V[C[u]]*W[++cnt[C[u]]];
}
void upd(int u,int v)
{
if(vis[u]) {
Xor(u); C[u]=v; Xor(u);
}
else
C[u]=v;
}
void work(int u,int v)
{
while(u!=v) {
if(dep[u]<dep[v]) swap(u,v);
Xor(u); u=fa[u][];
}
} int main()
{
// freopen("in.in","r",stdin);
// freopen("out.out","w",stdout);
n=read(),m=read(),Q=read();
B=pow(n,2.0/)*0.5;
FOR(i,,m) V[i]=read();
FOR(i,,n) W[i]=read();
int op,u,v,w;
FOR(i,,n-) {
u=read(),v=read();
adde(u,v),adde(v,u);
}
FOR(i,,n)
pre[i]=C[i]=read(); dfs();
++Bcnt;
while(top) pos[st[top--]]=Bcnt;
FOR(i,,Q)
{
op=read(),u=read(),v=read();
if(op==) {
++cs;
que[cs].u=u,que[cs].v=v;
que[cs].pre=pre[u]; pre[u]=v;
} else {
++qs;
if(dfn[u]>dfn[v]) swap(u,v);
q[qs].u=u,q[qs].v=v;
q[qs].id=qs; q[qs].t=cs;
}
}
sort(q+,q+qs+);
FOR(i,,q[].t) upd(que[i].u,que[i].v);
work(q[].u,q[].v);
int lc=lca(q[].u,q[].v);
Xor(lc);
ans[q[].id]=now;
Xor(lc);
FOR(i,,qs)
{
for(int j=q[i-].t+;j<=q[i].t;j++) upd(que[j].u,que[j].v);
for(int j=q[i-].t;j>q[i].t;j--) upd(que[j].u,que[j].pre);
work(q[i-].u,q[i].u);
work(q[i-].v,q[i].v);
int lc=lca(q[i].u,q[i].v);
Xor(lc);
ans[q[i].id]=now;
Xor(lc);
}
FOR(i,,qs) printf("%lld\n",ans[i]);
return ;
}

P.S.辣鸡错误毁我青春(摔

  说到底还是自己太辣鸡了QAQ

uoj #58. 【WC2013】糖果公园(树上莫队算法+修改操作)的更多相关文章

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

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

  2. P4074 [WC2013]糖果公园 树上莫队带修改

    题目链接 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园游玩. 糖果公园的结构十分奇特,它由 nn 个游览点构 ...

  3. BZOJ3052:[WC2013]糖果公园(树上莫队)

    Description Input Output Sample Input 4 3 51 9 27 6 5 12 33 13 41 2 3 21 1 21 4 20 2 11 1 21 4 2 Sam ...

  4. BZOJ 3052: [wc2013]糖果公园 | 树上莫队

    题目: UOJ也能评测 题解 请看代码 #include<cstdio> #include<algorithm> #include<cstring> #includ ...

  5. [BZOJ3052][UOJ#58][WC2013]糖果公园

    [BZOJ3052][UOJ#58][WC2013]糖果公园 试题描述 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来 ...

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

    问题描述 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园游玩.糖果公园的结构十分奇特,它由 n 个游览点构成, ...

  7. 【WC2013】糖果公园 [树上莫队]

    题意: 一棵树,修改一个点的颜色,询问两点路径上每种颜色的权值$val[c]$*出现次数的权值$cou[w[c]]$的和 sro VFK 树上莫队 按照王室联邦的方法分块,块的大小直径个数有保证,并不 ...

  8. BZOJ3052/UOJ#58 [wc2013]糖果公园 莫队 带修莫队 树上莫队

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3052.html 题目传送门 - BZOJ3052 题目传送门 - UOJ#58 题意 给定一棵树,有 ...

  9. 洛谷P4074 [WC2013]糖果公园(莫队)

    传送门 总算会树形莫队了…… 上次听说树形莫队是给树分块,实在看不懂.然后用括号序列的方法做总算能弄明白了 先说一下什么是括号序列,就是在$dfs$的时候,进入的时候记录一下,出去的时候也记录一下 拿 ...

随机推荐

  1. PV UV

    定义 PV: Page View       页面浏览量或点击量,用户每次刷新即被计算一次. UV: Unique Visitor  就是有多少个IP数量.就是指的有多少人在访问你的店.每个人用的电脑 ...

  2. c# 网络是否连接

    c#  网络是否连接 方案一: using System; using System.Collections.Generic; using System.Linq; using System.Text ...

  3. 监听Activity进入后台(最小化),并根据时间判断是否超时,此解决办法可用于超时重登陆

    通过重写一个继承自Activity的基类中的onUserLeaveHint()方法,当用户按Home键等操作使程序进入后台时即开始计时,当用户使程序恢复为前台显示时执行onResume()方法,在其中 ...

  4. OracleApps 什么是Back to Back Order?

    什么是Back to Back Order? 简单的说,B2B是我们从供应商那拿货,然后收到货后,再发运给客户.. B2B Flow B2B的例子 1.Item的定义 Item Should be c ...

  5. [Golang] base64加密与解密

    首先解释以下什么是base64(来自百度百科): Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045-RFC2049,上面有MIME的详细规范.Base64 ...

  6. Itext导出PDF,word,图片案例

    iText导出pdf.word.图片 一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生 ...

  7. java日期格式的转换

    1.转换指定格式的日期 /** * 日期格式转换 * @throws ParseException */ public String dateformat(String date,String tab ...

  8. 聚集索引、非聚集索引、聚集索引组织表、堆组织表、Mysql/PostgreSQL对比、联合主键/自增长、InnoDB/MyISAM(引擎方面另开一篇)

    参考了多篇文章,分别记录,如下. 下面是第一篇的总结 http://www.jb51.net/article/76007.htm: 在MySQL中,InnoDB引擎表是(聚集)索引组织表(cluste ...

  9. 51nod1403 有趣的堆栈

    看成括号序列的话第二种方法其实就是左括号和右括号之间有多少对完整的括号. #include<cstdio> #include<cstring> #include<ccty ...

  10. linux系统查看磁盘分区使用空间

    Df命令是linux系统以磁盘分区使用空间:df -hl