题目链接 BZOJ

当然哪都能交(都比在BZOJ交好),比如UOJ #58

//67376kb	27280ms
//树上莫队+带修改莫队 模板题
#include <cmath>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 400000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=1e5+5,M=1e6+3; int n,m,Enum,H[N],nxt[N<<1],to[N<<1],val[M],W[N],col[N],las[N],tm[M];
int fa[N],dep[N],sz[N],son[N],top[N],Index,in[N],out[N],seq[N<<1];
LL Now,Ans[M];
bool vis[N];
char IN[MAXIN],*SS=IN,*TT=IN;
struct Queries
{
int l,r,lca,bl,br,tm,id;
bool operator <(const Queries &x)const
{
if(bl!=x.bl) return bl<x.bl;//能优化15%?
if(br!=x.br) return bl&1?br<x.br:br>x.br;
return (bl^br)&1?tm<x.tm:tm>x.tm;
// if(bl==x.bl) return br==x.br?tm<x.tm:br<x.br;
// return bl<x.bl;
}
}q[M];
struct Modify
{
int pos,val,bef;
}qm[M]; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline void AddEdge(int u,int v)
{
to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;
to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum;
}
inline int LCA(int u,int v)
{
while(top[u]!=top[v]) dep[top[u]]>dep[top[v]]?u=fa[top[u]]:v=fa[top[v]];
return dep[u]>dep[v]?v:u;
}
void DFS1(int x)
{
int mx=0; sz[x]=1;
for(int v,i=H[x]; i; i=nxt[i])
if((v=to[i])!=fa[x])
{
fa[v]=x, dep[v]=dep[x]+1, DFS1(v), sz[x]+=sz[v];
if(mx<sz[v]) mx=sz[v], son[x]=v;
}
}
void DFS2(int x,int tp)
{
seq[in[x]=++Index]=x, top[x]=tp;
if(son[x])
{
DFS2(son[x],tp);
for(int i=H[x]; i; i=nxt[i])
if(to[i]!=fa[x]&&to[i]!=son[x]) DFS2(to[i],to[i]);
}
seq[out[x]=++Index]=x;
}
void Calc(int p)
{
vis[p] ? Now-=1ll*W[tm[col[p]]--]*val[col[p]] : Now+=1ll*W[++tm[col[p]]]*val[col[p]];
vis[p]^=1;
}
void Change(int p,int v)
{
if(vis[p]) Calc(p), col[p]=v, Calc(p);
else col[p]=v;
} int main()
{
n=read(), m=read(); int Q=read();
for(int i=1; i<=m; ++i) val[i]=read();
for(int i=1; i<=n; ++i) W[i]=read();
for(int i=1; i<n; ++i) AddEdge(read(),read());
for(int i=1; i<=n; ++i) col[i]=las[i]=read();
DFS1(1), DFS2(1,1);
int qcnt=0, mcnt=0, size=pow(n,2.0/3.0);
for(int i=1,x,y,w; i<=Q; ++i)
if(!read()) qm[++mcnt]=(Modify){x=read(),y=read(),las[x]},las[x]=y;
else
{
x=read(), y=read();
// if(x==y) {q[++qcnt].lca=-1, Ans[qcnt]=...; continue;}
w=LCA(x,y);
if(in[x]>in[y]) std::swap(x,y);
if(x==w) q[++qcnt]=(Queries){in[x],in[y],0,in[x]/size,in[y]/size,mcnt,qcnt};
else q[++qcnt]=(Queries){out[x],in[y],w/*in[w]*/,out[x]/size,in[y]/size,mcnt,qcnt};
}
std::sort(q+1,q+1+qcnt);
for(int i=1,t=0,l=1,r=0,ql,qr,qt; i<=qcnt; ++i)
{
ql=q[i].l, qr=q[i].r, qt=q[i].tm;
while(t<qt) ++t,Change(qm[t].pos,qm[t].val);
while(t>qt) Change(qm[t].pos,qm[t].bef),--t;
if(ql==qr) {Ans[q[i].id]=1ll*val[col[seq[q[i].l]]]*W[1]; continue;}
while(l<ql) Calc(seq[l++]);
while(l>ql) Calc(seq[--l]);
while(r<qr) Calc(seq[++r]);
while(r>qr) Calc(seq[r--]);
if(q[i].lca) Calc(q[i].lca);//Calc(seq[in[lca]]) = Calc(lca)
Ans[q[i].id]=Now;
if(q[i].lca) Calc(q[i].lca);
}
for(int i=1; i<=qcnt; ++i) printf("%lld\n",Ans[i]); return 0;
}

BZOJ.3052.[WC2013]糖果公园(树上莫队 带修改莫队)的更多相关文章

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

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

  2. bzoj 3052: [wc2013]糖果公园 带修改莫队

    3052: [wc2013]糖果公园 Time Limit: 250 Sec  Memory Limit: 512 MBSubmit: 506  Solved: 189[Submit][Status] ...

  3. [BZOJ 3052] [wc2013] 糖果公园 【树上莫队】

    题目链接:BZOJ - 3052 题目分析 这道题就是非常经典的树上莫队了,并且是带修改的莫队. 带修改的莫队:将询问按照 左端点所在的块编号为第一关键字,右端点所在的块为第二关键字,位于第几次修改之 ...

  4. bzoj 3052: [wc2013]糖果公园【树上带修改莫队】

    参考:http://blog.csdn.net/lych_cys/article/details/50845832 把树变成dfs括号序的形式,注意这个是不包含lca的(除非lca是两点中的一个) 然 ...

  5. 【BZOJ】4129: Haruna’s Breakfast 树分块+带修改莫队算法

    [题意]给定n个节点的树,每个节点有一个数字ai,m次操作:修改一个节点的数字,或询问一条树链的数字集合的mex值.n,m<=5*10^4,0<=ai<=10^9. [算法]树分块+ ...

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

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

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

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

  8. 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 ...

  9. LUOGU P4074 [WC2013]糖果公园 (树上带修莫队)

    传送门 解题思路 树上带修莫队,搞了两天..终于开O2+卡常大法贴边过了...bzoj上跑了183s..其实就是把树上莫队和带修莫队结合到一起,首先求出括号序,就是进一次出一次那种的,然后如果求两个点 ...

随机推荐

  1. 原生JavaScript技巧大收集(1~10)

    1.原生JavaScript实现字符串长度截取 01 function cutstr(str, len) { 02     var temp; 03     var icount = 0; 04    ...

  2. javascript实现的拖拽回放

    这个功能很简单,直接贴代码啊: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht ...

  3. linq中let关键字学习

    linq中let关键字就是对子查询的一个别名,let子句用于在查询中添加一个新的局部变量,使其在后面的查询中可见. linq中let关键字实例 1.传统下的子查询与LET关键字的区别     C# 代 ...

  4. HTML5 移动开发 (HTML5标签和属性)

       第一阶    1.如何使用HTML5中的新标签及属性    2.HTML5中的其它变化    3.HTML5的移动支持    4.使用HTML5开发移动WEB引用的理由 第二阶    HTML5 ...

  5. 洛谷 P1056 排座椅 桶排序

    桶排序大法好! 每次一看到这种范围小的题,本萌新就想用桶排. 因为题目中的m,n都小于1000,我们就可以定义两个1000的数组,表示每一行或每一列可以隔开几对讲话的童鞋. 然后再定义两个1000的数 ...

  6. Docker01 CentOS配置Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...

  7. Python 入门基础2 --基本数据类型、运算符

    本节目录 一.IDE(集成环境的安装) 二.基本数据类型 三.输入输出 四.运算符 五.后期补充内容 一.IDE(集成环境的安装) 安装pycharm 注:快捷键: 1.ctrl + ? :注释此行, ...

  8. VAE(Variational Autoencoder)的原理

    Kingma, Diederik P., and Max Welling. "Auto-encoding variational bayes." arXiv preprint ar ...

  9. 阿里云RDS的mysql数据库占用空间超过90%的处理

    阿里云RDS数据库最大支持2T,目前已经占用了90%,如果进行分库或者迁移比较麻烦,思路是找出占用空间过大的日志或不重要的文件进行删除操作 查询所有数据库占用磁盘空间大小的SQL语句: show bi ...

  10. PHP跨域访问

    1.允许所有域名访问 header('Access-Control-Allow-Origin: *'); 2.允许单个域名访问 header('Access-Control-Allow-Origin: ...