题面:

传送门

思路:

一道实现起来细节比较恶心的题目

但是其实就是一个裸的树上带修改莫队

好像树上莫队也出不了什么结合题目,不像序列莫队天天结合AC自动机、后缀数组......

莫队学习请戳这里:莫队

Code:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
inline ll read(){
ll re=,flag=;char ch=getchar();
while(ch>''||ch<''){
if(ch=='-') flag=-;
ch=getchar();
}
while(ch>=''&&ch<='') re=(re<<)+(re<<)+ch-'',ch=getchar();
return re*flag;
}
struct edge{
ll to,next;
}a[];
ll n,m,Q,first[],cntt,clk,block;
ll fa[],dep[],st[][],dfn[];
ll v[],w[],x[];
inline void add(ll u,ll v){
a[++cntt]=(edge){v,first[u]};first[u]=cntt;
a[++cntt]=(edge){u,first[v]};first[v]=cntt;
}
void dfs(ll u,ll f){
//cout<<"dfs "<<u<<" "<<f<<"\n";
ll i,v;
fa[u]=st[u][]=f;dep[u]=dep[f]+;dfn[u]=++clk;
for(i=first[u];~i;i=a[i].next){
v=a[i].to;
if(v==f) continue;
dfs(v,u);
}
}
void init(){
for(ll i=;i<=;i++){
for(ll j=;j<=n;j++){
st[j][i]=st[st[j][i-]][i-];
}
}
}
void _swap(ll &l,ll &r){l^=r;r^=l;l^=r;}
ll LCA(ll l,ll r){
//cout<<"lca "<<l<<" "<<r<<"\n";
if(dep[l]>dep[r]) _swap(l,r);
ll i;
for(i=;i>=;i--) if(dep[st[r][i]]>=dep[l]) r=st[r][i];
if(l==r) return l;
for(i=;i>=;i--){
if(st[l][i]!=st[r][i]){
l=st[l][i];r=st[r][i];
}
}
return fa[l];
}
ll curl,curr,curc,cntq,cntc,cnt[];bool vis[];
ll ans[],tot;
struct query{
ll l,r,c,i;
}q[];
bool cmp(query l,query r){
if(dfn[l.l]/block!=dfn[r.l]/block) return dfn[l.l]/block<dfn[r.l]/block;
else{
if(dfn[l.r]/block!=dfn[r.r]/block)
return dfn[l.r]/block<dfn[r.r]/block;
else return l.c<r.c;
}
}
struct change{
ll pos,to;
}c[];
void rev(ll i){
if(vis[i]) vis[i]=,tot-=v[x[i]]*w[cnt[x[i]]],cnt[x[i]]--;
else vis[i]=,cnt[x[i]]++,tot+=v[x[i]]*w[cnt[x[i]]];
//cout<<"rev node "<<i<<" "<<x[i]<<" "<<tot<<"\n";
}
void change(ll i){
//cout<<"change node "<<i<<" "<<c[i].pos<<" "<<c[i].to<<"\n";
if(!vis[c[i].pos]) _swap(c[i].to,x[c[i].pos]);
else{
rev(c[i].pos);
_swap(c[i].to,x[c[i].pos]);
rev(c[i].pos);
}
}
int main(){
memset(first,-,sizeof(first));
ll i,t1,t2,t3;
n=read();m=read();Q=read();block=(ll)pow(n,0.60);
for(i=;i<=m;i++) v[i]=read();
for(i=;i<=n;i++) w[i]=read();
for(i=;i<n;i++){
t1=read();t2=read();add(t1,t2);
}
for(i=;i<=n;i++) x[i]=read();
dfs(,);init();
//for(i=1;i<=n;i++) cout<<fa[i]<<" "<<dep[i]<<"\n";
for(i=;i<=Q;i++){
t1=read();t2=read();t3=read();
if(t1) q[++cntq].l=t2,q[cntq].r=t3,q[cntq].c=cntc,q[cntq].i=cntq;
else c[++cntc].pos=t2,c[cntc].to=t3;
//cout<<"finish read in "<<i<<"\n";
}
sort(q+,q+cntq+,cmp);
//for(i=1;i<=cntq;i++)
//cout<<q[i].l<<" "<<q[i].r<<" "<<q[i].c<<" "<<q[i].i<<"\n"; if(dfn[q[].l]>dfn[q[].r]) _swap(q[].l,q[].r);
ll lca=LCA(q[].l,q[].r),l,r;curl=q[].l;curr=q[].r;
l=curl;r=curr;
while(l!=lca) rev(l),l=fa[l];
while(r!=lca) rev(r),r=fa[r];
while(curc<q[].c) change(++curc);
rev(lca);ans[q[].i]=tot;rev(lca);
for(i=;i<=cntq;i++){
//cout<<"i=="<<i<<"\n";
if(dfn[q[i].l]>dfn[q[i].r]) _swap(q[i].l,q[i].r);
lca=LCA(curr,q[i].r);l=curr;r=q[i].r;
while(l!=lca) rev(l),l=fa[l];
while(r!=lca) rev(r),r=fa[r];
lca=LCA(curl,q[i].l);l=curl;r=q[i].l;
while(l!=lca) rev(l),l=fa[l];
while(r!=lca) rev(r),r=fa[r];
while(curc>q[i].c) change(curc--);
while(curc<q[i].c) change(++curc);
lca=LCA(q[i].l,q[i].r);
rev(lca);ans[q[i].i]=tot;rev(lca);
curl=q[i].l;curr=q[i].r;
}
for(i=;i<=cntq;i++) printf("%lld\n",ans[i]);
}

[WC2013][luogu4074] 糖果公园 [树上带修改莫队]的更多相关文章

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

    link 题目大意:给一个树,树上每个点都有一种颜色,每个颜色都有一个收益 每次修改一个点上的颜色 或询问一条链上所有颜色第i次遇到颜色j可以获得w[i]*v[j]的价值,求链上价值和 题解:树上带修 ...

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

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

  3. 【BZOJ-3052】糖果公园 树上带修莫队算法

    3052: [wc2013]糖果公园 Time Limit: 200 Sec  Memory Limit: 512 MBSubmit: 883  Solved: 419[Submit][Status] ...

  4. [BZOJ4129]Haruna’s Breakfast(树上带修改莫队)

    BZOJ3585,BZOJ2120,BZOJ3757三合一. 对于树上路径问题,树链剖分难以处理的时候,就用树上带修改莫队. 这里的MEX问题,使用BZOJ3585的分块方法,平衡了时间复杂度. 剩下 ...

  5. 【Luogu P4074】[WC2013]糖果公园(树上带修改莫队)

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

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

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

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

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

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

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

  9. BZOJ3052: [wc2013]糖果公园【树上带修莫队】

    Description Input Output Sample Input Sample Input Sample Output 84 131 27 84 HINT 思路 非常模板的树上带修莫队 真的 ...

随机推荐

  1. Return-to-dl-resolve浅析

    本文介绍一种CTF中的高级rop技巧-Return-to-dl-resolve,不久前的0CTF中的babystack和blackhole就用到了这个技巧. 预备知识 在开始本文前希望大家能预先了解一 ...

  2. Java continue break 制作简单聊天室程序,屏蔽不文明语言,显示每句话聊天时间 for(;;) SimpleDateFormat("yyyy-MM-dd hh:mm:ss") equalsIgnoreCase

    package com.swift; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanne ...

  3. .NET利用RFC连接SAP,查询、读取SAP数据

    为黄朴整理!!!!!!!!!!!!!!!!! 在NuGet 添加 sapnco 一个简单的SAPCommand,方法 GetDataTableFromRFCTable 复制于 https://www. ...

  4. java中char类型转换成int类型的两种方法

    方法一: char ch = '9'; if (Character.isDigit(ch)){ // 判断是否是数字 int num = Integer.parseInt(String.valueOf ...

  5. SAP事件 Event Flow(转载)

    1 报表过程事件 报表过程事件是在报表运行过程中由系统自动控制,按照一定次序被触发的事件,其目的是从数据库中选择数据并整理,准备进行列表输出.这些事件从报表程序启动开始就被系统顺序触发,现分述如下: ...

  6. 安装配置eclipse的图文步骤

    装eclipse 之前要确定自己是否已经安装了java开发环境JDK,JDK的版本64位要下载Eclipse版本64位:JDK32位,要下载Eclipse32位. 一.去eclipse官网下载ecli ...

  7. Scrapy分布式爬虫打造搜索引擎- (二)伯乐在线爬取所有文章

    二.伯乐在线爬取所有文章 1. 初始化文件目录 基础环境 python 3.6.5 JetBrains PyCharm 2018.1 mysql+navicat 为了便于日后的部署:我们开发使用了虚拟 ...

  8. 十、Linux vi/vim

    Linux vi/vim 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主 ...

  9. 九、MySQL 创建数据表

    MySQL 创建数据表 创建MySQL数据表需要以下信息: 表名 表字段名 定义每个表字段 语法 以下为创建MySQL数据表的SQL通用语法: CREATE TABLE table_name (col ...

  10. 678. Valid Parenthesis String

    https://leetcode.com/problems/valid-parenthesis-string/description/ 这个题的难点在增加了*,*可能是(也可能是).是(的前提是:右边 ...