1817. [WC2013]糖果公园

★★★☆   输入文件:park.in   输出文件:park.out   简单对比
时间限制:8 s   内存限制:512 MB

【题目描述】

Candyland 有一座糖果公园,公园里不仅有美丽的风景、好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园玩。

糖果公园的结构十分奇特,它由 n 个游览点构成,每个游览点都有一个糖果发放处,我们可以依次将游览点编号为 1 至 n。有 n−1 条双向道路连接着这些游览点,并且整个糖果公园都是连通的,即从任何一个游览点出发都可以通过这些道路到达公园里的所有其它游览点。

糖果公园所发放的糖果种类非常丰富,总共 m 种,它们的编号依次为 1 至 m。每一个糖果发放处都只发放某种特定的糖果,我们用 ci 来表示 i 号游览点的糖果。

来到公园里游玩的游客都不喜欢走回头路,他们总是从某个特定的游览点出发前往另一个特定的游览点,并游览途中的景点,这条路线一定是唯一的。他们经过每个游览点,都可以品尝到一颗对应种类的糖果。

大家对不同类型的糖果的喜爱程度都不尽相同。根据游客们的反馈打分,我们得到了糖果的美味指数,第 i 种糖果的美味指数为 vi。另外,如果一位游客反复地品尝同一种类的糖果,他肯定会觉得有一些腻。根据量化统计,我们得到了游客第 i 次品尝某类糖果的新奇指数 wi,如果一位游客第 i 次品尝第 j 种糖果,那么他的愉悦指数 H 将会增加对应的美味指数与新奇指数的乘积,即 vjwi。这位游客游览公园的愉悦指数最终将是这些乘积的和。

当然,公园中每个糖果发放点所发放的糖果种类不一定是一成不变的。有时,一些糖果点所发放的糖果种类可能会更改(也只会是 m 种中的一种),这样的目的是能够让游客们总是感受到惊喜。

糖果公园的工作人员小 A 接到了一个任务,那就是根据公园最近的数据统计出每位游客游玩公园的愉悦指数。但数学不好的小 A 一看到密密麻麻的数字就觉得头晕,作为小 A 最好的朋友,你决定帮他一把。

【输入格式】

第一行包含三个正整数 n,m,q,分别表示游览点个数、糖果种类数和操作次数。

第二行包含 m 个正整数 v1,v2,…,vm。

第三行包含 n 个正整数 w1,w2,…,wn。

第四行到第 n+2 行,每行包含两个正整数 ai,bi,表示这两个游览点之间有路径可以直接到达。

第 n+3 行包含 n 个正整数 c1,c2,…,cn。

接下来 q 行,每行包含三个整数 t,x,y,表示一次操作:

若 t 为 0,则 1≤x≤n,1≤y≤m,表示编号为 x 的游览点发放的糖果类型改为 y;

若 t 为 1,则 1≤x,y≤n,表示对出发点为 x,终止点为 y 的路线询问愉悦指数。

【输出格式】

按照输入的先后顺序,对于每个 t 为 1 的操作输出一行,用一个正整数表示答案。

【样例输入】

4 3 5
1 9 2
7 6 5 1
2 3
3 1
3 4
1 2 3 2
1 1 2
1 4 2
0 2 1
1 1 2
1 4 2

【样例输出】

84
131
27
84

【数据范围】

    对于所有的数据,1≤vi,wi≤10^6,1≤ai,bi≤n,1≤ci≤m,w1,w2,…,wn 是非递增序列,即对任意 1<i≤n,满足 wi≤wi−1。

莫队上树

分享:WC2013解题报告

#include<cstdio>
#include<algorithm>
#define FRE(name) freopen(#name".in","r",stdin);freopen(#name".out","w",stdout);
using namespace std;
inline int read(){
int x=,ch=getchar();
while(ch<'!') ch=getchar();
while(ch>'!') x=x*+ch-'',ch=getchar();
return x;
}
typedef long long ll;
const int N=1e5+;
struct edge{int to,next;}e[N<<];
struct ques{int u,v,id,t;}query[N];
struct change_col{int pos,new_col,last;}change[N];
int n,m,q,tot,head[N],v[N],w[N],col[N],last[N],sum[N];
int root,dep[N],fa[N],son[N],siz[N],top[N];
int block_num,block_size,belong[N],stack[N];
ll ans,res[N];bool vis[N];
inline bool cmp(const ques &a,const ques &b){
if(belong[a.u]==belong[b.u]&&belong[a.v]==belong[b.v])return a.t<b.t;
if(belong[a.u]==belong[b.u])return belong[a.v]<belong[b.v];
return belong[a.u]<belong[b.u];
}
inline void add(int x,int y){
e[++tot].to=y;e[tot].next=head[x];head[x]=tot;
e[++tot].to=x;e[tot].next=head[y];head[y]=tot;
}
int dfs_block(int rt){
int size=;siz[rt]=;
for(int i=head[rt];i;i=e[i].next){
if(e[i].to!=fa[rt]){
fa[e[i].to]=rt;
dep[e[i].to]=dep[rt]+;
size+=dfs_block(e[i].to);
siz[rt]+=siz[e[i].to];
if(siz[e[i].to]>siz[son[rt]]) son[rt]=e[i].to;
if(size>=block_size){
block_num++;
for(;size;size--) belong[stack[stack[]--]]=block_num;
}
}
}
stack[++stack[]]=rt;
return size+;
}
void dfs_top(int rt){
if(!son[rt]) return ;
top[son[rt]]=top[rt];dfs_top(son[rt]);
for(int i=head[rt];i;i=e[i].next){
if(e[i].to!=fa[rt]&&e[i].to!=son[rt]){
top[e[i].to]=e[i].to;
dfs_top(e[i].to);
}
}
}
inline int lca(int x,int y){
for(;top[x]!=top[y];x=fa[top[x]]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
}
return dep[x]<dep[y]?x:y;
}
inline void update(int x){
if(vis[x]){
ans-=(ll)v[col[x]]*(ll)w[sum[col[x]]];
sum[col[x]]--;
vis[x]=;
}
else{
sum[col[x]]++;
ans+=(ll)v[col[x]]*(ll)w[sum[col[x]]];
vis[x]=;
}
}
inline void modify(int x,int new_col){
if(!vis[x])
col[x]=new_col;
else{
update(x);
col[x]=new_col;
update(x);
}
}
inline void solve(int u,int v){
while(u!=v){
if(dep[u]>dep[v])
update(u),u=fa[u];
else
update(v),v=fa[v];
}
}
int main(){
FRE(park);
n=read();m=read();q=read();block_size=;
for(int i=;i<=m;i++) v[i]=read();
for(int i=;i<=n;i++) w[i]=read();
for(int i=,x,y;i<n;i++) x=read(),y=read(),add(x,y);
for(int i=;i<=n;i++) col[i]=read(),last[i]=col[i];
int cnt_change=,cnt_query=;
for(int i=,opt,x,y;i<=q;i++){
opt=read();x=read();y=read();
if(!opt){
cnt_change++;
change[cnt_change].pos=x;
change[cnt_change].new_col=y;
change[cnt_change].last=last[x];
last[x]=y;
}
else{
cnt_query++;
query[cnt_query].u=x;
query[cnt_query].v=y;
query[cnt_query].id=cnt_query;
query[cnt_query].t=cnt_change;
}
}
dep[root=]=;dfs_block(root);
for(block_num++;stack[];belong[stack[stack[]--]]=block_num);
top[root]=root;dfs_top(root);
sort(query+,query+cnt_query+,cmp);
for(int i=;i<=query[].t;i++)
modify(change[i].pos,change[i].new_col);
solve(query[].u,query[].v);
int ancestor=lca(query[].u,query[].v);
update(ancestor);
res[query[].id]=ans;
update(ancestor);
for(int i=;i<=cnt_query;i++){
for(int k=query[i-].t+;k<=query[i].t;k++)
modify(change[k].pos,change[k].new_col);
for(int k=query[i-].t;k>query[i].t;k--)
modify(change[k].pos,change[k].last);
solve(query[i-].u,query[i].u);//?
solve(query[i-].v,query[i].v);
ancestor=lca(query[i].u,query[i].v);
update(ancestor);
res[query[i].id]=ans;
update(ancestor);
}
for(int i=;i<=cnt_query;i++) printf("%lld\n",res[i]);
return ;
}

COGS1817. [WC2013]糖果公园的更多相关文章

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

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

  2. 洛谷 P4074 [WC2013]糖果公园 解题报告

    P4074 [WC2013]糖果公园 糖果公园 树上待修莫队 注意一个思想,dfn序处理链的方法,必须可以根据类似异或的东西,然后根据lca分两种情况讨论 注意细节 Code: #include &l ...

  3. AC日记——[WC2013]糖果公园 cogs 1817

    [WC2013]糖果公园 思路: 带修改树上莫队(模板): 来,上代码: #include <cmath> #include <cstdio> #include <cst ...

  4. 【BZOJ3052】[wc2013]糖果公园 带修改的树上莫队

    [BZOJ3052][wc2013]糖果公园 Description Input Output Sample Input Sample Input Sample Output 84 131 27 84 ...

  5. [BZOJ3052][UOJ#58][WC2013]糖果公园

    [BZOJ3052][UOJ#58][WC2013]糖果公园 试题描述 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来 ...

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

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

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

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

  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. P4074 [WC2013]糖果公园 树上莫队带修改

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

随机推荐

  1. 前端优化之Combo Handler

    Combo Handler来合并CSS/JS文件 背景 Combo Handler是Yahoo!开发的一个Apache模块,它实现了开发人员简单方便地通过URL来合并JavaScript和CSS文件, ...

  2. MySQL常见注意事项及优化

    MySQL常见注意事项 模糊查询 like 默认是对name字段建立了索引 注意:在使用模糊查询的时候,当% 在第一个字母的位置的时候,这个时候索引是无法被使用的.但是% 在其他的位置的时候,索引是可 ...

  3. MariaDB+Galera+Haproxy+Keepalived搭建集群

    1.MariaDB Galera Cluster介绍 MariaDB Galera Cluster是MariaDB同步多主机集群,它仅支持XtraDB/InnoDB存储引擎,在MySQLInnoDB存 ...

  4. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock'

    原因:找不到mysql.sock文件 解决方法: 1 找到mysql.sock文件位置 echo "show variables" | mysql | grep "soc ...

  5. EasyMvc入门教程-基本控件说明(8)提醒导航

    提醒导航顾名思义就是提醒大家注意某些文字了..请看下面的例子: 实现代码如下: @Html.Q().BlockRemind().Text("我可以作为提醒使用") 有的同学会说:这 ...

  6. MFC MFC对话框滚动条的使用

      对话框的(上下/左右)滚动事件,比如,把一个比较大的对话框放入tab控件的某一页时,就需要添加滚动条.在使用了java和qt等图形界面化的集成开发环境之后,再使用MFC,就会发现,想要让一个对话框 ...

  7. 做dg时遇到的log_archive_dest、log_archive_dest_1、db_recovery_file_dest之间互相影响

    前提:归档开启.默认不指定归档文件夹. 今晚遇到客户那里设置了闪回区和log_archive_dest.不停库做DG时,无法指定log_archive_dest_n參数,巨坑. .实验了下.结论例如以 ...

  8. ThinkPHP 3.1、3.2一个通用的漏洞分析

    Author:m3d1t10n 前两天看到phithon大大在乌云发的关于ThinkPHP的漏洞,想看看是什么原因造成的.可惜还没有公开,于是就自己回来分析了一下. 0x00官方补丁(DB.class ...

  9. kill -signal

    1. SIGHUP 启动被终止的进程,可让该PID重新读取配置文件,类似于重启服务 对应的数字为1 9.SIGTERM 以正常的结束进程来终止进程 15.SIGSTOP 暂停一个进程相当于crtl+z

  10. 使用Python+Selenium过程中中常见的问题汇总

    1.提示:UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 542: ordinal not in range( ...