uoj#58. 【WC2013】糖果公园


题意

有一棵N(<=1e5)个点的树,每个点对应M(<=1e5)种糖果中的一种。
一条路径的权值定义为∑i(Vi∗∑tij=1Wj)\sum_i ( V_i*\sum_{j=1}^{t_i} W_j),其中i为路径中出现的不同种类糖果,ti为第i种糖果的出现次数,V和W给定。
Q(<=1e5)次操作,每次操作修改一个点对应的糖果种类,或询问路径(u,v)的权值。


题解

半年前写了一半,然而代码弄丢了。
树上莫队和带修改莫队放一起,算是比较模板的题?
跑得太慢了,不好意思写题解,就放个代码吧。


代码

#include<bits/stdc++.h>
#define N 100005
#define L 18
#define Y no[i]
#define X mx[op]
using namespace std;
typedef long long ll;
ll ans[N],s,ss[N];
bool vis[N];
char ch;
inline void rd(int &x)
{x=0;do ch=getchar();while(ch<'0'||ch>'9');do x=(x<<3)+(x<<1)+ch-'0',ch=getchar();while(ch>='0'&&ch<='9');
}
int n,m,q,sqr,tp,mx[N],my[N],pre[N],
ql[N],qr[N],qx[N],no[N],mt,qt,t[N],
V[N],W[N],c[N],b[N],f[N][L],dep[N],
to[N<<1],hd[N<<1],lk[N],cnt;
inline void add(int u,int v)
{to[++cnt]=v,hd[cnt]=lk[u],lk[u]=cnt;}
void dfs(int x)
{dep[x]=dep[f[x][0]]+1;b[x]=tp++/sqr;for(int i=1;f[x][i-1];i++)f[x][i]=f[f[x][i-1]][i-1];for(int k,i=lk[x];i;i=hd[i])if(!dep[k=to[i]])f[k][0]=x,dep[k]=dep[x]+1,dfs(k);
}
bool cmp(int x,int y)
{return (b[ql[x]]^b[ql[y]])?b[ql[x]]<b[ql[y]]:((b[qr[x]]^b[qr[y]])?b[qr[x]]<b[qr[y]]:qx[x]<qx[y]);
}
inline void ins(int x,int v)
{s-=ss[x];if(v>0)ss[x]+=(ll)V[x]*W[t[x]+1];else ss[x]-=(ll)V[x]*W[t[x]];t[x]+=v,s+=ss[x];
}
inline void mdf(int x)
{ins(c[x],(vis[x]^=1)?1:-1);}
inline void trans(int x,int y)
{if(dep[x]<dep[y])swap(x,y);while(dep[x]>dep[y])mdf(x),x=f[x][0];while(x^y)mdf(x),mdf(y),x=f[x][0],y=f[y][0];
}
int op,u,v,x,y;
int main()
{rd(n),rd(m),rd(q);for(int i=1;i<=m;rd(V[i++]));for(int i=1;i<=n;rd(W[i++]));for(int i=1;i<n;i++)rd(u),rd(v),add(u,v),add(v,u);for(int i=1;i<=n;rd(c[i++]));while(sqr*sqr*sqr<n)sqr++;sqr=n/sqr;dfs(1),tp=0;for(int i=1;i<=q;i++){rd(op);if(op){rd(ql[qt]),rd(qr[qt]);if(b[ql[qt]]>b[qr[qt]])swap(ql[qt],qr[qt]);no[qt]=qt,qx[qt++]=mt;}elserd(u),rd(my[mt]),pre[mt]=c[mx[mt]=u],c[u]=my[mt++];}sort(no,no+qt,cmp);u=v=1,op=mt;for(int i=0;i<qt;i++){trans(u,ql[Y]),u=ql[Y];trans(v,qr[Y]),v=qr[Y];while(op<qx[Y]){if(vis[X])ins(c[X],-1),ins(my[op],1);c[X]=my[op],op++;}while(op>qx[Y]){op--;if(vis[X])ins(c[X],-1),ins(pre[op],1);c[X]=pre[op];}x=u,y=v;if(dep[y]>dep[x])swap(x,y);for(int j=L-1;dep[x]^dep[y];j--)if(dep[f[x][j]]>=dep[y])x=f[x][j];for(int j=L-1;j>=0;j--)if(f[x][j]^f[y][j])x=f[x][j],y=f[y][j];if(x^y)x=f[x][0];mdf(x);ans[Y]=s;mdf(x);}for(int i=0;i<qt;i++)printf("%lld\n",ans[i]);
}

uoj#58./bzoj3052 【WC2013】糖果公园 //树上带修改莫队相关推荐

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

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

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

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

  3. 【BZOJ4129】Haruna’s Breakfast,树上带修莫队+权值分块求mex

    Time:2016.09.08 Author:xiaoyimi 转载注明出处谢谢 思路: 这道题相当于把昨天学的树上莫队和带修莫队融合了一下,顺便加了一个mex(未出现的最小自然数) 那么主要问题就是 ...

  4. Codeforces 940 F - Machine Learning(带修改莫队, 及注意事项)

    F - Machine Learning You come home and fell some unpleasant smell. Where is it coming from? You are ...

  5. P4074-[WC2013]糖果公园【树上带修莫队】

    正题 题目链接:https://www.luogu.com.cn/problem/P4074 题目大意 nnn个点的一颗数,第iii个点有一颗cic_ici​种类的糖. 第iii次获得jjj种类的糖可 ...

  6. BZOJ2120 数颜色 【带修改莫队】

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MB Submit: 6579  Solved: 2625 [Submit][Status][Discus ...

  7. LG P4074 [WC2013] 糖果公园(带修莫队,树上莫队)

    LG P4074 [WC2013] 糖果公园 Solution 树上带修莫队,主要还是复习带修莫队和树上莫队. 带修莫队: 带修莫队要先对lll分块的序号作为第一关键字,对rrr分块的序号作为第二关键 ...

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

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

  9. 莫队算法 (普通莫队、带修莫队、树上莫队)

    莫队算法 主要基于分块的思想 用结构体记录询问的左右端点及询问编号 (这是一个离线算法) 通过排序优化指针扫描顺序优化时间复杂度 . 1.普通莫队 例题:SP3267 DQUERY - D-query ...

最新文章

  1. 【邮箱使用】Yahoo邮箱POP3、SMTP开通以及设置方法
  2. C#Redis集合set
  3. 科大星云诗社动态20210530
  4. OpenCV向Facemark API添加新算法
  5. 墨迹天气android,墨迹天气Android产品分析
  6. js学习笔记(十二)——语法速查表
  7. 群里又会python的吗_自从会了Python在群里斗图就没输过,Python批量下载表情包!...
  8. react-native全局变量和静态变量使用
  9. popupwindow使用之异常:unable to add window -- token null is not valid
  10. 2022亚太杯数学建模比赛准备
  11. RSAC2020的PPT下载
  12. JavaMail之发送邮件+接收邮件
  13. cad,max,revit,Civil ,InventorNavisworks 卸载清理工具
  14. Chrome浏览器主页被篡改怎么修复
  15. [转]:Quartus II LPM使用指南-FIFO篇
  16. 站外促销折扣码设置教程
  17. php百度地图创建应用程序,使用百度地图API创建第一个电子地图
  18. DBUtils 的使用与踩坑记录
  19. Matlab GUI自定义提示窗(对话框)
  20. 公募基金历史数据基础分析教程

热门文章

  1. HTTP返回结果状态码小结
  2. python flask+apscheduler定时任务导致数据重复和错误
  3. 斗兽棋java程序,Java 斗兽棋算法 帮优化一下解决办法
  4. 【python初级】os.path.isfile(path)判断路径是否为文件
  5. C语言快速幂(入门讲解)
  6. 问题解决:网上导入git项目,各种报错
  7. MQTT订阅发布主题
  8. 51单片机之点阵、矩阵键盘
  9. jar文件的打开方式
  10. Exceeded limit on max bytes to buffer : 262144