P4074 [WC2013]糖果公园

糖果公园


树上待修莫队

注意一个思想,dfn序处理链的方法,必须可以根据类似异或的东西,然后根据lca分两种情况讨论

注意细节


Code:

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cctype>
#define ll long long
const int N=2e5+10;
inline int read()
{
int x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x;
}
struct modi
{
int x,y,pre;
modi(){}
modi(int x,int y,int pre){this->x=x,this->y=y,this->pre=pre;}
}dew[N];
int n,m,q,Q,Mi,l,r,Ti,V[N],W[N],C[N],las[N],B;
struct qry
{
int l,r,lp,rp,ti,ad,id;
qry(){}
qry(int L,int R,int Ti,int Ad,int Id)
{
l=L,r=R,ti=Ti,ad=Ad,id=Id;
lp=(L-1)/B+1,rp=(R-1)/B+1;
}
bool friend operator <(qry a,qry b)
{
return a.lp==b.lp?(a.rp==b.rp?a.ti<b.ti:a.rp<b.rp):a.lp<b.lp;
}
}bee[N];
int head[N],to[N],Next[N],cnt;
void add(int u,int v)
{
to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;
}
int f[N][20],dep[N],dfn[N],low[N],ha[N],dfsclock;
void dfs(int now)
{
ha[dfn[now]=++dfsclock]=now;
dep[now]=dep[f[now][0]]+1;
for(int i=1;f[now][i-1];i++) f[now][i]=f[f[now][i-1]][i-1];
for(int v,i=head[now];i;i=Next[i])
if((v=to[i])!=f[now][0])
f[v][0]=now,dfs(v);
ha[low[now]=++dfsclock]=now;
}
int LCA(int x,int y)
{
if(dep[x]<dep[y]) return LCA(y,x);
for(int i=18;~i;i--)
if(dep[f[x][i]]>=dep[y])
x=f[x][i];
if(x==y) return x;
for(int i=18;~i;i--)
if(f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
return f[x][0];
}
int tag[N],ct[N];
ll Ans[N],ans;
void ins(int p){ans+=1ll*W[++ct[C[p]]]*V[C[p]];}
void del(int p){ans-=1ll*W[ct[C[p]]--]*V[C[p]];}
void upd(int p)
{
if(tag[p]) del(p);
else ins(p);
tag[p]^=1;
}
void rig(int T)
{
int p=dew[T].x;
if(!tag[p]) {C[p]=dew[T].y;return;}
del(p);
C[p]=dew[T].y;
ins(p);
}
void lef(int T)
{
int p=dew[T].x;
if(!tag[p]) {C[p]=dew[T].pre;return;}
del(p);
C[p]=dew[T].pre;
ins(p);
}
int main()
{
n=read(),m=read(),q=read();
for(int i=1;i<=m;i++) V[i]=read();//第i种权值V_i
for(int i=1;i<=n;i++) W[i]=read();//第i次吃某种权值为W_i
for(int u,v,i=1;i<n;i++) u=read(),v=read(),add(u,v),add(v,u);
dfs(1);
for(int i=1;i<=n;i++) las[i]=C[i]=read();//种类为C_i
B=pow(1.0*dfsclock,2.0/3.0)+1;
for(int ty,x,y,i=1;i<=q;i++)
{
ty=read(),x=read(),y=read();
if(ty)//qry
{
if(dfn[x]>dfn[y]) std::swap(x,y);
int lca=LCA(x,y);++Q;
if(x==lca) bee[Q]=qry(dfn[x],dfn[y],Mi,0,Q);
else bee[Q]=qry(low[x],dfn[y],Mi,lca,Q);
}
else
dew[++Mi]=modi(x,y,las[x]),las[x]=y;
}
std::sort(bee+1,bee+1+Q);
for(int i=1;i<=Q;i++)
{
while(l<bee[i].l) upd(ha[l++]);
while(l>bee[i].l) upd(ha[--l]);
while(r<bee[i].r) upd(ha[++r]);
while(r>bee[i].r) upd(ha[r--]);
while(Ti<bee[i].ti) rig(++Ti);
while(Ti>bee[i].ti) lef(Ti--);
if(bee[i].ad) ins(bee[i].ad);
Ans[bee[i].id]=ans;
if(bee[i].ad) del(bee[i].ad);
}
for(int i=1;i<=Q;i++) printf("%lld\n",Ans[i]);
return 0;
}

2019.1.30

洛谷 P4074 [WC2013]糖果公园 解题报告的更多相关文章

  1. Machine Learning Codeforces - 940F(带修莫队) && 洛谷P4074 [WC2013]糖果公园

    以下内容未验证,有错请指正... 设块大小为T,则块数为$\frac{n}{T}$ 将询问分为$(\frac{n}{T})^2$块(按照左端点所在块和右端点所在块分块),同块内按时间从小到大依次处理 ...

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

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

  3. [洛谷P4074][WC2013]糖果公园

    题目大意:给一棵$n$个节点的树,每个点有一个值$C_i$,每次询问一条路径$x->y$,求$\sum\limits_{c}val_c\times \sum\limits_{i=1}^{cnt_ ...

  4. 洛谷 P2195 HXY造公园 解题报告

    P2195 HXY造公园 题目描述 现在有一个现成的公园,有\(n\)个休息点和\(m\)条双向边连接两个休息点.众所周知,\(HXY\)是一个\(SXBK\)的强迫症患者,所以她打算施展魔法来改造公 ...

  5. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  6. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  7. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  8. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  9. 洛谷1303 A*B Problem 解题报告

    洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...

随机推荐

  1. xhtml和html的区别 html5和xhtml的区别

    xhtml和html的区别 - 分为两大类比较:一个是功能上的差别,另外是书写习惯的差别.关于功能上的差别,主要是XHTML可兼容各大浏览器.手机以及PDA,并且浏览器也能快速正确地编译网页,- XH ...

  2. Duplicate entry * for key *

    一.问题 插入数据时报错 Duplicate entry * for key * 二.分析 建表语句 CREATE TABLE `t_product_result_config` ( `id` var ...

  3. Item 9: 比起typedef更偏爱别名声明(alias declaration)

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 我确信我们都同意使用STL容器是一个好主意,并且我希望在Item ...

  4. 开启mac上印象笔记的代码块

    Mac 印象笔记左上角菜单栏:偏好设置-->软件更新-->开启代码块 (Preferences -> Software Update -> Enable code block) ...

  5. MySQL针对Swap分区的运维注意点

    Linux有很多很好的内存.IO调度机制,但是并不会适用于所有场景.对于运维人员来说,Linux比较让人头疼的一个地方是:它不会因为MySQL很重要就避免将分配给MySQL的地址空间映射到swap上. ...

  6. Xcode自动选择证书

    从xcode3时代习惯了手动选择证书,即 Provisioning Profile和 Code Signing Identify. 而随着团队扩大,应用量增多,需要管理的证书也越来越多,每次从长长的l ...

  7. 2017BUAA软工第0次作业

    第一部分:结缘计算机 1. 你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢? 我在上大学之前,其实一直就没怎么考虑过自己以后想要选什么专业,只知道一个大致的方向一定是理工科.毕竟大学之前, ...

  8. activiti 选人的实现

    activiti默认是不带有选人的功能的,它默认的是在调用complete 方法的时候自动根据下一个节点的 assignee属性或者candidate属性 设置下一节点的候选人或者 assginee. ...

  9. Zabbix的简单使用

    0. 卸载mariadb 安装mysql 方法 rpm -qa |grep mariadb 然后 rpm -e --nodeps mariadb***** 安装mysql # 下载mysql源安装包 ...

  10. [转帖] 读懂YML文件.. 书买了还没看完...

    Copy From https://www.cnblogs.com/CloudMan6/p/8370501.html   读懂 Deployment YAML - 每天5分钟玩转 Docker 容器技 ...