●UOJ58 [WC2013]糖果公园
题链:
树上带修莫队。
每个块的大小为$n^{\frac{2}{3}}$,在dfs时,把点集分为若干块。
然后类似序列带修莫队,三个关键字:bel[u],bel[v],time来排序,
从上一个询问(u,v)更新到新的询问(u',v')时,
首先把时间弄对,
然后再把u->lca(u,u')->u'(不含lca(u,u'))这条链上的点的信息取反(原来不存在,现在就存在;原来存在,现在就存在)。
同样对v->lca(v,v')->v'(不含lca(v,v'))这条链上的点的信息取反。
由于没有考虑到lca(u',v')的贡献,所以加上该lca的后,得到当前询问的答案。
(被洛谷的数据卡的不要不要的,勉强过了UOJ)
代码:
#include<bits/stdc++.h>
#define MAXN 100005
#define rint register int
using namespace std;
long long ans,ANS[MAXN];
int N,M,Qnt,BLOCK,nowU,nowV,nowT;
int candy[MAXN],s[MAXN],V[MAXN],W[MAXN],fa[MAXN][18],bel[MAXN],deep[MAXN],vis[MAXN],now[MAXN];
struct Edge{
int ent;
int to[MAXN*2],nxt[MAXN*2],head[MAXN];
Edge(){ent=2;}
void Adde(int u,int v){
to[ent]=v; nxt[ent]=head[u]; head[u]=ent++;
}
}E;
struct Query{
int u,v,t,id;
bool operator < (const Query &rtm) const{
return bel[u]==bel[rtm.u]?(bel[v]==bel[rtm.v]?t<rtm.t:bel[v]<bel[rtm.v]):bel[u]<bel[rtm.u];
}
}Q[MAXN];
struct Change{int p,nc,oc;}C[MAXN];
void read(int &x){
static int sign; static char ch;
sign=1; x=0; ch=getchar();
for(;ch<'0'||'9'<ch;ch=getchar()) if(ch=='-') sign=-1;
for(;'0'<=ch&&ch<='9';ch=getchar()) x=x*10+ch-'0';
x=x*sign;
}
void dfs(int u){
static int stk[MAXN],top,bnt;
for(rint k=1;k<17;k++)
fa[u][k]=fa[fa[u][k-1]][k-1];
for(rint e=E.head[u];e;e=E.nxt[e]){
int v=E.to[e]; if(v==fa[u][0]) continue;
fa[v][0]=u; deep[v]=deep[u]+1; dfs(v);
if(top>BLOCK){
++bnt;
while(top) bel[stk[top--]]=bnt;
}
}
stk[++top]=u;
if(u==1) while(top) bel[stk[top--]]=bnt;
}
int LCA(int u,int v){
static int d;
if(deep[u]>deep[v]) swap(u,v);
d=deep[v]-deep[u];
for(rint k=16;k>=0;k--)
if(d&(1<<k)) v=fa[v][k];
if(u==v) return u;
for(rint k=16;k>=0;k--)
if(fa[u][k]!=fa[v][k]) u=fa[u][k],v=fa[v][k];
return fa[u][0];
}
void modify(int p){
if(!vis[p]) candy[s[p]]++,ans+=1ll*W[candy[s[p]]]*V[s[p]];
else ans-=1ll*W[candy[s[p]]]*V[s[p]],candy[s[p]]--;
vis[p]^=1;
}
void trans(rint u,rint v){
while(u!=v)
deep[u]>=deep[v]?(modify(u),u=fa[u][0]):(modify(v),v=fa[v][0]);
}
void dotime(int p,int c){
if(vis[p]) modify(p),s[p]=c,modify(p);
else s[p]=c;
}
int main(){
int q,t,lca;
read(N); read(M); read(Qnt); BLOCK=pow(N,0.6);
for(rint i=1;i<=M;i++) read(V[i]);
for(rint i=1;i<=N;i++) read(W[i]);
for(rint i=1,a,b;i<N;i++)
read(a),read(b),E.Adde(a,b),E.Adde(b,a);
for(rint i=1;i<=N;i++) read(s[i]),now[i]=s[i];
deep[1]=1; dfs(1);
for(rint i=1,type,x,y;i<=Qnt;i++){
read(type),read(x),read(y);
if(type){
if(bel[x]>bel[y]) swap(x,y);
++q; Q[q]=(Query){x,y,t,q};
}
else ++t,C[t]=(Change){x,y,now[x]},now[x]=y;
}
sort(Q+1,Q+q+1);
nowU=nowV=1;nowT=0;
for(rint i=1;i<=q;i++){
while(nowT<Q[i].t) nowT++,dotime(C[nowT].p,C[nowT].nc);
while(nowT>Q[i].t) dotime(C[nowT].p,C[nowT].oc),nowT--;
trans(nowU,Q[i].u);
trans(nowV,Q[i].v);
nowU=Q[i].u; nowV=Q[i].v; lca=LCA(Q[i].u,Q[i].v);
modify(lca); ANS[Q[i].id]=ans; modify(lca);
}
for(int i=1;i<=q;i++) printf("%lld\n",ANS[i]);
return 0;
}
●UOJ58 [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 ...
- COGS1817. [WC2013]糖果公园
1817. [WC2013]糖果公园 ★★★☆ 输入文件:park.in 输出文件:park.out 简单对比时间限制:8 s 内存限制:512 MB [题目描述] Candyland ...
- 【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 ...
随机推荐
- 第七周PTA作业
第一题: #include<stdio.h> int main() { ; ; ){ sum=sum+i; i++; } printf("sum = %d\n",sum ...
- 第1次作业:这是我的一个响亮的标题X!
1.我是回答问题的部分 part 1: 从小学开始,我就觉得写作文是一件很痛苦的事情.(痛苦ing) 所以呢,选择工科好像就是理所当然的. 至于为什么选择计算机,主要原因就是不知道应该选什么,正好看到 ...
- 敏捷冲刺每日报告--day2
1 团队介绍 团队组成: PM:齐爽爽(258) 小组成员:马帅(248),何健(267),蔡凯峰(285) Git链接:https://github.com/WHUSE2017/C-team ...
- org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be res
解决:web项目出现如上问题,据查是版本问题: JSTL 1.0 的声明是: <%@ taglib prefix="c" uri="http://java.sun. ...
- 利用yield 实现Xrange功能
def xrange(n): start = 0 while True: if start>n: return yield start start+=1 obj = xrange(5) n1 = ...
- 【bug清除】Surface Pro系列使用Drawboard PDF出现手写偏移、卡顿、延迟现象的解决方式
最近自己新买的New Surface Pro在使用Drawboard PDF时,出现了性能问题,即笔迹延迟偏移,卡顿的问题. 排查驱动问题之后,确认解决方案如下: 将Surface的电池调到性能模式, ...
- zookeeper 入门系列-理论基础 – zab 协议
上一章讨论了paxos算法,把paxos推到一个很高的位置.但是,paxos有没有什么问题呢?实际上,paxos还是有其自身的缺点的: 1. 活锁问题.在base-paxos算法中,不存在leader ...
- [phpvia/via] PHP多进程服务器模型中的惊群
[ 概述 ] 典型的多进程服务器模型是这样的,主进程绑定ip,监听port,fork几个子进程,子进程安装信号处理器,随后轮询资源描述符检查是否可读可写: 子进程的轮询又涉及到 IO复用,accept ...
- js控制表格实时编辑
点击添加,在表格的最后一行添加一行表单元素,右侧按钮变为保存和取消.(点击保存,数据用ajax无刷新添加到界面,点击取消,取消此行的添加.)点击编辑,在本行改为表单,带有原来的值,右侧按钮变为确认和取 ...
- linux下的Shell编程(3)shell里的流程控制
if 语句 if 表达式如果条件命令组为真,则执行 then 后的部分.标准形式: if 判断命令,可以有很多个,真假取最后的返回值 then 如果前述为真做什么 [ # 方括号代表可选,别真打进去了 ...