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)
莫队上树
分享: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 个游览点构 ...
随机推荐
- .NET 下二维码解决方案
使用Zint和Zxing实现二维码的编码与解码(Using open-source tools to generate and decode Q-R code) 1.Zint生成二维码 http:// ...
- 牛客网 牛客小白月赛2 C.真真假假-String遍历比较
C.真真假假 链接:https://www.nowcoder.com/acm/contest/86/C 这个题真的是无敌的水,但是自己写前面的string数组的时候,里面的这些头文件要用双引号(&qu ...
- CS Academy Round #65 Count Arrays (DP)
题目链接 Count Arrays 题意 给定$n$和$m$个区间.若一个长度为$n$的$01$序列满足对于每一个给定的区间中至少有一个位置是$0$, 那么这个$01$序列满足条件.求有多少满足条 ...
- 如何在CentOS 7上安装Nginx
第一步 - 添加Nginx存储库要添加CentOS 7 EPEL仓库,请打开终端并使用以下命令: sudo yum install epel-release第二步 - 安装Nginx现在Nginx存储 ...
- POJ 2484 A Funny Game [博弈]
题意:n枚硬币围成一个圈,每次每个人可以从中取走一枚或者相邻的两枚(如果两枚硬币原本中间隔着一枚硬币,后来被取走,这两枚硬币不算相邻).谁取走最后一枚硬币谁就赢了. 思路:我们可以找找规律. 首先,n ...
- 2016集训测试赛(十九)Problem C: 无聊的字符串
Solution 傻X题 我的方法是建立后缀后缀树, 然后在DFS序列上直接二分即可. 关键在于如何得到后缀树上每个字符对应的字节点: 我们要在后缀自动机上记录每个点在后缀树上对应的字母. 考虑如何实 ...
- Factory Method 和AbstractFactory
对应慕课视频的连接:https://www.imooc.com/video/5316 1,工厂模式的应用场景 有一组类似的对象需要被创建 在编码时不能预见需要被创建哪种类的实例 在系统需要考虑扩展性的 ...
- Ruby Time And DateTime之Time in Core
今天遇到一个问题,就是在Ruby中对于Time和DateTime的使用,不是很明了,现在研究一下: 先说Time: 在Ruby2.0中关于Time有两处定义一个是在Core中,http://www.r ...
- Retrofit 使用flatmap操作符时处理错误、异常
在实际项目(Retrofit+RxJava框架)中,有时需要先登录,获取token后再去获取用户信息,此时我们使用flatmap操作符比较好. 在RESTResult对象里,包括请求返回的状态:失败还 ...
- MySQL中批量删除指定前缀表的sql语句
有时候我们在安装一些cms的时候,这些cms都是带表前缀的方便区分数据,但有时候我们测试完需要删除的时候又有别的前缀表就可以参考下面的方法 代码如下:Select CONCAT( 'drop tabl ...