洛谷 P4074 [WC2013]糖果公园 解题报告
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]糖果公园 解题报告的更多相关文章
- Machine Learning Codeforces - 940F(带修莫队) && 洛谷P4074 [WC2013]糖果公园
以下内容未验证,有错请指正... 设块大小为T,则块数为$\frac{n}{T}$ 将询问分为$(\frac{n}{T})^2$块(按照左端点所在块和右端点所在块分块),同块内按时间从小到大依次处理 ...
- 洛谷P4074 [WC2013]糖果公园(莫队)
传送门 总算会树形莫队了…… 上次听说树形莫队是给树分块,实在看不懂.然后用括号序列的方法做总算能弄明白了 先说一下什么是括号序列,就是在$dfs$的时候,进入的时候记录一下,出去的时候也记录一下 拿 ...
- [洛谷P4074][WC2013]糖果公园
题目大意:给一棵$n$个节点的树,每个点有一个值$C_i$,每次询问一条路径$x->y$,求$\sum\limits_{c}val_c\times \sum\limits_{i=1}^{cnt_ ...
- 洛谷 P2195 HXY造公园 解题报告
P2195 HXY造公园 题目描述 现在有一个现成的公园,有\(n\)个休息点和\(m\)条双向边连接两个休息点.众所周知,\(HXY\)是一个\(SXBK\)的强迫症患者,所以她打算施展魔法来改造公 ...
- 洛谷_Cx的故事_解题报告_第四题70
1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h> struct node { long x,y,c; ...
- 洛谷 P2317 [HNOI2005]星际贸易 解题报告
P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...
- 洛谷 P3802 小魔女帕琪 解题报告
P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...
- 洛谷 P2606 [ZJOI2010]排列计数 解题报告
P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...
- 洛谷1303 A*B Problem 解题报告
洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...
随机推荐
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(八)线上Mysql数据库崩溃事故的原因和处理
前文提要 承接前文<一次线上Mysql数据库崩溃事故的记录>,在文章中讲到了一次线上数据库崩溃的事件记录,建议两篇文章结合在一起看,不至于摸不着头脑. 由于时间原因,其中只讲了当时的一些经 ...
- Effective C++学习笔记之#define
前言 条款02:尽量以const.enum.inline替换#define:尽可能用编译器代替不必要的预处理器. 内容 一.对于单纯常量 1.const 有两种特殊的const,常量指针和class专 ...
- win10系统安装web3js的正确方法(2)
信渤网络科技是一家基于互联网信息服务的区块链技术公司,专业提供区块链技术培训,智能合约定制开发,文字图片数据存证上链等服务,为相关企业提供区块链应用落地项目的技术方案 崇尚代码即法律,做一个智能合约开 ...
- Scrum Meeting NO.8
Scrum Meeting No.8 1.会议内容 2.任务清单 徐越 序号 近期的任务 进行中 已完成 1 代码重构:前端通讯模块改为HttpClient+Json √ 2 添加对cookies的支 ...
- StringBuffer的append方法比“+”高效
在字符串的连接过程中StringBuffer的效率要比String高: string操作代码: String str = new String("welcome to "); st ...
- 程序设计第三次作业---C++计算器雏形
Github链接:https://github.com/Wasdns/object-oriented 题目:程序设计第三次作业 程序设计第三次作业附加 我的程序设计第三次作业附加 代码规范 更新时间: ...
- 实验二 合作:王宏财 http://www.cnblogs.com/wanghongcai/
package 四则运算; import javax.swing.JFrame; import javax.swing.JButton; import javax.swing.JOptionPane; ...
- HDOJ2010_水仙花数
一道水题.一直出现Output Limit Exceeded的原因是在while循环中没有终止条件的时候会自动判断并报错,写的时候忘记加!=EOF结束标识了. HDOJ2010_水仙花数 #inclu ...
- Apollo的Oracle适配
Apollo的Oracle适配改动 这几天工作需要使用Apollo配置中心.Apollo唯一的依赖是MySQL数据库,然而公司只有Oracle数据库资源.这里有一个Oracle适配改动的分支,但是 ...
- how-is-docker-different-from-a-normal-virtual-machine[Docker与VirtualMachine的区别]
https://stackoverflow.com/questions/16047306/how-is-docker-different-from-a-normal-virtual-machine 被 ...