COGS1817. [WC2013]糖果公园
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。
.jpg)
.jpg)
莫队上树
分享: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]糖果公园的更多相关文章
- bzoj 3052: [wc2013]糖果公园 带修改莫队
3052: [wc2013]糖果公园 Time Limit: 250 Sec Memory Limit: 512 MBSubmit: 506 Solved: 189[Submit][Status] ...
- 洛谷 P4074 [WC2013]糖果公园 解题报告
P4074 [WC2013]糖果公园 糖果公园 树上待修莫队 注意一个思想,dfn序处理链的方法,必须可以根据类似异或的东西,然后根据lca分两种情况讨论 注意细节 Code: #include &l ...
- AC日记——[WC2013]糖果公园 cogs 1817
[WC2013]糖果公园 思路: 带修改树上莫队(模板): 来,上代码: #include <cmath> #include <cstdio> #include <cst ...
- 【BZOJ3052】[wc2013]糖果公园 带修改的树上莫队
[BZOJ3052][wc2013]糖果公园 Description Input Output Sample Input Sample Input Sample Output 84 131 27 84 ...
- [BZOJ3052][UOJ#58][WC2013]糖果公园
[BZOJ3052][UOJ#58][WC2013]糖果公园 试题描述 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来 ...
- 【BZOJ】3052: [wc2013]糖果公园 树分块+带修改莫队算法
[题目]#58. [WC2013]糖果公园 [题意]给定n个点的树,m种糖果,每个点有糖果ci.给定n个数wi和m个数vi,第i颗糖果第j次品尝的价值是v(i)*w(j).q次询问一条链上每个点价值的 ...
- 【Luogu P4074】[WC2013]糖果公园(树上带修改莫队)
题目描述 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园游玩. 糖果公园的结构十分奇特,它由 \(n\) 个游 ...
- 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 ...
- P4074 [WC2013]糖果公园 树上莫队带修改
题目链接 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园游玩. 糖果公园的结构十分奇特,它由 nn 个游览点构 ...
随机推荐
- HDU 1033 Edge[地图型模拟/给你一串字符串,A代表以此点为参照顺时针90°,V代表逆时针90°]
Edge Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- NWU现场赛——解题报告
负二进制转换 Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Problem Desc ...
- 正确地使用GIT FORK
摘自github官方网站,稍后我将抽空翻译. Fork a repo https://help.github.com/articles/fork-a-repo/ Syncing a fork http ...
- codevs——2102 石子归并 2(区间DP)
时间限制: 10 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 在一个园形操场的四周摆放N堆石子,现要将石子有次序地 ...
- Mac 安装brew和安装composer
一.安装brew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/mast ...
- 通信API、使用Web Workers处理线程
1.跨文档消息传输 要想接受从其他的窗口那里发过来的消息,就必须对窗口对象的message事件进行监视. w ...
- 配置和使用服务器Tomcat连接池
1.配置Tomcat6.0根目录\conf\context.xml <?xml version='1.0' encoding='utf-8'?> <!-- Licensed to t ...
- 关于Web应用和容器的指纹收集以及自动化软件的制作
一次对Web应用的渗透,九成都是从信息收集开始,所以信息收集就显得尤为重要.关键信息的收集可以使你在后期渗透的时候更加的得心应手,把渗透比喻成走黑暗迷宫的话,那信息收集可以帮你点亮迷宫的大部分地图. ...
- linux网络管理之网络基础
iso/osi模型 OSI七层框架每层作用 应用层:用户操作的层 表示层:二进制数据与显示数据之间的转换,也是加密的地方 会话层:确定网络传输还是本地存储,是邮件还是ppt等 传输层:确定tcp还是u ...
- TensorFlow笔记六:基于cifar10数据库的AlexNet识别
准确率只有70%,cpu版本的TF居然跑了两天才跑完,其他方法将继续尝试. 生成数据目录: import numpy as np import os train_label = {} for i in ...